如果一个豆子已经用@ConfigurationProperties注释,@EnableConfigurationProperties有什么区别?

2022-08-31 16:57:03

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

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

并给出以下代码:

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

但是在下一段说:

即使上述配置为 AcmeProperties 创建了一个常规的 Bean,我们也建议只处理环境,特别是不要从上下文中注入其他 Bean。话虽如此,注释也会自动应用于您的项目,以便从 中配置任何带注释的现有 Bean。@ConfigurationProperties@EnableConfigurationProperties@ConfigurationPropertiesEnvironment

建议在注释下列出一个豆子是没有必要的。@ConfigurationProperties@EnableConfigurationProperties

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


答案 1

正如 M. Deinum 所指的,用于启用对 .如果你看一下Java Doc的注释,你可以看到:@EnableConfigurationProperties@ConfigurationProperties

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

例如,假设您有一个类,其职责是从您的/ 读取和存储信息,这是连接到不同数据库所必需的。您可以使用 对其进行批注。application.ymlapplication.properties@ConfigurationProperties

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

下面是一个小示例:

应用程序.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..
    }

}

答案 2

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

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

@Configuration- 创建配置构造型的弹簧豆。

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


推荐