Spring在没有@Autowired批注的构造函数中注入依赖项

win*_*ter 48 spring dependency-injection autowired spring-boot

我正在试验这个官方Spring 教程中的示例,并且依赖于此代码:https:
//github.com/spring-guides/gs-async-method/tree/master/complete

如果你看一下AppRunner.java 类的代码,我有两个问题:

1)当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样,Spring提供了GitHubLookupService,使用了已配置的@Service bean.但是,@Autowired构造函数上没有注释,那么在世界中如何使用正确的依赖项调用此构造函数?它应该是null.

它是Spring Boot的自动假设吗?
Spring是否看到"私有字段+构造函数参数,它假设它应该寻找合适的bean?
Spring Framework还是Spring引导
我错过了什么?

2)我记得,为bean/service等提供默认构造函数是可以的.为什么这个类(AppRunner)没有默认构造函数?Spring如何知道它应该使用参数运行构造函数?是因为它是唯一的构造函数吗?

dun*_*nni 110

从Spring 4.3开始,如果一个配置为Spring bean的类只有一个构造函数,那么Autowired注释可以省略,Spring将使用该构造函数并注入所有必需的依赖项.

关于默认构造函数:您需要默认构造函数,Autowired具有多个构造函数时带注释的构造函数,或者类中只有一个带或不带Autowired注释的构造函数.

有关更多信息,请阅读官方Spring文档中的"@Autowired"章节.

  • 这里引用官方文档:_从 Spring Framework 4.3 开始,如果目标 bean 一开始只定义一个构造函数,则**不再需要**这样的构造函数上的 @Autowired 注释。但是,如果有多个构造函数可用,则必须至少对其中一个构造函数进行注释,以指导容器使用哪一个。_ (3认同)
  • 更相关的文档链接是https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#beans-autowired-annotation (2认同)

Mic*_*ael 25

这样想...假设您有以下组件:

@Component 
public class FooService {
    public FooService(Bar bar) { /*whatever*/ }
}
Run Code Online (Sandbox Code Playgroud)

当 Spring 扫描这个类时,它想知道应该如何构造一个实例。它使用反射,因此可以在运行时获取所有构造函数的列表。

在这种情况下,Spring 必须如何构造这个实例是完全明确的。只有一个构造函数,因此无需做出任何决定,也没有任何歧义。

如果您在此处添加@Autowired,则不会缩小任何范围,也不会向 Spring 提供任何额外信息来帮助其做出决定 - 它的决定已经做出,因为只有一个候选者。

因此,为了方便起见,Spring 团队决定@Autowired应该是可选的。由于它不能帮助 Spring 框架做出决定,因此它的存在只是噪音。

如果你的组件有多个构造函数,那么你可以使用@Autowired其中之一来告诉 Spring“使用这个,而不是那个”。