@Autowired 凝视遇到的问题,@Qualifier 帮助解决这个问题
在默认情况下使用 @Autowired 凝视进行自己主动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。
当找不到一个匹配的 Bean 时,Spring 容器将抛出BeanCreationException 异常。并指出必须至少拥有一个匹配的
Bean。我们能够来做一个实验:
<?xml version="1.0" encoding="UTF-8" ? > |
因为 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; |
当然,普通情况下,使用 @Autowired 的地方都是须要注入 Bean 的。使用了自己主动注入而又同意不注入的情况一般仅会在开发期或測试期碰到(如为了高速启动 Spring 容器,仅引入一些模块的 Spring 配置文件)。所以@Autowired(required 会非常少用到。
= false)
和找不到一个类型匹配 Bean 相反的一个错误是:假设 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。来看以下的样例:
清单 12. 在 beans.xml 中配置两个 Office 类型的 Bean
… |
我们在 Spring 容器中配置了两个类型为 Office 类型的 Bean。当对 Boss 的office 成员变量进行自己主动注入时,Spring 容器将无法确定究竟要用哪一个 Bean,因此异常发生了。
Spring 同意我们通过 @Qualifier 凝视指定注入 Bean 的名称,这样歧义就消除了,能够通过以下的方法解决异常:
清单 13. 使用 @Qualifier 凝视指定注入 Bean 的名称
@Autowired |
@Qualifier("office") 中的office 是 Bean 的名称,所以@Autowired 和@Qualifier 结合使用时,自己主动注入的策略就从
byType 转变成 byName 了。@Autowired 能够对成员变量、方法以及构造函数进行凝视,而@Qualifier 的标注对象是成员变量、方法入參、构造函数入參。
正是因为凝视对象的不同,所以 Spring 不将@Autowired 和@Qualifier 统一成一个凝视类。以下是对成员变量和构造函数入參进行凝视的代码:
对成员变量进行凝视:
public class Boss {
|
对构造函数入參进行凝视:
清单 15. 对构造函数变量使用 @Qualifier 凝视
public class Boss {
|
@Qualifier 仅仅能和@Autowired 结合使用。是对@Autowired 故意的补充。一般来讲。@Qualifier 对方法签名中入參进行凝视会减少代码的可读性,而对成员变量凝视则相对好一些。
@Autowired 凝视遇到的问题,@Qualifier 帮助解决这个问题的更多相关文章
- 从头认识Spring-2.3 注解装配-@autowired(5)-限定器@Qualifier(1)
这一章节我们来具体讨论一下配合@autowired一起使用的限定器@Qualifier. 1.domain(重点) 蛋糕类: package com.raylee.my_new_spring.my_n ...
- spring的@primary和@qualifier注解解决一个接口多个实现的注入问题
Spring中提供了@Primary和@Qualifier注解来解决一个接口多个实现的注入问题. @Primary注解 Spring中有提供一个@Primary注解,具体的作用是在一个接口有多个实现类 ...
- listener中@Autowired无法注入bean的一种解决方法
背景:使用监听器处理业务,需要使用自己的service方法: 错误:使用@Autowired注入service对象,最终得到的为null: 原因:listener.fitter都不是Spring容器管 ...
- IDEA spirng boot @Autowired注解 mapper出现红色下划线解决方法
如图所示,解决方法为: 把勾去掉即可.
- @Resource、@Autowired、@Qualifier的注解注入及区别
在Java代码中可以使用 @Resource 或者 @Autowired 注解方式来进行注入. 虽然 @Resource 和 @Autowried 都可以完成依赖注入,但是他们是有区别的. 一: @ ...
- Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@Pos ...
- Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的
本文介绍了使用spring注解注入属性的方法. 使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@Po ...
- @Autowired @Resource @Qualifier的区别
参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...
- Spring Boot + Netty 中 @Autowired, @Value 为空解决
问题描述 使用 Spring Boot + Netty 新建项目时 Handler 中的 @Autowired, @Value 注解的始终为空值 解决方法 @Component // 1. 添加 @C ...
随机推荐
- 基于Websocket的火拼俄罗斯(基础)
传统的HTTP请求是由浏览器发起,然后呢服务端接收到请求之后呢返回一个数据.那么这样一次来回之后呢请求就断了.但是WebSocket它不一样,它同样是由浏览器去发起一个请求但是这个请求是一个WebSo ...
- Java图片的压缩
1.如果在springMvc中,会自带生成MultipartFile文件,将MultipartFile转化为File MultipartFile file1 = file; CommonsMultip ...
- 详解DevExpress.LookUpEdit控件实现自动搜索定位功能(转)
转载自csdn博客 爱拼才会赢 的博客 地址是详解DevExpress.LookUpEdit控件实现自动搜索定位功能(转)
- Struts2的学习链接
---- Struts2的学习途径 (downpour) http://www.iteye.com/wiki/struts2/1306-struts2-way-of-learning ---- Str ...
- 工厂方法模式(Product)C++实现
意图:定义一个用于创建对象的接口,让子类觉定实例化哪一个类. 适用性:1.一个类不知道它必须创建的对象的时候. 2.一个类希望由它的子类指定它所创建的对象的时候. 3.当类将创建对象的职责委托给多个帮 ...
- udacity_javascript设计模式
javascript设计模式 的学习记录 在优达学城上找到的 <javascript设计模式> 他主要是带动我们的思考 在 <第二章 分离重构> 中使用了 model octo ...
- javascript中五句话
1.弹出框 ,小括号中就是弹出的内容 alert("我是一个弹出框"); 2.控制台输出 小括号里面就是 控制台输出的东西 console.log("我是控制台输出的 ...
- 应用Struts2框架,开发一个加法器,采用两个页面,一个页面输入数据,另一个界面输出结果。
软件152谭智馗 一.新建maven项目 1.选择菜单file—new—maven project,勾选“Create a &simple project (skip archetype se ...
- (转)基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据
http://www.cnblogs.com/wuhuacong/p/3669708.html 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开 ...
- 将数据库返回的ResultSett转换成List装Map形式的方法(ResultSetToList)
多时候想做一些关于数据库实验,如果先搭建框架太麻烦,直接得到ResultSet处理起来取值什么的也很繁琐,为此我做了一个将ResultSet转换成List<Map<String,Objec ...