spring在构造函数中注入依赖项,而不使用@autowired注解

xlpyo6sf  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(850)

我正在试用本官方spring教程中的示例,并且依赖于以下代码:
https://github.com/spring-guides/gs-async-method/tree/master/complete
如果你看看上面的代码 AppRunner.java 同学们,我有两个问题:
当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样 GitHubLookupService 由spring提供,使用 @Service 已配置的bean。但是,没有 @Autowired 构造函数上的注解,那么如何使用正确的依赖项调用此构造函数呢?应该是 null .
这是Spring Boot的自动假设吗?
spring是否看到“private field+constructor”参数,并假设它应该寻找合适的bean?
是spring框架还是spring引导?
我错过什么了吗?
我记得,为bean/服务等提供默认构造函数是一种改进。这个类是怎么来的( AppRunner )没有默认构造函数吗?spring如何知道它应该使用参数运行构造函数?是因为它是唯一的构造函数吗?

mfuanj7w

mfuanj7w1#

从Spring4.3开始,如果配置为Springbean的类只有一个构造函数 @Autowired 注解可以省略,spring将使用该构造函数并注入所有必要的依赖项。
关于默认构造函数:您需要默认构造函数,即 @Autowired 注解,当您有多个构造函数,或者类中只有一个构造函数(带或不带 @Autowired 注解。
阅读 @Autowired 有关更多信息,请参阅spring官方文档的第章。

5f0d552i

5f0d552i2#

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

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

当spring扫描这个类时,它想知道应该如何构造示例。它使用反射,因此可以在运行时获得所有构造函数的列表。
在这种情况下,spring必须如何构造这个示例是完全明确的。因为只有一个构造函数,所以不需要做出任何决定,也不存在任何歧义。
如果你加上 @Autowired 在这里,您并没有缩小范围,也没有向spring提供任何额外的信息来帮助其做出决策——它的决策已经做出,因为只有一个候选人。
因此,为了方便起见,spring团队决定 @Autowired 应该是可选的。因为它不能帮助spring框架做出决策,所以它的存在只是噪音。
如果组件有多个构造函数,那么可以使用 @Autowired 让他们中的一个告诉spring“使用这个,而不是那个”。

相关问题