Spring 在没有 @Autowired 注释的构造函数中注入(inject)依赖项

标签 spring spring-boot dependency-injection autowired

我正在尝试来自这个官方 Spring tutorials 的示例并且对这段代码有依赖:
https://github.com/spring-guides/gs-async-method/tree/master/complete

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

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

这是 Spring Boot 的自动假设吗?
Spring 是否看到“私有(private)字段 + 构造函数参数,并假设它应该寻找合适的 bean?
Spring Framework 还是 Spring boot
我错过了什么吗?

  1. 我记得,为 bean/服务等提供 默认构造函数 是强制性的。为什么这个类 (AppRunner) 没有默认构造函数? Spring 如何知道它应该使用参数运行构造函数? 是因为它是唯一的构造函数吗?

最佳答案

从Spring4.3开始,如果配置为Spring bean的类只有一个构造函数,@Autowired注解可以省略,Spring会使用该构造函数并注入(inject)所有必要的依赖项。

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

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

关于Spring 在没有 @Autowired 注释的构造函数中注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092751/

相关文章:

java - 如何将 Spring 配置文件传递给 Jenkins Job 运行的 Spring Boot 应用程序?

dependency-injection - DI容器,工厂或临时性元素的新容器?

java - 更好地实践 Spring MVC : Service with non-fixed dependency

sql-server - Spring Boot/HikariCP @Transactional 不覆盖隔离级别

delphi - 如何将字段接口(interface)注入(inject)到对象中

spring - Grails解决迁移插件和可搜索插件之间的冲突

Spring 的初始化和销毁​​方法

java - Hibernate 事务提交

java - 我不知所措地从 Spring XML 迁移到 Java-config

java - mongodb + Spring 启动。如何进行广泛过滤?