Spring可以在没有使用@Autowired注解的情况下在构造函数中注入依赖。
Spring可以在没有使用@Autowired注解的情况下在构造函数中注入依赖。
我正在尝试使用来自Spring官方教程中的例子进行实验,其中有一个依赖于此代码:
https://github.com/spring-guides/gs-async-method/tree/master/complete
如果您查看AppRunner.java
类中的代码,我有两个问题:
- 当服务器启动时,如果在此类的构造函数中设置断点,则似乎在构造函数中,通过使用已配置的
@Service
bean提供了GitHubLookupService
。但是,在构造函数上没有@Autowired
注释,那么这个构造函数如何使用正确的依赖项被调用?它应该是null
。
这是Spring Boot的自动假设吗?
Spring看到“私有字段+构造函数参数”,并假定它应该查找适当的bean吗?
这是Spring Framework还是Spring Boot?
我有什么漏掉的吗?
- 我记得,必须为bean / service等提供默认构造函数。为什么这个类(
AppRunner
)没有默认构造函数呢?Spring如何知道它应该运行带参数的构造函数?
是因为它是唯一的构造函数吗?
想象一下...假设你有以下组件:
@Component public class FooService { public FooService(Bar bar) { /*whatever*/ } }
当Spring正在扫描这个类时,它想知道该如何构建一个实例。它使用反射来在运行时获取所有构造函数的列表。
在这种情况下,Spring如何构建这个实例是完全明确的。只有一个构造函数,因此没有需要做出的决定,也没有任何模糊不清的地方。
如果你在这里添加了 @Autowired
, 你并没有缩小任何范围,也没有为Spring提供任何额外的信息来帮助它做出决策——因为只有一个候选项,它的决定已经做出。
因此,为了方便,Spring团队决定 @Autowired
应该是可选的。由于它对Spring框架做出决策没有帮助,它的存在只是噪音。
如果你的组件有多个构造函数,那么你可以在其中一个上使用@Autowired
,告诉Spring“使用这个,而不是那个”。
从Spring 4.3开始,如果一个被配置为Spring Bean的类只有一个构造函数,那么@Autowired
注解可以省略,Spring将使用该构造函数并注入所有必要的依赖项。
关于默认构造函数:当你有多个构造函数时,你需要默认构造函数、带有@Autowired
注解的构造函数,或者只有一个带或不带@Autowired
注解的构造函数。
阅读官方Spring文档中有关@Autowired
章节以获取更多信息。