Как классы, аннотированные @ ConfigurationProperties, обнаруживаются автоматически с помощью аннотации @SpringBootApplication - PullRequest
0 голосов
/ 10 января 2020

Я изучаю Spring Boot и у меня есть вопрос с одним примером в справочной документации. В следующем разделе документации упоминается

6. Использование аннотации @SpringBootApplication

Одну аннотацию @SpringBootApplication можно использовать для включения этих трех функций, а именно:

@ EnableAutoConfiguration: включить механизм автоконфигурации Spring Boot

@ ComponentScan: включить сканирование @Component для пакета, в котором находится приложение (см. Рекомендации)

@ Конфигурация: позволяет зарегистрировать дополнительные компоненты в контексте или импортировать дополнительные классы конфигурации

и следующий пример к заменяет эту единственную аннотацию на любую из функций, которые она включает , меня немного смущает. Пример

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {

    public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
    }

}

Объяснение для примера

В этом примере Application аналогично любому другому приложению Spring Boot, за исключением того, что @ классы с аннотациями компонентов и @ ConfigurationProperties аннотированные классы не обнаруживаются автоматически , а определяемые пользователем bean-компоненты импортируются явно (см. @Import).

Единственное существенное отличие, которое я вижу в примере кода Выше указано, что у него нет аннотации @ComponentScan. Я также прочитал в разделе комментариев SO ответ (Стефан Николл, 5 мая, 17 в 11:07), что аннотация @Component официально не рекомендуется для автоматического определения @ConfigurationProperties. Поэтому я предполагаю, что классы среды Spring с @ConfigurationProperties не аннотируются @ Component.

Также я проверил источник аннотации @SpringBootApplication и не смог определить ничего, что должно включить автоматическое c обнаружение @ConfigurationProperties аннотированные классы.

Справочный документ 2.8.3. В разделе «Включение аннотированных типов @ ConfigurationProperties » показан следующий способ сканирования и автоопределения @ ConfigurationProperties

@SpringBootApplication
@ConfigurationPropertiesScan({ "com.example.app", "org.acme.another" })
public class MyApplication {
}

Со всеми этими подробностями я хотел бы понять,

Почему это явно упоминается для этого примера, что @ аннотированные классами ConfigurationProperties классы не обнаруживаются автоматически ? и Как аннотированные классы @ConfigurationProperties автоматически обнаруживаются при использовании @SpringBootApplication.

Дополнительное примечание: я обнаружил небольшую разницу между предыдущей версией документации и текущей один. В следующей ссылке отсутствует текущая ссылка

Имейте в виду, что аннотация @EnableConfigurationProperties также автоматически применяется к вашему проекту, так что любой существующий компонент, аннотированный @ConfigurationProperties, настраивается из Environment

1 Ответ

0 голосов
/ 11 января 2020

Вот что я понимаю из своего анализа.

@ConfigurationProperties аннотированные типы могут быть зарегистрированы в ApplicationContext с помощью

  1. Аннотирование класса с помощью @ConfigurationProperties с помощью аннотация, которая попадает в область действия @ComponentScan (@Component, @Service и т.п.). Не рекомендуется согласно комментарию от Стефана Николла, который имеет смысл для меня сейчас.

  2. Использование аннотации @EnableConfigurationProperties. Чтобы это работало, класс, аннотированный @EnableConfigurationProperties, должен быть аннотирован аннотацией, попадающей в область действия @ComponentScan (@Component, @Service и т. П.)

  3. Используя аннотацию @ConfigurationPropertiesScan и убедившись, что классы, отмеченные @ConfigurationProperties, размещены под его радаром. Использование аналогично @ComponentScan.

Теперь, когда мы заменим @SpringBootApplication отдельными аннотациями, которые он включает, и пропустим @ComponentScan (как в примере), @EnableConfigurationProperties способ (пункт 2) регистрации типов с помощью @ConfigurationProperties не будет работать. Это, вероятно, отвечает на мои вопросы о том, почему и как.

Это было явно упомянуто, вероятно, потому что связь между @EnableConfigurationProperties и @ComponentScan не так очевидна для таких людей, как я.

Дополнительные сведения.

Регистрация @ConfigurationProperties аннотированных типов при использовании @EnableConfigurationProperties происходит посредством класса EnableConfigurationPropertiesRegistrar, который импортируется аннотацией

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EnableConfigurationPropertiesRegistrar.class)
public @interface EnableConfigurationProperties {..}
...