Документация Spring Boot говорит, что использовать аннотацию @ConfigurationProperties
You also need to list the properties classes to register in the
@EnableConfigurationPropertiesannotation, as shown in the following example:
и дает этот код:
@Configuration
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}
Но уже в следующем абзаце сказано:
Even if the preceding configuration creates a regular bean for AcmeProperties, we recommend that
@ConfigurationPropertiesonly deal with the environment and, in particular, does not inject other beans from the context. Having said that, the@EnableConfigurationPropertiesannotation is also automatically applied to your project so that any existing bean annotated with@ConfigurationPropertiesis configured from theEnvironment.
Предполагать, что указывать bean-компонент @ConfigurationProperties под аннотацией @EnableConfigurationProperties не обязательно.
Так что это? Экспериментально я заметил, что если я аннотирую bean-компонент с помощью @ConfigurationProperties, он получает свойства, введенные в него, как ожидалось, без необходимости перечислять их в @EnableConfigurationProperties, но если это так, то зачем перечислять все, что имеет аннотацию @ConfigurationProperties, в @EnableConfigurationProperties, как есть показано в документации? Есть ли какая-нибудь разница?
Если я правильно понимаю, это объясняет, почему вам нужен @EnableConfigurationProperties в классе конфигурации, но не почему вам нужно предоставить ему список классов, аннотированных @Configurationproperties, например @EnableConfigurationProperties(AcmeProperties.class), когда AcmeProperties уже аннотирован @ConfigurationProperties




Если мы посмотрим на код ниже:
@Configuration @EnableConfigurationProperties @ConfigurationProperties(prefix = "ar1")
public class ar1Settings { }
@ Конфигурация сообщает Spring рассматривать это как класс конфигурации и регистрировать его как Bean
@EnableConfigurationProperties сообщает Spring рассматривать этот класс как получатель значений application.yml / properties.
@ConfigurationProperties сообщает Spring, какой раздел представляет этот класс.
Насколько я понимаю, если вам не нужно указывать раздел файла свойств, то @ConfigurationProperties можно опустить.
@EnableConfigurationProperties предназначен для включения поддержки @ConfigurationProperties, он должен существовать только один раз в вашем приложении (то есть на вашем @SpringBootApplication он не должен (и не принадлежит) другим классам).
Так что же делают классы, данные @EnableCOnfigurationProperties в качестве аргументов?
@JPerson - они указывают, какой именно @ConfigurationProperties Spring должен включать. Вы не предоставляете никаких классов, если хотите, чтобы были загружены какие-либо из найденных Spring.
Как М. Дейнум назвал @EnableConfigurationProperties Is для включения поддержки @ConfigurationProperties. Если вы посмотрите аннотацию Java Doc, вы увидите:
Enable support for ConfigurationProperties annotated beans. ConfigurationProperties beans can be registered in the standard way (for example using Bean @Bean methods) or, for convenience, can be specified directly on this annotation. [...]
Например, предположим, что у вас есть класс, в обязанности которого входит считывание и хранение информации с вашего 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
Источники данных Конфигурация
@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..
}
}
Итак, какая разница, включающая DataSourcesConfiguration.class в аннотацию @EnableConfigurationProperties, по сравнению с оставлением аннотации пустой?
DataSourcesConfiguration.class не зарегистрирован как Spring @Bean. Следовательно, если вы удалите значение @EnableConfigurationProperties, в данном случае DataSourcesConfiguration.class, Spring не сможет его найти. Если вы посмотрите документацию @EnableConfigurationProperties::value(), там будет сказано, что это просто удобный способ быстро зарегистрировать аннотированные bean-компоненты @ConfigurationProperties. Мы могли бы оставить @EnableConfigurationProperties пустым, если бы DataSourcesConfiguration был аннотирован, например, аннотацией @Component, которая регистрирует его как Spring Bean. Надеюсь это поможет!
Для удобства @ConfigurationPropertiesScan снабжен метааннотациями @EnableConfigurationProperties, поэтому, если вы выполните сканирование своего пакета config, в котором вы храните все классы свойств, он также будет иметь общие свойства конфигурации включить. Я аннотировал свой основной @SpringBootApplication с помощью @ConfigurationPropertiesScan("com.my.config"), и свойства, наконец, были обнаружены как beans и были автоматически подключены из-за сканирования из этого единственного места.
@EmanuelMiranda Небольшое уточнение. DataSourcesConfiguration не регистрирует сам как bean-компонент. Но в конце концов он зарегистрирован как bean-компонент @EnableConfigurationProperties. Так или иначе, аннотированный класс @ConfigurationProperties должен быть зарегистрирован как bean-компонент.
Мне потребовалось время, чтобы добраться до этого поста, но я хотел бы добавить сюда, чтобы другие могли получить пользу.
@ConfigurationProperties - используется для привязки класса к внешнему файлу свойств. Очень мощный и должен использоваться для разделения классов компонентов с классом сущности конфигурации.
@Configuration - создает компонент Spring стереотипа конфигурации.
@EnableConfigurationProperties - создает привязку между классом объекта конфигурации и стереотипом конфигурации Spring, чтобы после внедрения в пределах службы можно было легко получить свойства.
проверьте мой ответ здесь. stackoverflow.com/questions/48111941/… Это один из примеров, когда использование
@EnableConfigurationPropertiesявляется обязательным.