Spring @Autowired、@Resource注入过程

  1. Spring启动时,会通过 ContextNamespaceHandler 加载一些 标签解析器,其中包括

    • AnnotationConfigBeanDefinitionParser,其会解析 annotation-config 标签,并注册一些关键的 PostProcessorCommonAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessor
    • ComponentScanBeanDefinitionParser,其会解析 component-scan 标签,扫描注册bean,然后将 bean 与 CommonAnnotationBeanPostProcessor/AutowiredAnnotationBeanPostProcessor关联起来
  2. 在实例化 某个bean 之后,会

    • 调用 CommonAnnotationBeanPostProcessorpostProcessMergedBeanDefinition 方法,该方法会扫描该bean属性上是否有 @Resource 注解,并记录下来
    • 调用 AutowiredAnnotationBeanPostProcessorpostProcessMergedBeanDefinition 方法,该方法会扫描该bean属性上是否有 @Autowired@Value 注解,并记录下来
    Spring bean的创建过程中,有哪些挂载点及其时间点,可以参考笔者的另一篇文章:Spring中那些PostProcessor挂载点
  3. populateBean,给 bean 属性赋值的时候,会分别调用这两个 BeanPostProcessorpostProcessPropertyValues 方法,判断其是否有以上的 @Resource@Autowired 注解。如果有,则还需要进行注册