今天刚开始跟着《Spirng源码深度解析》这本书看源码,看到ignoreDependencyInterface方法就有点疑问,书里面就简单的说了一下,一开始页没理解作者的意思,原文如下:
public AbstractAutowireCapableBeanFactory() {
super();
ignoreDependencyInterface(BeanNameAware.class);
ignoreDependencyInterface(BeanFactoryAware.class);
ignoreDependencyInterface(BeanClassLoaderAware.class);
}
然后就开始百度了,还好,有大神深入研究并写了博客。看了他的文章之后就顺了。。本来打算随便看看的,但看了他的文章,他为了这个问题研究了若干小时。。觉得看源码还是不要随便看看。。
记录一下自己的理解:
interface A {
public void setB(B b);
}
class SonOfA implements A{
private B b;
public void setB(B b){
this.b = b;
}
public void setC(C c){
//.....
}
}
ignoreDependencyInterface(A.class)的作用是:让spring忽略实现了A的子类---SonOfA的setB方法的自动注入。其中SonOfA有两个setter方法,setB是在A接口中定义的,setC没在A中定义,spring会忽略setB的自动注入,但还是会识别setC,然后自动注入。
这样的话,setB的就不会被spring识别注入了,用户就可以定义bean后置处理器,自己专门对A及其子类的实例进行setB的调用。
spring的Aware就是这样的实现原理,可以参考ApplicationContextAwareProcessor的invokeAwareInterfaces方法。里面得Aware在一开始就都被调用过ignoreDependencyInterface进行忽略。
如下这样的注入才会被忽略:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="byType">
<bean id="testBean" autowire="byType" class="com.mine.bean.TestBean"/>
</beans>
如果是用注解,比如@Autowired之类的,又或者直接在bean标签中使用property标签注入的,这种是不会被ignoreDependencyInterface方法影响的。注意这个坑。
Comments