自动装配

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】【自动装配的歧义解决】的更多相关文章

  1. (转)spring学习之@ModelAttribute运用详解

    @ModelAttribute使用详解 1 @ModelAttribute注释方法 例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法执行前被 ...

  2. spring学习之@ModelAttribute运用详解

    @ModelAttribute使用详解 1.@ModelAttribute注释方法     例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法 ...

  3. [转载]springmvc学习之@ModelAttribute运用详解

    spring学习之@ModelAttribute运用详解 链接

  4. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

  5. Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

    点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...

  6. Spring Boot Actuator监控使用详解

    在企业级应用中,学习了如何进行SpringBoot应用的功能开发,以及如何写单元测试.集成测试等还是不够的.在实际的软件开发中还需要:应用程序的监控和管理.SpringBoot的Actuator模块实 ...

  7. Spring Boot 之使用 Json 详解

    Spring Boot 之使用 Json 详解 简介 Spring Boot 支持的 Json 库 Spring Web 中的序列化.反序列化 指定类的 Json 序列化.反序列化 @JsonTest ...

  8. ISO七层模型详解

    ISO七层模型详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我刚刚接触运维这个行业的时候,去面试时总是会做一些面试题,笔试题就是看一个运维工程师的专业技能的掌握情况,这个很 ...

  9. Linux学习之用户配置文件详解(十四)

    Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...

随机推荐

  1. ceph osd跟cpu进行绑定

    通过cgroup将ceph-osd进程与某一个 CPU core 绑定脚本: mkdir -p /sys/fs/cgroup/cpuset/ceph # cup number : ,,, = - ec ...

  2. AI and Neuroscience: A virtuous circle

    转载:https://deepmind.com/blog/article/ai-and-neuroscience-virtuous-circle AI领域最近取得了显著进展.人工系统现在优于人类专家A ...

  3. Python1--简介及基础语法

    0. 简介 Python易于学习的编程语言,有很多现成的第三方库可以调用,不用重复造轮子,老话说:"人生苦短,我用 Python" 1. 安装Python Mac:brew ins ...

  4. Hadoop 3.x 与Hadoop 2.x 的区别和优化点

    Hadoop 3.x 与Hadoop 2.x 的区别和优化点 通用性 1.精简Hadoop内核,包括剔除过期的API和实现,将默认组件实现替换成最高效的实现(比如将FileOutputCommitte ...

  5. IDEA下Maven项目搭建踩坑记----3.最长的bug,最简单的错误。同一类中,部分函数的@AutoWired注入的对象失效

    这个错误绝对是我写到现在为止最傻X的一个错误,先上图 问题: 出了一个特别长的错误,大致的意思就是mapper.xml文件注入Dao层的时候失败. 解决: 查看一下错误的位置→ 找到Dao层 找到错误 ...

  6. vue-cli根据不同的命令自动切换不同环境地址

    前言 我们再使用vue脚手架开发项目时,不可避免的涉及到多个环境来回切换接口调用地址的问题,在开发环境中可能会通过 ip 来访问后台接口,但是当项目上线后就要把对用的接口地址换成生产环境的地址,肯定不 ...

  7. 前端修仙之路---一、如何用gulp搭建一套web前端开发框架

    引言 相信从事web前端开发的朋友都知道,现在流行的Vue.AngularJS等框架中,它们都有独立的脚手架来创建项目,比如Vue有vue-cli,Angular有angula-cli.脚手架可以一键 ...

  8. Python开发的入门教程(八)-迭代

    介绍 本文主要介绍Python中迭代的基本知识和使用 什么是迭代 在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Ite ...

  9. 双击Back退出应用 android中弹出吐司

    第一种方法: public void onBackPressed() { if (isState) { //isState初始值为true isState = false; Toast.makeTex ...

  10. Codeforces1250C Trip to Saint Petersburg 线段树

    题意 有个人要去圣彼得堡旅游,在圣彼得堡每天要花\(k\)块钱,然后在圣彼得堡有\(n\)个兼职工作\(l_i,r_i,p_i\),如果这个人在\(l_i\)到\(r_i\)这个时间段都在圣彼得堡,那 ...