Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】
自动装配
1、歧义性
我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器中注册了,要怎么去区分对哪一个Bean进行注入呢?
如下情况,若用@Autowired的方式按类型注入,IOC容器就不知道应该注入哪个了:
<bean name="source1" class="pojo.Source">
<property name="fruit" value="橙子"/>
<property name="sugar" value="多糖"/>
<property name="size" value="超大杯"/>
</bean>
<bean name="source2" class="pojo.Source">
<property name="fruit" value="橙子"/>
<property name="sugar" value="少糖"/>
<property name="size" value="小杯"/>
</bean>
Spring对这种情况提供了2个注解进行解决:
@Primary 注解
定义:代表首要的,当 Spring IoC 检测到有多个相同类型的 Bean 资源的时候,会优先注入使用该注解的类。
问题:该注解只是解决了首要的问题,但是并没有选择性的问题。
@Qualifier 注解
定义:此注解可以让Spring使用name的方式进行Bean的装配以及注入
/* 包名和import */
public class JuiceMaker {
......
@Autowired
@Qualifier("source1")//指定注入名称为 "source1" 的 Bean 资源
public void setSource(Source source) {
this.source = source;
}
}
2、使用@Bean 装配 Bean
基础用法
定义:@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。
用法:标识这个方法可以产生一个Bean并且交给Spring容器管理,告诉Spring可以在这个方法中拿到一个Bean。
PS:添加的bean的id为方法名
@Configuration
public class AppConfig { @Bean//用@Bean注解配置Bean时,bean的ID默认为方法的名称
public TransferService transferService() {
return new TransferServiceImpl();
} }
上面的代码等同于
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
bean的依赖
@bean 也可以依赖其他任意数量的bean,如果TransferService 依赖 AccountRepository,我们可以通过方法参数实现这个依赖。
@Configuration
public class AppConfig { @Bean
public TransferService transferService(AccountRepository accountRepository) {//PS:此方法的入参就是返回值所依赖的对象
return new TransferServiceImpl(accountRepository);
} }
3、Bean的作用域
可以通过 @Scope 注解或者 <bean> 元素中的 scope 属性来设置Bean的作用域

4、Spring 表达式
一个例子简单了解下:
package pojo; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component("elBean")
public class ElBean {
// 通过 beanName 获取 bean,然后注入role这个对象
@Value("#{role}")
private Role role; // 获取 bean 的属性 id,并注入给id这个变量
@Value("#{role.id}")
private Long id; // 调用 bean 的 getNote 方法,并注入给note这个变量
@Value("#{role.getNote().toString()}")
private String note;
/* getter and setter */
}
小结:
@Value("#{}") 表示SpEl表达式,通常用来获取bean的属性,或者调用bean的某个方法,或者常量注入。
PS:简要的说,就是通过@Value这个注解注入对象或者属性给相应的变量(简单的理解为赋值操作)。
参考资料:
Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】的更多相关文章
- (转)spring学习之@ModelAttribute运用详解
@ModelAttribute使用详解 1 @ModelAttribute注释方法 例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法执行前被 ...
- spring学习之@ModelAttribute运用详解
@ModelAttribute使用详解 1.@ModelAttribute注释方法 例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法 ...
- [转载]springmvc学习之@ModelAttribute运用详解
spring学习之@ModelAttribute运用详解 链接
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!
点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...
- Spring Boot Actuator监控使用详解
在企业级应用中,学习了如何进行SpringBoot应用的功能开发,以及如何写单元测试.集成测试等还是不够的.在实际的软件开发中还需要:应用程序的监控和管理.SpringBoot的Actuator模块实 ...
- Spring Boot 之使用 Json 详解
Spring Boot 之使用 Json 详解 简介 Spring Boot 支持的 Json 库 Spring Web 中的序列化.反序列化 指定类的 Json 序列化.反序列化 @JsonTest ...
- ISO七层模型详解
ISO七层模型详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我刚刚接触运维这个行业的时候,去面试时总是会做一些面试题,笔试题就是看一个运维工程师的专业技能的掌握情况,这个很 ...
- Linux学习之用户配置文件详解(十四)
Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...
随机推荐
- 第7篇 Scrum 冲刺博客
1.站立会议 照骗 进度 成员 昨日完成任务 今日计划任务 遇到的困难 钟智锋 确定客户端和服务器通信的形式 重新设计项目执行流程 庄诗楷 编写UI的基本图形和响应 编写客户端UI 易德康 马,车,炮 ...
- openCV - 2. 矩阵的掩膜操作
获取图像像素指针.掩膜操作解释 获取图像像素指针 CV_Assert(myImage.depth() == CV_8U); Mat.ptr<uchar>(int i=0) 获取像素矩阵的指 ...
- 能卖课 会带货的CRMEB知识付费系统v1.30来了
CRMEB知识付费系统是众邦科技在疫情肆虐,国家危难时开源发布的一款产品,它的诞生是众邦人爱国情怀的一次释放,更是众邦人用技术为人们带来美好生活的一次有效实践. 知识付费系统从2020年3月发布v1. ...
- 移动开发中如何整合HTML 5和原生代码
移动开发中如何整合HTML 5和原生代码 https://blog.csdn.net/lvjin110/article/details/41038565
- HDU - 1005 -Number Sequence(矩阵快速幂系数变式)
A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ...
- 小程序开发-组件navigator导航篇
navigator 页面链接 navigator的open-type属性 可选值 navigate.redirect.switchTab,对应于wx.navigateTo.wx.redirectTo. ...
- Java面试题(1):详解int与Integer
Java面试题(1):详解int与Integer int与Integer的区别 int是Java的基本数据类型之一,Integer是int的包装类 int直接再内存中储存值,Integer进行new操 ...
- myeclipse前端界面乱码
框起来的值默认的格式是ISO-8859-1,改为UTF-8
- 启动Tomcat服务器端口被占用解决方法
Caused by: java.net.BindException: Address already in use: bind 1.输入 netstat -ano|findstr 8080,回车,显示 ...
- Java得到指定日期的时间
//得到指定日期(几天前/几天后)整数往后推,负数往前移动private Date getAppointDay(int num) throws ParseException { DateFormat ...