如果bean已经使用@ConfigurationProperties注释,@ EnableConfigurationproperties会有什么不同?

时间:2018-04-17 14:13:31

标签: java spring spring-boot

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

  

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

并提供此代码:

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

但在下一段中说:

  

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

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

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

3 个答案:

答案 0 :(得分:26)

正如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

<强> DataSourcesConfiguration

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

}

答案 1 :(得分:10)

我花了一段时间才找到这篇文章,但想在这里添加一下,以便其他人可以从中受益。

@ConfigurationProperties-用于将类与外部属性文件绑定。功能非常强大,必须使用它与配置实体类将bean类分开。

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

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

答案 2 :(得分:7)

如果我们查看下面的代码:

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

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

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

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

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