• Spring 的@@Autowired 和 @Qualifier注释


    @Autowired

    spring2.1中允许用户通过@Autowired注解对Bean的属性变量.属性Setter方法以及构造方法进行标注,配合AutowiredAnnotationBeanProcessor完成Bean的自动配置。使用@Autowired注释进行byType注入。

    为什么要引入@Autowired?因为通过 @Autowired的使用可以消除在xml中 set ,get方法的相关配置。也即是不用在xml进行相关的配置了。

    1)当@Autowired使用在Bean的属性变量上时

    public class TextEditor {
    
        @Autowired
        private SpellChecker spellChecker;
    
        public TextEditor() {
            System.out.println("在TextEditor的构造方法中");
        }
    
        public SpellChecker getSpellChecker() {
            return spellChecker;
        }
    }

    如上代码,在TextEditor这个bean中对SepllChecker这个bean的属性变量使用了@Autowired注释,当扫描到TextEditor这个bean时会自动把SpellChecker这个bean注入进来。

    2)当@Autowired注释使用在属性Setter方法上时:

    @Autowired
        public void setSpellChecker(SpellChecker spellChecker) {
            this.spellChecker = spellChecker;
        }

    将 @Autowired 注释标注在 Setter 方法上,此时Setter的参数是某个Bean,当扫描到@AutoWired的时候就会将入参的Bean(SpellChecker)注入进来。

    3)当@Autowired注释使用在构造方法上时:

     @Autowired
       public TextEditor(SpellChecker spellChecker){
          System.out.println("Inside TextEditor constructor." );
          this.spellChecker = spellChecker;
       }

    扫描到@AutoWired的时候就直接来看构造方法里面的入参是哪些bean,然后将对应的bean注入进来。

    你知道,@Autowired to autowire(or search) by-type

    但是当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false) ,这等于告诉 Spring:在找不到匹配 Bean 时也不报错。

    @Qualifier 注释

    上面的@Autowired注释是根据bean的类型起作用的,但是,如果出现了两个或者多个bean属于同一种类型,只用@Autowired就会出错,因为,它不知道你想注入的是哪个bean。此时就要引入@Qualifier注释加以区分

    先看以下代码:

    Student.java

    package com.how2java.w3cschool.qualifier;
    
    public class Student {
        private Integer age;
        private String name;
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }

    Profile.java

    package com.how2java.w3cschool.qualifier;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    
    public class Profile {
        
        @Autowired
        @Qualifier("student1")
        private Student student;
    
        public Profile() {
            System.out.println("这是在Profile的构造方法中");
        }
    
        public void printAge() {
            System.out.println("Age:" + student.getAge());
        }
    
        public void printName() {
            System.out.println("Name:" + student.getName());
        }
    }

    MainApp.java

    package com.how2java.w3cschool.qualifier;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MainApp {
    
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("beanqualifier.xml");
            Profile profile = (Profile)context.getBean("profile");
            profile.printName();
            profile.printAge();
    
        }
    
    }

    xml配置文件

    <?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:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        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/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-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.how2java.w3cschool.qualifier.Profile">
        </bean>
    
        <bean id="student1"
            class="com.how2java.w3cschool.qualifier.Student">
            <property name="name" value="章鱼哥" />
            <property name="age" value="11" />
        </bean>
    
        <bean id="student2"
            class="com.how2java.w3cschool.qualifier.Student">
            <property name="name" value="海绵宝宝" />
            <property name="age" value="5" />
        </bean>
    
    </beans>

    你看,上面的xml文件中,是不是有两个bean student1和student2,它们属于同一类的?那么,此时如果使用@Autowired的话,就不知道用student1还是student2了,就要引入

    @Autowired
    @Qualifier("student1") private Student student;

    加以区分!

    因此可以看到

    @Qualifier to autowire(or search) by-name

    You can use @Qualifier along with @Autowired. In fact spring will ask you explicitly select the bean if ambiguous bean type are found, in which case you should provide the qualifier ”(stack overflow

    上述例子源于:W3Cschool,在此作记录

    部分理解可能有误或者不到位,希望大家看到后可以不吝赐教(抱拳了)

  • 相关阅读:
    用MFC(C++)实现拼音搜索
    MFC里ON_COMMAND_RANGE消息映射的ID问题
    01:MFC应用程序编程
    MFC笔记(DN)
    linuxmint系统定制与配置(2)-输入法
    linuxmint系统定制与配置(3)-字体
    linuxmint系统定制与配置(1)-系统初始配置
    笔记-读官方Git教程(2)~安装与配置
    笔记-读官方Git教程(1)~认识Git
    Python中多层List展平为一层
  • 原文地址:https://www.cnblogs.com/Guhongying/p/10600430.html
Copyright © 2020-2023  润新知