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
注释,如文档中所示?它有什么不同吗?
答案 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。