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学习笔记(23)基于tx/aop配置切面增强事务
- 【Spring】Spring注解之@EnableConfigurationProperties
- ssh(Spring+Spring mvc+hibernate)——BaseDaoImpl.java
- 使用spring实现邮件的发送(含测试,源码,注释)
- spring: 在Spring应用中使用JDBC(使用profiles选择数据源/使用基于JDBC驱动的数据源)
- Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)------转帖
- Spring中使用RedisTemplate操作Redis(spring-data-redis)
- 20-spring学习-Spring MVC基本操作
- spring MVC 使用注解返回json
- spring 学习3-Spring AOP
- 事务,Oracle,MySQL及Spring事务隔离级别
- 深入理解Spring Redis的使用 (八)、Spring Redis实现 注解 自动缓存
- 深入理解Spring Redis的使用 (五)、常见问题汇总
- [Spring学习笔记 3 ] spring 注解详解,完全注解,常用注解
- [Java Spring Data] JPA Example with unit test
- Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
- Spring声明式事务管理
- Spring Boot应用的健康监控
- 为什么Spring Boot推荐使用logback-spring.xml来替代logback.xml来配置logback日志的问题分析
- Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis
- 如何使用Spring Cloud搭建高可用的Elasticsearch集群?详解Elasticsearch的安装与配置及Spring Boot集成的实现
- 【Spring】Spring是什么?
- Spring MVC 执行过程原理(请求映射原理、参数处理原理、返回值处理器)
- 005-spring cache-原理、缓存AOP机制、Spring Cache抽象集成机制、springboot自动配置机制
- 005-spring-data-elasticsearch 3.0.0.0使用【三】-spring-data之Spring数据扩展
- 009-Spring Boot 事件监听、监听器配置与方式、spring、Spring boot内置事件
- java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)