BeanFactory ignoreDependencyInterface方法

今天刚开始跟着《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方法影响的。注意这个坑。

end

Comments

留言