Spring 的@@Autowired 和 @Qualifier注释

本文内容纲要: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,在此作记录

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

本文内容总结:Spring 的@@Autowired 和 @Qualifier注释

原文链接:https://www.cnblogs.com/Guhongying/p/10600430.html

以上是 Spring 的@@Autowired 和 @Qualifier注释 的全部内容, 来源链接: utcz.com/z/296339.html

回到顶部