目录
5、此时运行结果,A中都使用@Autowire注入,自然是b和c都有值
6、将A中b和c的@Autowire都去掉,结果想当然b和c都为null
7、再引入ignoreDependencyInterface进行测试
1、文件结构
2、定义一个注入接口,A实现该接口,并依赖B,C类
3、junit测试
4、xml配置开启注解扫描
5、此时运行结果,A中都使用@Autowire注入,自然是b和c都有值
6、将A中b和c的@Autowire都去掉,结果想当然b和c都为null
以上是在类中使用注解进行注入,不使用注解还可以在Xml文件中配置default-autowire。
不管设置为byName还是byType,都是在bean实例化后根据属性名或类型从容器中找符合的,调用bean的setter方法注入到bean实例中
7、再引入ignoreDependencyInterface进行测试
所以看出ignoreDependencyInterface使得自动装配时忽略该接口实现类中的setter方法
注意:ignoreDependencyInterface并不影响构造器注入,给A中类新增构造方法,把上图AwareTest注释全放开,结果是b和c都注入了
8、示例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还是构造器注入的都不靠谱,必须得自己最终亲手设置。