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

J P*_*son 32 java spring spring-boot

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

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

并给出这段代码:

@Configuration
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}
Run Code Online (Sandbox Code Playgroud)

但是在下一段中说:

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

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

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

Ema*_*nda 34

正如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
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

  • `DataSourcesConfiguration.class`未注册为Spring` @ Bean`.因此,如果删除`@ EnableConfigurationProperties`值,在本例中为`DataSourcesConfiguration.class`,Spring将无法找到它.如果检查`@EnableConfigurationProperties :: value()`docs,它说它只是一种快速注册`@ConfigurationProperties`注释bean的便捷方式.如果`DataSourcesConfiguration`用例如`@Component`注释注释,我们可以将`@EnableConfigurationProperties`留空,它将它注册为Spring Bean.希望这可以帮助! (13认同)
  • 那么与@EnableConfigurationProperties注释相比,包括DataSourcesConfiguration.class与将注释留空相比有什么不同呢? (4认同)
  • 方便的是,“@ConfigurationPropertiesScan”使用“@EnableConfigurationProperties”进行元注释,因此,如果您对保留所有属性类的“config”包进行扫描,它也将“启用”整体配置属性。我用 @ConfigurationPropertiesScan("com.my.config")` 注释了我的主 `@SpringBootApplication`,并且由于从这一位置进行扫描,这些属性最终被发现为 bean 并被自动装配。 (3认同)

小智 15

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

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

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

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


AR1*_*AR1 9

如果我们看下面的代码:

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

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

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

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

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

  • `@EnableConfigurationProperties` 用于启用对 `@ConfigurationProperties` 的支持,它应该只在你的应用程序中存在一次(即在你的 `@SpringBootApplication` 上它不应该(也不属于)其他类)。 (2认同)