Какая разница имеет значение @EnableConfigurationProperties, если компонент уже аннотирован с помощью @ConfigurationProperties?

Документация Spring Boot говорит, что использовать аннотацию @ConfigurationProperties

You also need to list the properties classes to register in the @EnableConfigurationProperties annotation, 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 @ConfigurationProperties only deal with the environment and, in particular, does not inject other beans from the context. Having said that, the @EnableConfigurationProperties annotation is also automatically applied to your project so that any existing bean annotated with @ConfigurationProperties is configured from the Environment.

Предполагать, что указывать bean-компонент @ConfigurationProperties под аннотацией @EnableConfigurationProperties не обязательно.

Так что это? Экспериментально я заметил, что если я аннотирую bean-компонент с помощью @ConfigurationProperties, он получает свойства, введенные в него, как ожидалось, без необходимости перечислять их в @EnableConfigurationProperties, но если это так, то зачем перечислять все, что имеет аннотацию @ConfigurationProperties, в @EnableConfigurationProperties, как есть показано в документации? Есть ли какая-нибудь разница?

проверьте мой ответ здесь. stackoverflow.com/questions/48111941/… Это один из примеров, когда использование @EnableConfigurationProperties является обязательным.

pvpkiran 17.04.2018 16:23

Если я правильно понимаю, это объясняет, почему вам нужен @EnableConfigurationProperties в классе конфигурации, но не почему вам нужно предоставить ему список классов, аннотированных @Configurationproperties, например @EnableConfigurationProperties(AcmeProperties.class), когда AcmeProperties уже аннотирован @ConfigurationProperties

J Person 17.04.2018 16:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
48
2
46 322
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если мы посмотрим на код ниже:

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

  • @ Конфигурация сообщает Spring рассматривать это как класс конфигурации и регистрировать его как Bean

  • @EnableConfigurationProperties сообщает Spring рассматривать этот класс как получатель значений application.yml / properties.

  • @ConfigurationProperties сообщает Spring, какой раздел представляет этот класс.

Насколько я понимаю, если вам не нужно указывать раздел файла свойств, то @ConfigurationProperties можно опустить.

@EnableConfigurationProperties предназначен для включения поддержки @ConfigurationProperties, он должен существовать только один раз в вашем приложении (то есть на вашем @SpringBootApplication он не должен (и не принадлежит) другим классам).
M. Deinum 18.04.2018 08:47

Так что же делают классы, данные @EnableCOnfigurationProperties в качестве аргументов?

J Person 18.04.2018 11:22

@JPerson - они указывают, какой именно @ConfigurationProperties Spring должен включать. Вы не предоставляете никаких классов, если хотите, чтобы были загружены какие-либо из найденных Spring.

Josh M. 18.10.2019 12:58
Ответ принят как подходящий

Как М. Дейнум назвал @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, по сравнению с оставлением аннотации пустой?

J Person 08.05.2018 15:22

DataSourcesConfiguration.class не зарегистрирован как Spring @Bean. Следовательно, если вы удалите значение @EnableConfigurationProperties, в данном случае DataSourcesConfiguration.class, Spring не сможет его найти. Если вы посмотрите документацию @EnableConfigurationProperties::value(), там будет сказано, что это просто удобный способ быстро зарегистрировать аннотированные bean-компоненты @ConfigurationProperties. Мы могли бы оставить @EnableConfigurationProperties пустым, если бы DataSourcesConfiguration был аннотирован, например, аннотацией @Component, которая регистрирует его как Spring Bean. Надеюсь это поможет!

Emanuel Miranda 09.05.2018 14:48

Для удобства @ConfigurationPropertiesScan снабжен метааннотациями @EnableConfigurationProperties, поэтому, если вы выполните сканирование своего пакета config, в котором вы храните все классы свойств, он также будет иметь общие свойства конфигурации включить. Я аннотировал свой основной @SpringBootApplication с помощью @ConfigurationPropertiesScan("com.my.config"), и свойства, наконец, были обнаружены как beans и были автоматически подключены из-за сканирования из этого единственного места.

George Pantazes 18.02.2020 00:23

@EmanuelMiranda Небольшое уточнение. DataSourcesConfiguration не регистрирует сам как bean-компонент. Но в конце концов он зарегистрирован как bean-компонент @EnableConfigurationProperties. Так или иначе, аннотированный класс @ConfigurationProperties должен быть зарегистрирован как bean-компонент.

Lu55 28.09.2020 20:44

Мне потребовалось время, чтобы добраться до этого поста, но я хотел бы добавить сюда, чтобы другие могли получить пользу.

@ConfigurationProperties - используется для привязки класса к внешнему файлу свойств. Очень мощный и должен использоваться для разделения классов компонентов с классом сущности конфигурации.

@Configuration - создает компонент Spring стереотипа конфигурации.

@EnableConfigurationProperties - создает привязку между классом объекта конфигурации и стереотипом конфигурации Spring, чтобы после внедрения в пределах службы можно было легко получить свойства.

Другие вопросы по теме