beanFactory.ignoreDependencyInterface代码测试和理解

58 篇文章 0 订阅
12 篇文章 0 订阅

文件结构

定义一个注入接口,A实现该接口,并依赖B,C类

 

 

junit测试

xml配置开启注解扫描

此时运行结果,A中都使用@Autowire注入,自然是b和c都有值

将A中b和c的@Autowire都去掉,结果想当然b和c都为null

         

 

以上是在类中使用注解进行注入,不使用注解还可以在Xml文件中配置default-autowire

不管设置为byName还是byType,都是在bean实例化后根据属性名或类型从容器中找符合的,调用bean的setter方法注入到bean实例中

再引入ignoreDependencyInterface进行测试

所以看出ignoreDependencyInterface使得自动装配时忽略该接口实现类中的setter方法

注意:ignoreDependencyInterface并不影响构造器注入,给A中类新增构造方法,把上图AwareTest注释全放开,结果是b和c都注入了

 

示例ApplicationContextAware接口

spring容器初始化源码分析中可以见到有一行

 beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

使得我们的ApplicationContextAware接口实现类在自动装配时不能被注入ApplicationContext对象的依赖,而统一由框架设置依赖,ApplicationContextAware接口的设置会在ApplicationContextAwareProcessor类中完成。

    private void invokeAwareInterfaces(Object bean) {
         // 。。。忽略其他代码

        if (bean instanceof ApplicationContextAware) {
            ((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
        }

    }

至于为什么要这样后置处理器中再进行set而不是自动注入,我想是通过这种方式保证了ApplicationContextAware中最后的容器就是预期的applicationContext,认为自动注入不管是setter还是构造器注入的都不靠谱,必须得自己最终亲手设置。

 

遗留问题:beans的default-autowire属性解析和使用,没在源码里找到

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值