Spring可以在没有使用@Autowired注解的情况下在构造函数中注入依赖。

11 浏览
0 Comments

Spring可以在没有使用@Autowired注解的情况下在构造函数中注入依赖。

我正在尝试使用来自Spring官方教程中的例子进行实验,其中有一个依赖于此代码:

https://github.com/spring-guides/gs-async-method/tree/master/complete

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

  1. 当服务器启动时,如果在此类的构造函数中设置断点,则似乎在构造函数中,通过使用已配置的@Service bean提供了GitHubLookupService。但是,在构造函数上没有@Autowired注释,那么这个构造函数如何使用正确的依赖项被调用?它应该是null

这是Spring Boot的自动假设吗?

Spring看到“私有字段+构造函数参数”,并假定它应该查找适当的bean吗?

这是Spring Framework还是Spring Boot

我有什么漏掉的吗?

  1. 我记得,必须为bean / service等提供默认构造函数。为什么这个类(AppRunner)没有默认构造函数呢?

    Spring如何知道它应该运行带参数的构造函数?

    是因为它是唯一的构造函数吗?

admin 更改状态以发布 2023年5月20日
0
0 Comments

想象一下...假设你有以下组件:

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

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

在这种情况下,Spring如何构建这个实例是完全明确的。只有一个构造函数,因此没有需要做出的决定,也没有任何模糊不清的地方。

如果你在这里添加了 @Autowired, 你并没有缩小任何范围,也没有为Spring提供任何额外的信息来帮助它做出决策——因为只有一个候选项,它的决定已经做出。

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

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

0
0 Comments

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

关于默认构造函数:当你有多个构造函数时,你需要默认构造函数、带有@Autowired注解的构造函数,或者只有一个带或不带@Autowired注解的构造函数。

阅读官方Spring文档中有关@Autowired章节以获取更多信息。

0