@Autowired 注释遇到的问题,@Qualifier 帮助解决问题
来源:互联网 发布:如何关闭网络唤醒 编辑:程序博客网 时间:2024/06/05 10:26
当候选 Bean 数目不为 1 时的应对方法
在默认情况下使用 @Autowired
注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出BeanCreationException
异常,并指出必须至少拥有一个匹配的 Bean。我们可以来做一个实验:
清单 10. 候选 Bean 数目为 0 时
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd "> <bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor"/> <bean id="boss" class="com.baobaotao.Boss"/> <!-- 将 office Bean 注释掉 --> <!-- <bean id="office" class="com.baobaotao.Office"> <property name="officeNo" value="001"/> </bean>--> <bean id="car" class="com.baobaotao.Car" scope="singleton"> <property name="brand" value=" 红旗 CA72"/> <property name="price" value="2000"/> </bean></beans>
由于 office
Bean 被注释掉了,所以 Spring 容器中将没有类型为Office
的 Bean 了,而 Boss 的office
属性标注了@Autowired
,当启动 Spring 容器时,异常就产生了。
当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用@Autowired(required = false)
,这等于告诉 Spring:在找不到匹配 Bean 时也不报错。来看一下具体的例子:
清单 11. 使用 @Autowired(required = false)
package com.baobaotao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Required;public class Boss { private Car car; private Office office; @Autowired public void setCar(Car car) { this.car = car; } @Autowired(required = false) public void setOffice(Office office) { this.office = office; } …}
当然,一般情况下,使用 @Autowired
的地方都是需要注入 Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件),所以@Autowired(required = false)
会很少用到。
和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException
异常。来看下面的例子:
清单 12. 在 beans.xml 中配置两个 Office 类型的 Bean
… <bean id="office" class="com.baobaotao.Office"> <property name="officeNo" value="001"/></bean><bean id="office2" class="com.baobaotao.Office"> <property name="officeNo" value="001"/></bean>…
我们在 Spring 容器中配置了两个类型为 Office
类型的 Bean,当对 Boss 的office
成员变量进行自动注入时,Spring 容器将无法确定到底要用哪一个 Bean,因此异常发生了。
Spring 允许我们通过 @Qualifier
注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常:
清单 13. 使用 @Qualifier 注释指定注入 Bean 的名称
@Autowiredpublic void setOffice(@Qualifier("office")Office office) { this.office = office;}
@Qualifier("office")
中的office
是 Bean 的名称,所以@Autowired
和@Qualifier
结合使用时,自动注入的策略就从 byType 转变成 byName 了。@Autowired
可以对成员变量、方法以及构造函数进行注释,而@Qualifier
的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同,所以 Spring 不将@Autowired
和@Qualifier
统一成一个注释类。下面是对成员变量和构造函数入参进行注释的代码:
对成员变量进行注释:
清单 14. 对成员变量使用 @Qualifier 注释
public class Boss { @Autowired private Car car; @Autowired @Qualifier("office") private Office office; …}
对构造函数入参进行注释:
清单 15. 对构造函数变量使用 @Qualifier 注释
public class Boss { private Car car; private Office office; @Autowired public Boss(Car car , @Qualifier("office")Office office){ this.car = car; this.office = office ; }}
@Qualifier
只能和@Autowired
结合使用,是对@Autowired
有益的补充。一般来讲,@Qualifier
对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。
- @Autowired 注释遇到的问题,@Qualifier 帮助解决问题
- @Autowired 注释遇到的问题,@Qualifier 帮助解决问题
- @Autowired 注释遇到的问题,@Qualifier 帮助解决问题
- Spring的注释@Autowired、@Qualifier使用说明
- @Autowired 注释与@Qualifier 注释
- @Autowired @Resource @Qualifier的区别
- @Autowired @Resource @Qualifier的区别
- SpringMVC注解@Autowired和@Qualifier 自动注入[根据类型注入] @Autowired 可以对成员变量、方法以及构造函数进行注释, @Qualifier 的
- Spring Autowired(required = false) 说明与@Qualifier 注释说明
- spring的注解使用,Autowired和Qualifier
- @Autowired、@Resource和@Qualifier的应用
- Spring Annotation -- @Autowired, @Qualifier
- spring @Autowired @Qualifier
- # @Resource @Autowired @Qualifier注解
- IOC_@Autowired@Qualifier
- @Autowired 和 @Qualifier
- Spring注解@Autowired、@Qualifier
- spring的Autowired,Qualifier注解介绍以及自动装配
- HP正则表达式后面接的/isU, /is, /s是什么意思?
- 新手安装Java开发工具图文教程
- 百度:P2P网络宣传渠道将重构,审查后将出台“黑白名单”
- php - final 关键字
- 纯真IP合并程序
- @Autowired 注释遇到的问题,@Qualifier 帮助解决问题
- Android内存优化总结
- AMD Mantle与Media SDK的异同
- 深度定制 UIButton 按钮
- 叶子华戒烟经历:如何才能让自己变得愿意说话
- C语言字符串函数大全
- Uninstall/Install/Startup OpenOffice on Centos for Document format conversion
- 项目开发流程
- java web项目利用Filter进行单点登录的简单实现(解决方案)