第一个青春是上帝给的
第二个的青春是靠自己努力的。

在开发项目过程中开发者们可能会遇到这样的问题

@autowired自动装配模式的工作模式是:在springIOC定位所有的Bean后,这个字段需要按照类型注入,这样IOC容器就会寻找资源,然后将其注入。

1,继承关系注入

这时候需要注入的是子类,自动装配到父类
例如solr的过程
solr搜索需要创建一个SolrServer对象用来创建一个连接,实现的是SolrServer的子类HttpSolrServer

//创建一个SolrServer对象,创建一个连接。参数solr服务的url
SolrServer solrServer = new HttpSolrServer("http://119.23.43.244:8080/solr/collection1");

每一步都需要创建的话比较繁琐,并且系统开销大,这时候就可以交给spring容器管理

<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
	<constructor-arg index="0" value="http://119.23.43.244:8080/solr/collection1"/>
</bean>

交给spring容器管理之后我们就可以直接调用了,使用自动装配

@Autowired
private SolrServer solrServer;

在这里插入图片描述
自动装配SolrServer,spring会在容器中找这个类型,然后将HttpSolrServer注入到SolrServer中。
java中子类可以转换成父类的类型,父类不可以转换成子类的类型。因此在spring中子类是可以注入父类中的。
注意的是spring容器中只能配置一个子类,多了的话就不能使用自动装配了,spring就迷茫了,不知道把哪个实现类交给父类,抛出异常

2,接口实现关系注入

spring容器中注入2个同一接口的不用实现类也不能使用@autowired自动装配,因为springIOC容器会犯糊涂,无法判断把哪个对象注入进来,于是就会抛出异常,

注入失败。这时候需要使用2个注解,消除自动装配的歧义性

2.1,使用@primary注解

注解@primary代表首要的,放到接口实现类的上面,代表如果产生自动装配歧义性的话,优先使用我进行注入。
只能解决首要性的问题,不能解决选择性的问题。

2.2,使用@Qualifier注解

这个注解的原理是:采用按照名称查找,而不是类型,这样无论如何也不会产生歧义性,Spring容器最底层的接口BeanFactory就定义了这样的方法。
首先给实现类设置别名

//首先给实现类设置别名
@component("roleService3")
public class RoleServiceImpl3 implements ROleService{}
//采用自动装配
@autowired
@Qualifier("roleService3")
private RoleService roleService=null;

IOC容器的底层接口—BeanFactory,它所定义的方法就是

Object getBean(String name) throws BeanException;

使用@Qualifier注解后就可以使用这个方法用过名称从IOC容器中获取对象进行注入。

文章持续更新,可以微信搜索「 绅堂Style 」第一时间阅读,回复【资料】有我准备的面试题笔记。
GitHub https://github.com/dtt11111/Nodes 有总结面试完整考点、资料以及我的系列文章。欢迎Star。
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐