当前位置: 首页 > 面试题库 >

Spring在没有@Autowired批注的情况下在构造函数中注入依赖项

阎慈
2023-03-14
问题内容

如果你看一下AppRunner.java课堂上的代码,我有两个问题:

  1. 服务器启动时,如果我在此类的构造函数中放置一个断点,就像在构造函数中那样,它GitHubLookupService是由spring使用@Service配置的bean 提供的。但是,@Autowired构造函数上没有注释,那么,在这个世界中如何以正确的依赖关系调用该构造函数?应该是null。
    这是Spring Boot的自动假设吗?
    Spring是否看到“私有字段+构造函数参数”,并且假定它应该寻找合适的bean?
    是Spring Framework还是Spring boot?
    我缺少什么了吗?

  2. 如我所记得,必须为bean /服务等提供默认构造函数。为什么此类(AppRunner)没有默认构造函数?Spring如何知道应使用参数运行构造函数?是因为它是唯一的构造函数吗?


问题答案:

从Spring 4.3开始,如果配置为Spring bean的类仅具有一个构造函数,则@Autowired可以省略注释,并且Spring将使用该构造函数并注入所有必需的依赖项。

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

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



 类似资料:
  • 我正在使用spring官方教程中的示例进行实验,并且对此代码有一个依赖关系: https://github.com/spring-guides/gs-async-method/tree/master/complete 如果您查看类上的代码,我有两个问题: 当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样,是由spring使用配置的bean提供的。但是,构造函数上没有注释

  • 我有很多Android ViewModel类,它们往往有很多依赖项(大多数是Room中的DAO,每个SQLite表一个)。有些依赖项超过10个。 这很好,但Inject构造函数充满了参数,并且只包含样板代码,用于从构造函数参数设置注入的成员。 我想切换到“常规”注入成员,使用注释单独标识,就像其他(哑)类一样。 这对于与Android相关的类(尽管ViewModel被宣传为非Android依赖,例

  • 我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。 下面是一个示例类: 在模块类中: DepB类别: 据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。 但是呢?我们如何能够在不指定任何位置的情况下注入DepB?

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 和另一个类: 在这种情况下,服务将按照预期注入到A类中。据我所知,你不能在a类中使用构造函数,否则注入将无法工作。有没有一种方法可以在a类中使用一个构造函数,同时注入服务?即: 在这种情况下,我得到的服务是空的,无论如何要解决这个问题?我希望能够从类型A中使用“new”创建一个对象,并注入服务,这可能吗?

  • 有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn