Spring 的 AutowiredAnnotationBeanPostProcessor 和构造函数注入

Rom*_*man 5 java spring dependency-injection autowired

大家都知道@Autowired(@Inject etc)注解是由AutowiredAnnotationBeanPostProcessor处理的。它解析并设置用@Autowired 注释的字段和设置器,但是构造函数呢?这是 bean PostProcessor,这意味着它在 bean 已经创建之后被调用,但是构造函数也可以标记为 @Autowired,那么这样的 bean 是如何创建的呢?

Dov*_*vmo 3

好问题。为了澄清起见,重新表述一下:

  • 当依赖项似乎只有在创建 bean之后才注入时,Spring 如何提供对构造函数参数进行依赖项注入的功能?

如果您查看AutowiredAnnotationBeanPostProcessor,您会发现有一个被调用的方法#determineCandidateConstructors不会从该类本身内部的任何地方调用。

之所以没有在那里调用它,是因为它在 AbstractAutowireCapableBeanFactory 中被引用;用于实际创建/实例 bean 的类!

我想 Juergen 和 Spring 的人决定将 放入类#determineCandidateConstructors中具有架构意义AutowiredAnnotationBeanPostProcessor,因为它符合Autowire-ing注入依赖项的真正目的的概念功能。

仅供参考,字段@Autowire与构造函数的这些概念@Autowire是如此紧密地联系在一起,以至于 Spring DI 世界中就是否使用构造函数与依赖注入进行了全面的讨论。请参阅本文标题为“Constructor-based or setter-based DI” 的部分,Oliver Gierke 的评论(即 Spring Data 项目负责人),以及google了解更多信息。