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方法影响的。注意这个坑。

 

具体文章是:https://www.jianshu.com/p/3c7e0608ff1f

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值