Spring Boot文档说要使用@ConfigurationProperties注释
@ConfigurationProperties
您还需要列出要在@EnableConfigurationProperties注释中注册的属性类 ,如以下示例所示:
@EnableConfigurationProperties
并给出以下代码:
@Configuration @EnableConfigurationProperties(AcmeProperties.class) public class MyConfiguration { }
但是在下一段中说:
即使前面的配置为AcmeProperty创建了常规bean,我们也建议@ConfigurationProperties仅处理环境,尤其不要从上下文中注入其他bean。话虽如此,@EnableConfigurationProperties 注释也会自动应用到您的项目中,以便从环境配置任何使用@ConfigurationProperties注释的现有bean。
建议不必@ConfigurationProperties在@EnableConfigurationProperties注释下列出bean 。
那是什么呢?从实验上看,我已经看到,如果用@ConfigurationProperties它注释一个Bean时,可以按预期注入属性,而无需在中列出它@EnableConfigurationProperties,但是如果是这种情况,那么为什么要列出任何带有@ConfigurationProperties注释的东西@EnableConfigurationProperties,如文档所示?有什么区别吗?
正如M. Deinum所说的@EnableConfigurationProperties是为了支持@ConfigurationProperties。如果查看批注Java Doc,您将看到:
启用对带有ConfigurationProperty注释的Bean的支持。可以以标准方式(例如,使用Bean @Bean方法)注册ConfigurationProperties Bean,或者为了方便起见,可以在此批注上直接指定。[…]
例如,假设您有一个类,该类的职责是从application.yml/ application.properties中读取和存储与不同数据库建立连接所需的信息。您用添加注释@ConfigurationProperties。
application.yml
application.properties
然后,通常会有一个带@Configuration注释的类DataSource @Bean为您的应用程序提供一个。您可以使用将@EnableConfigurationProperties其链接到@ConfigurationProperties该类并相应地初始化您的数据源。
@Configuration
DataSource
@Bean
这是一个小例子:
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.. } }