Java 弹簧&x27;s AutowiredNotationBeanPostProcessor和构造函数注入

Java 弹簧&x27;s AutowiredNotationBeanPostProcessor和构造函数注入,java,spring,dependency-injection,autowired,Java,Spring,Dependency Injection,Autowired,大家都知道@Autowired(@Inject etc)注释是由AutowiredAnnotationBeanPostProcessor处理的。它解析并设置用@Autowired注释的字段和setter,但构造函数呢?这是bean后处理器,这意味着它是在已经创建bean之后调用的,但是构造函数也可以标记为@Autowired,那么这样的bean是如何创建的呢?好问题。为了澄清起见,请将其重新命名为: Spring是如何提供依赖注入功能的 当看起来依赖项被注入时,构造函数参数 只有在创建bean

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

好问题。为了澄清起见,请将其重新命名为:

  • Spring是如何提供依赖注入功能的 当看起来依赖项被注入时,构造函数参数 只有在创建bean之后才创建它
如果您查看,您会发现有一个名为
#determineCandidateConstructors
的方法,它不会从该类本身的任何地方调用

没有在那里调用它的原因是因为它在中被引用;用于实际创建/实例化bean的类

我可以想象,Juergen和Spring团队决定将
#determineCandidateConstructors
放在
AutowiredNotationBeanPostProcessor
类中是有架构意义的,因为它符合
Autowire ing
注入依赖项的真正目的的概念函数


仅供参考,field
@Autowire
与constructor
@Autowire
的这些概念是如此紧密地联系在一起,以至于Spring DI世界中有一个关于是否使用构造函数与依赖注入的完整讨论。有关更多信息,请参阅标题为“基于构造函数或基于setter的DI”(即Spring数据项目负责人)的部分。

非常感谢。现在我想我明白了。AutowiredAnnotationBeanPostProcessor设置了autowired字段和setter,但对象本身是由AbstractAutowireCapableBeanFactory的autowireConstructor方法使用determineCandidateConstructors创建的。但是AbstractAutowireCapableBeanFactory的autowireByName和autowireByType方法的用途是什么?它们只有在我们使用xml设置autowire策略时才起作用吗?这是个好问题。从四处窥探来看,似乎在测试创建和AOP方面创建过程中必然会调用这些对象。从框架本身来看,似乎processor是所有autowire相关DI的核心类。