Spring 在构造函数中注入不带@Autowired 注释的依赖项

我正在试验来自这个官方的 Spring 教程的例子,这里有一个依赖于这段代码的例子:
Https://github.com/spring-guides/gs-async-method/tree/master/complete

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

  1. 当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样,使用配置好的 @Service bean,由 spring 提供 GitHubLookupService。但是,在构造函数上没有 @Autowired注释,那么这个构造函数是如何通过正确的依赖关系被调用的呢?应该是 null

这是 弹簧靴的自动假设吗?
Spring 是否看到“ private field + structor 参数,并假设它应该寻找合适的 bean?
Spring 框架还是 弹簧靴
我错过了什么吗?

  1. 我记得,向 bean/服务等提供 缺省构造函数是一种补救措施。为什么这门课(AppRunner)没有缺省构造函数? Spring 如何知道它应该使用参数运行构造函数? 是因为它是唯一的构造函数吗?
81183 次浏览

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

关于 缺省构造函数: 当你有多个构造函数时,你要么需要缺省构造函数,一个带有 @Autowired注释的构造函数,或者你的类中只有一个带或不带 @Autowired注释的构造函数。

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

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

@Component
public class FooService {
public FooService(Bar bar) { /*whatever*/ }
}

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

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

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

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

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