这篇帖子也有好几年了,不知道作者还关不关注。(评论也是思考,勿抄)
想特别指出的与本文标题无关,而是作者写的“自动装配的坑”这里。
因为这不是坑,这只是不了解;而且看评论有的也测试了这部分并发出了疑问,我感觉问出来的问题就不是很对,偏了,想说明一下。
大概过程:
1.在第一个xml配置文件里,作者开启了注解处理,即context:annotation-config标签,然后在ListHolder类中的属性上标出了@Autowired注解。这个部分的源码体现在:
1)在AbstractAutowireCapableBeanFactory#createBean方法里调用了applyMergedBeanDefinitionPostProcessors,这里涉及了@PostConstruct、@Destroy、@Autowired、@Value、@Resource等注解的解析。关于@Autowired的关键类是AutowiredAnnotationBeanPostProcessor,关键方法是postProcessMergedBeanDefinition。
(关于BeanPostProcessor及其子接口,以及各接口方法调用时机可自行参考其他资料)
2.在后来bean的属性填充阶段(即populateBean方法中),会再次调用BeanPostProcessor的postProcessProperties方法,这里AutowiredAnnotationBeanPostProcessor#postProcessProperties方法会将前面步骤中解析出的相关字段、方法等一一取出来做解析注入,详细可看源码,很清楚。
3.在步骤1里,是对所有属性和方法进行解析,并不会看ignoreXXX,所以怎么设置,步骤2都不会影响注入。
上面是对autowired的解释。
------------------------------------------------------------------------------------------------
下面是对配置文件中autowire的解释:
作者的第二个例子里,说的是自己写的一种正确的方式,没错,写的正确,但我觉得配文欠妥。
1.<beans>作为最外层的根标签,它的default-autowire标签是一种默认行为,即该xml配置文件中的所有bean标签都将遵循由default-autowire指定的autowire model。
而,默认的,在不配置default-autowire和<bean>标签的autowire属性时,<bean>标签的autowire默认为NO,即不装配。例子中只是给所有的bean都指定了一种装配方式而已。所以例子正确,但是理解上不对,希望更正。“发现英语中的autowiring特定指的是通过beans标签default-autowire属性来依赖注入的方式,而不是指使用@Autowired注解进行的依赖注入”。你不能说特指default-autowire,也不能就把@Autowired给除开了...
最后,有个需要注意的点,也很重要,就是自动装配的顺序。
1.BeanPostProcessor#postProcessAfterInstatiation
2.如果指定了autowire,则执行autowireByName或者autowireByType
3.BeanPostProcessor#postProcessProperties,这里有@Autowired注解的解析
4.applyPropertyValues在配置文件中我们会通过<property>标签指定属性,在这里会有处理
步骤2例在进行autowire时,也是将解析好的属性值放入了一个叫PropertyValues的对象里的,此时还没有进行真正的属性赋值,等到步骤4才会应用这些值。在步骤4执行的时候,会覆盖步骤3里已经通过@Autowired注解进行注入的值。
打开BeanFactory ignoreDependencyInterface方法的正确姿势在阅读Spring容器扩展部分源码的过程中,我了解到BeanFactory接口中有个方法叫ignoreDependencyInterface。从官方文档的“字面”来看,其作用...