当前位置: 首页 > 知识库问答 >
问题:

Spring的AutowiredNotationBeanPostProcessor和构造函数注入

蒋英博
2023-03-14

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

共有1个答案

闻人景澄
2023-03-14

好问题。为了澄清起见,重新措辞:

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

如果你看一下AutowiredAnnotationBeanPostProcator,你会发现有一个叫做的方法,它不会在类本身的任何地方被调用。

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

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

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

 类似资料:
  • 下面是引用的Spring留档的AutoowiredAnnotationBeanPostProc处理器, 任何给定bean类中只有一个构造函数(最大值)可以携带此注释,其中“必需”参数设置为true,指示构造函数在用作Spring bean时自动连接。如果多个非必需的构造函数携带注释,它们将被视为自动连接的候选。将选择具有最多依赖项的构造函数,这些依赖项可以通过匹配Spring容器中的bean来满足

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 我有一个父类,其中包含构造函数注入的依赖项: 如果我从这个类继承,我总是需要重新定义一个调用父构造函数的构造函数吗? 使用 setter 注入,我似乎能够将依赖项保留在父类中,而不需要在子类中重新连接它,如果子类不接触链接到依赖项的功能,这对我来说听起来不错: 看起来,如果我想避免重复自动装配代码和处理子组件中的依赖关系,我只能使用setter或field injection来实现。 是否有更简洁

  • 我想在构造函数中使用Request类,这是我想运行服务器时它给我的错误: 无法自动连接服务"AppBundle\Controller\DetectServiceDetailController":方法"__construct()"引用类"Symfony\Component\HttpFoundation\Request"的参数"$ask",但不存在这样的服务。它不能自动注册,因为它来自不同的根命名空

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj

  • 在之前的所有JUnit版本中,测试构造函数或方法都不允许有参数(至少不能使用标准的Runner实现)。作为JUnit Jupiter的主要变化之一,测试构造函数和方法现在都允许有参数。这带来了更大的灵活性,并为构造函数和方法启用依赖注入。 ParameterResolver定义了测试扩展的API,希望在运行时动态解析参数。如果测试构造函数或@Test, @TestFactory, @BeforeE