当前位置: 首页 > 知识库问答 >
问题:

如何使用@SpringBootApplication注释自动检测@ConfigurationProperties注释类

姜乐家
2023-03-14

我正在学习SpringBoot,在参考文档中有一个例子,我有一个问题。文件的以下部分提到

6.使用@SpringBootApplication注释

可以使用单个@SpringBootApplication注释来启用这三个功能,即:

@EnableAutoConfiguration:启用Spring Boot的自动配置机制

@ComponentScan:在应用程序所在的包上启用@Component扫描(请参阅最佳实践)

@配置:允许在上下文中注册额外的bean或导入额外的配置类

下面的例子用它支持的任何特性来替换这个注释,这让我有点困惑。榜样

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {

    public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
    }

}

示例的解释

在本例中,应用程序与任何其他Spring Boot应用程序一样,只是@Component注释类和@ConfigurationProperties注释类不会自动检测,并且用户定义的bean会显式导入(请参见@Import)。

我在上面的示例代码中看到的唯一主要区别是它没有@ComponentScan注释。我还在SO答案的评论部分(Stephane Nicoll 5月5日17日11:07)中读到,官方不建议@Component annotation自动检测@ConfigurationProperties。因此,我的假设是,带有@ConfigurationProperties的Spring框架类不带@Component注释。

此外,我还检查了@SpringBootApplication注释源,无法识别任何能够自动检测@ConfigurationProperties注释类的内容。

参考文件2.8.3。启用@ConfigurationProperties注释类型部分显示以下扫描和自动检测@ConfigurationProperties的方法

@SpringBootApplication
@ConfigurationPropertiesScan({ "com.example.app", "org.acme.another" })
public class MyApplication {
}

有了这些细节,我想了解

为什么在本例中明确提到@ConfigurationProperties注释类不会自动检测到?当使用@SpringBootApplication时,@ConfigurationProperties注释类是如何自动检测的。

附加说明:我看到留档的前一个版本和当前版本之间有一点差异。以下引用缺少当前引用

请记住,@EnableConfigurationProperties注释也会自动应用于您的项目,以便从环境中配置任何带有@ConfigurationProperties注释的现有bean

共有1个答案

孔星宇
2023-03-14

以下是我从分析中了解到的情况。

@ConfigurationProperties注释类型可以通过以下方式注册到ApplicationContext

>

  • @ConfigurationProperties注释类,注释属于@ComponentScan@Component@Service等)的范围。根据斯蒂芬·尼科尔的评论,不推荐,这对我来说现在是有意义的。

    使用注释@EnableConfigurationProperties。为此,使用@EnableConfigurationProperties注释的类应使用@ComponentScan范围内的注释进行注释(@Component@Service等)

    使用注释@ConfigurationPropertiesScan,并确保使用@ConfigurationProperties注释的类置于其雷达之下。其用法类似于@ComponentScan

    现在,当我们将@SpringBootApplication替换为它启用并省略@ComponentScan的单独注释时(例如),使用@ConfigurationProperties注册类型的@ConfigurationProperties方式(第2点)将不会工作。这可能回答了我关于为什么和如何的问题。

    这可能是因为@EnableConfigurationProperties@ComponentScan之间的联系对于像我这样的人来说并不明显。

    附加细节。

    当我们使用@EnableConfigurationProperties时,通过注释导入的EnableConfigurationPropertiesRegistrar类注册@ConfigurationProperties注释类型

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import(EnableConfigurationPropertiesRegistrar.class)
    public @interface EnableConfigurationProperties {..}
    

  •  类似资料:
    • 我对Spring Boot配置有问题。 我已经使用https://start.spring.io/ 我有一个问题,配置只适用于子曲库中的类: 我尝试了annotation@ComponentScan,但没有任何帮助。 你知道我能用这个做什么吗?

    • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

    • 问题内容: 当我尝试自动装配Spring RestTemplate时,出现以下错误: 在注释驱动的环境中使用Spring 4。 我的调度程序servlet的配置如下: 我尝试自动连接RestTemplate的类如下: 问题答案: 如果未定义错误,则会看到错误 考虑在配置中定义类型为“ org.springframework.web.client.RestTemplate”的bean。 要么 找不到

    • 问题内容: 有人可以给MWE 直接在方法上使用注释的方法吗? 我已经看到了无数的关于在类定义中使用它的示例-但还没有方法的示例。 引用文档: 这种添加到一个类定义或 一个方法 @Target(value = {TYPE, METHOD }) 因此,我认为还有一种可能性和预期的用途-但不幸的是,我无法弄清楚。 问题答案: 这里的DataSource类具有属性url,用户名,密码,driverClas

    • 我在尝试执行此代码时遇到以下错误。 java.lang.IllegalArgumentException:在“com.app.aggregatorappaconfiguration”上找不到ConfigurationProperties注释。在org.springframework.util.assert.NotNull(assert.java:115)~[spring-core-4.3.2.re

    • 我有一个Spring Boot应用程序,其中包含一个Spring数据Jpa存储库。我需要运行一个单元(或组件?)围绕此存储库进行测试。我对Spring数据Jpa没有太多经验。 这是我的测试。它非常简单,我无法通过。 这是其他相关的源代码。 和 我只是想把Jpa回购协议自动连接到测试中,但我做不到。很明显,我误解了Spring Boot工作原理的一些细微差别。但即使经过了一些教程,我也无法找出我遗漏