【问题标题】:What difference does @EnableConfigurationProperties make if a bean is already annotated with @ConfigurationProperties?如果 bean 已经用 @ConfigurationProperties 注释,@EnableConfigurationProperties 有什么区别?
【发布时间】:2018-09-27 13:25:18
【问题描述】:

The Spring Boot documentation 表示使用@ConfigurationProperties 注释

您还需要列出要在 @EnableConfigurationProperties注解,如下图 示例:

并给出以下代码:

@Configuration
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}

但在下一段中说:

即使前面的配置为 AcmeProperties,我们建议@ConfigurationProperties 只处理 与环境,特别是不注入其他bean 从上下文。话虽如此,@EnableConfigurationProperties 注释也会自动应用于您的项目,以便任何 existing 配置了 @ConfigurationProperties 注释的 bean 来自Environment

建议不必在@EnableConfigurationProperties 注释下列出@ConfigurationProperties bean。

那是什么?实验上,我发现如果我用@ConfigurationProperties 注释一个bean,它会按预期将属性注入它,而无需在@EnableConfigurationProperties 中列出它,但如果是这种情况,那么为什么要列出任何具有@ConfigurationProperties 的东西@EnableConfigurationProperties 下的注释,如文档中所示?有什么不同吗?

【问题讨论】:

  • 在这里查看我的答案。 stackoverflow.com/questions/48111941/… 这是一个示例,您可能会强制使用 @EnableConfigurationProperties
  • 如果我理解正确,这解释了为什么你需要在配置类上使用@EnableConfigurationProperties,但不是为什么你需要给它一个用@Configurationproperties 注释的类列表,例如@EnableConfigurationProperties(AcmeProperties.class) 当 AcmeProperties 已经用 @ConfigurationProperties 注释时

标签: java spring spring-boot


【解决方案1】:

正如 M. Deinum 提到的 @EnableConfigurationProperties 是为了启用对 @ConfigurationProperties 的支持。如果您查看注释 Java Doc,您会看到:

启用对 ConfigurationProperties 注释 bean 的支持。 ConfigurationProperties bean 可以以标准方式注册(例如使用 Bean @Bean 方法),或者为方便起见,可以直接在此注释上指定。 [...]

例如,假设您有一个类,其职责是从您的application.yml / application.properties 读取和存储信息,这是连接到不同数据库所需的信息。你用@ConfigurationProperties注释它。

然后,您通常有一个 @Configuration 注释类,它为您的应用程序提供一个 DataSource @Bean。您可以使用@EnableConfigurationProperties 将其链接到@ConfigurationProperties 类并相应地初始化您的数据源。

这是一个小例子:

application.yml

data-sources:
  db1:
    url: "jdbc:postgresql://localhost:5432}/db1"
    username: test
    password: test
  db2:
    url: "jdbc:postgresql://localhost:5432}/db2"
    username: test
    password: test

数据源配置

@ConfigurationProperties
public class DataSourcesConfiguration {

    private Map<String, BasicDataSource> dataSources;

    public void setDataSources(Map<String, BasicDataSource> dataSources) {
        this.dataSources = dataSources;
    }

    Map<String, BasicDataSource > getDataSources() {
        return dataSources;
    }
}

数据源连接配置

@Configuration
@EnableConfigurationProperties(DataSourcesConfiguration.class)
public class DatabaseConnectionConfiguration implements Provider<Connection> {

    private DataSourcesConfiguration dataSourcesConfiguration;

    public DatabaseConnectionConfiguration(DataSourcesConfiguration dataSourcesConfiguration) {
        this.dataSourcesConfiguration = dataSourcesConfiguration;
    }

    @Bean
    public DataSource dataSource() {
        // Use dataSourcesConfiguration to create application data source. E.g., a AbstractRoutingDataSource..
    }

}

【讨论】:

  • 那么在@EnableConfigurationProperties 注解中包含DataSourcesConfiguration.class 与将注解留空相比有何不同?
  • DataSourcesConfiguration.class 未注册为 Spring @Bean。因此,如果您删除@EnableConfigurationProperties 值,在本例中为DataSourcesConfiguration.class,Spring 将无法找到它。如果您查看@EnableConfigurationProperties::value() 文档,它说这只是快速注册@ConfigurationProperties 注释bean 的便捷方式。如果DataSourcesConfiguration 被注释了,我们可以将@EnableConfigurationProperties 留空,例如,@Component 注释,它将其注册为 Spring Bean。希望这会有所帮助!
  • 很方便,@ConfigurationPropertiesScan 使用@EnableConfigurationProperties 进行元注释,因此如果您扫描保存所有属性类的config 包,它也会启用 整体配置属性。我用@ConfigurationPropertiesScan("com.my.config") 注释了我的主要@SpringBootApplication,由于从这个位置进行扫描,这些属性最终被发现为bean 并自动装配。
  • @EmanuelMiranda 小澄清。 DataSourcesConfiguration 没有将 自身 注册为 bean。但最终它被@EnableConfigurationProperties注册为一个bean。所以@ConfigurationProperties注解的类应该注册为一个bean。
【解决方案2】:

我花了一段时间才看到这篇文章,但想在此处添加,以便其他人受益。

@ConfigurationProperties - 用于将类与外部属性文件绑定。很强大,必须用配置实体类来分离bean类。

@Configuration - 创建配置原型的 Spring bean。

@EnableConfigurationProperties - 在配置实体类和 Spring 配置原型之间创建绑定,以便在注入服务后可以轻松检索属性。

【讨论】:

    【解决方案3】:

    如果我们看下面的代码:

    @Configuration @EnableConfigurationProperties @ConfigurationProperties(prefix="ar1") public class ar1Settings { }

    • @Configuration 告诉 Spring 将其视为配置类并将其注册为 Bean

    • @EnableConfigurationProperties 告诉 Spring 将此类视为 application.yml/properties 值的使用者

    • @ConfigurationProperties 告诉 Spring 这个类代表什么部分。

    我的理解是,如果不需要指定属性文件的部分,那么@ConfigurationProperties 可以省略。

    【讨论】:

    • @EnableConfigurationProperties 用于启用对@ConfigurationProperties 的支持,它应该只在您的应用程序中存在一次(即在您的@SpringBootApplication 上它不应该(也不属于)其他类)。跨度>
    • 那么作为参数提供给@EnableCONfigurationProperties 的类有什么作用?
    • @JPerson -- 它们指明了应该启用哪个@ConfigurationProperties Spring。如果您希望加载 Spring 可以找到的任何类,则无需提供任何类。
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 2022-01-21
    • 2012-11-10
    • 2019-01-25
    • 1970-01-01
    • 2020-02-10
    • 2019-01-08
    • 2018-11-23
    相关资源
    最近更新 更多