Spring容器父子类继承关系交给spring容器管理采用@autowired自动装配分析
Spring容器父子类继承关系交给spring容器管理采用@autowired自动装配分析
第一个青春是上帝给的
第二个的青春是靠自己努力的。
在开发项目过程中开发者们可能会遇到这样的问题
@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。
更多推荐
所有评论(0)