• [Spring]@Autowired,@Required,@Qualifier注解


    @Required注解

    @Required注解用于setter方法,表明这个属性是必要的,不可少的,必须注入值

    假设有个测试类,里面有name和password两个属性

    我给两个属性的setter方法都加了@Required注解

    package com.example.demo1.Implements;
    
    import com.example.demo1.Interface.UserService;
    import org.springframework.beans.factory.annotation.Required;
    
    public class UserClientImpl implements UserService {
    
        private String name;
        private String password;
    
        public UserClientImpl(){}
    
        public UserClientImpl(String name,String password){
            this.name = name;
            this.password = password;
        }
    
        public String getName() {
            return name;
        }
    
        @Required
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        @Required
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public void save() {
            System.out.println("客户端保存信息"+name+"--"+password);
        }
    }

    现在我只给一个属性加注入,另一个不加

    可以看到报错

    然后我补上注入之后就没问题了

    @Autowoired注解

     其实看名字就可以看出来,这个是跟自动装填有关

    使用它需要加一行代码

    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcess></bean>

    1,在属性前加此注解

    先给定两个类

    package com.example.demo1.Other;
    
    public class CustomerTest {
        public CustomerTest(){
            System.out.println("在Customer.构造方法中...");
        }
        public void show(){
            System.out.println("在Customer.show方法中...");
        }
    }
    package com.example.demo1.Implements;
    
    import com.example.demo1.Interface.Customer;
    import com.example.demo1.Other.CustomerTest;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class CustomerImpl implements Customer {
    
    
        private String name;
        private String id;
        @Autowired
        private CustomerTest customerTest;
    
        public CustomerTest getCustomerTest() {
            return customerTest;
        }
    
        public void setCustomerTest(CustomerTest customerTest) {
            this.customerTest = customerTest;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
    
        @Override
        public void show() {
            System.out.println(id+"..."+name);
            customerTest.show();
        }
    }

    第二个类在第三个成员变量前面加个此注解

    然后applicationContext这样写

     <bean id="Customer"
              class="com.example.demo1.Implements.CustomerImpl">
        </bean>
        <bean id="CustomerTest" class="com.example.demo1.Other.CustomerTest"></bean>

    在打印一下结果

    ApplicationContext instance = new ClassPathXmlApplicationContext("applicationContext.xml");
            CustomerImpl customer = (CustomerImpl) instance.getBean("Customer");
            customer.show();
            ((ClassPathXmlApplicationContext) instance).registerShutdownHook();

    可以看到Customer对象是自动装填了的

    2,在构造函数之前加此注解

    效果和上面是一样的,不演示了

    3,@Autowired(required=false)的作用

    这里跟之前的@Required的作用类似

    默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为。

    这里跟@Required的效果类似,不演示了

    @Qualifier注解

    在之前的学习注解的过程中,显然,用自动装配的时候,如果配置的bean是相同的类的生成的对象,会报错,于是为了解决这个问题,@Qualifier就出来了

    @Qualifier和@Autowired一起使用,在@Qualifier后面的括号里欲装配的bean的名称,就可以让Spring自动给我们装配合适的bean

    首先applicationContext.xml ,因为要用到context标签,需要用到aop.jar,所以在这之前记得引入Springframework-aop.jar,这个标签就像之前的注解一样,需要注册那几个Processor才能起作用

    <?xml version = "1.0" encoding="UTF-8" ?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
        <context:annotation-config/>
        <bean id="Profile" class="com.example.demo1.Testclass.Profile"></bean>
    
        <bean id="student1" class="com.example.demo1.Testclass.Student">
            <property name="name" value="student1"></property>
            <property name="age" value="2"></property>
        </bean>
        <bean id="student2" class="com.example.demo1.Testclass.Student">
            <property name="age" value="3"></property>
            <property name="name" value="student2"></property>
        </bean>
    </beans>

    注解是放在要装配放属性的上方

    package com.example.demo1.Testclass;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    
    public class Profile {
        @Autowired
        @Qualifier(value = "student1")
        private Student student;
        public Profile(){
            System.out.println("Inside Profile constructor." );
        }
        public void setStudent(Student student) {
            this.student = student;
        }
    
        public void printAge() {
            System.out.println("Age : " + student.getAge() );
        }
        public void printName() {
            System.out.println("Name : " + student.getName() );
        }
    }
    package com.example.demo1.Testclass;
    
    public class Student {
        private Integer age;
        private String name;
        public void setAge(Integer age) {
            this.age = age;
        }
        public Integer getAge() {
            return age;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
    }

    之后Spring就会识别出合适的bean并注入了

    测试代码

    ApplicationContext instance = new ClassPathXmlApplicationContext("applicationContext.xml");
            Profile profile = (Profile) instance.getBean("Profile");
            profile.printName();
            ((ClassPathXmlApplicationContext) instance).registerShutdownHook();

    结果也正是这样

  • 相关阅读:
    layer 弹出在 iframe内部弹出不居中是原因
    关于 DropDownList 循环绑定中遇到的问题
    C# Oracle insert 过程中出现中文乱码问题
    使用C#实现sql server 2005 和Oracle 数据同步
    C# mysql 数据库操作模板
    spring jar 包详解、依赖说明
    在js中使用jstl标签给js变量赋值
    maven3 在创建web项目时:Dynamic Web Module 3.0 requires Java 1.6 or newer 错误
    hadoop start-all.sh 启动出错java.lang.ClassNotFoundException: start-all.sh
    jquery easyui datagrid 排序
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/9721525.html
Copyright © 2020-2023  润新知