小编典典

如果已经使用@ConfigurationProperties注释了bean,则@EnableConfigurationproperties有什么区别?

spring-boot

Spring Boot文档说要使用@ConfigurationProperties注释

您还需要列出要在@EnableConfigurationProperties注释中注册的属性类 ,如以下示例所示:

并给出此代码:

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

但在下一段中说:

即使前面的配置为AcmeProperties创建了一个常规bean,我们也建议@ConfigurationProperties仅处理环境,尤其不要从上下文中注入其他bean。话虽如此,@EnableConfigurationProperties
注释也会自动应用到您的项目中,以便从环境配置任何使用@ConfigurationProperties注释的现有bean。

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

那是什么呢?从实验上看,我已经看到,如果用@ConfigurationProperties它注释一个Bean时,可以按预期注入属性而不需要在Bean
中列出它@EnableConfigurationProperties,但是如果是这种情况,那么为什么要列出任何带有@ConfigurationProperties注释的东西@EnableConfigurationProperties,如文档所示?有什么区别吗?


阅读 1557

收藏
2020-05-30

共1个答案

小编典典

正如Deinum
M.所说的@EnableConfigurationProperties是为了支持@ConfigurationProperties。如果查看批注Java
Doc,您将看到:

启用对带注释的ConfigurationProperty的支持。可以以标准方式(例如,使用Bean
@Bean方法)注册ConfigurationProperties
Bean,或者为方便起见,可以在此批注上直接指定ConfigurationProperties 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;
    }
}

DataSourceConnectionConfiguration

@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..
    }

}
2020-05-30