我正在试用本官方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如何知道它应该使用参数运行构造函数?是因为它是唯一的构造函数吗?
2条答案
按热度按时间mfuanj7w1#
从Spring4.3开始,如果配置为Springbean的类只有一个构造函数
@Autowired
注解可以省略,spring将使用该构造函数并注入所有必要的依赖项。关于默认构造函数:您需要默认构造函数,即
@Autowired
注解,当您有多个构造函数,或者类中只有一个构造函数(带或不带@Autowired
注解。阅读
@Autowired
有关更多信息,请参阅spring官方文档的第章。5f0d552i2#
这样想吧。。。假设您有以下组件:
当spring扫描这个类时,它想知道应该如何构造示例。它使用反射,因此可以在运行时获得所有构造函数的列表。
在这种情况下,spring必须如何构造这个示例是完全明确的。因为只有一个构造函数,所以不需要做出任何决定,也不存在任何歧义。
如果你加上
@Autowired
在这里,您并没有缩小范围,也没有向spring提供任何额外的信息来帮助其做出决策——它的决策已经做出,因为只有一个候选人。因此,为了方便起见,spring团队决定
@Autowired
应该是可选的。因为它不能帮助spring框架做出决策,所以它的存在只是噪音。如果组件有多个构造函数,那么可以使用
@Autowired
让他们中的一个告诉spring“使用这个,而不是那个”。