Изучение аннотаций Spring Boot @SpringBootApplication (1)

Spring Boot

@SpringBootApplication@Configuration@Configuration загружает методы Spring1. @Configuration настраивает Spring и запускает контейнер Spring2. @Configuration запускает контейнер + @Bean регистрирует bean-компонент3. @Configuration запускает контейнер + @Component регистрирует bean-компонент4. Два метода регистрации класса AppContext с помощью AnnotationConfigApplicationContext5. Настройте веб-приложение (AnnotationConfigApplicationContext настраивается в файле web.xml)Объединение нескольких классов конфигурацииВведите XML-файл конфигурации spring в @configuration.Введите другие конфигурации аннотаций в @configuration@configuration вложенность (вложенная конфигурация должна быть статическим классом)@EnableAutoConfigurationAutoConfigurationImportSelector

@SpringBootApplication

При разработке с использованием среды Springboot мы обычно добавляем к основной функции@SpringBootApplicationАннотации, позволяющие приложению автоматически настраивать сканирование компонентов.

@SpringBootApplication
public class Application {

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

@SpringBootApplicationАннотация эквивалентна использованию свойства по умолчанию.@Configuration,@EnableAutoConfigurationа также@ComponentScan,

Проверьте это здесь@SpringBootApplicationАннотированный исходный код.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

}

Почему@SpringBootApplication注解не содержит@Configuration, на самом деле в@SpringBootConfigurationв :

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

@SpringBootConfigurationунаследовано от@Configuration, функции этих двух также одинаковы, помечая текущий класс как класс конфигурации, и изменят один или несколько объявленных в текущем классе с помощью@BeanЭкземпляр метода, отмеченный аннотацией, включается в контейнер Spring, а имя экземпляра является именем метода.

Далее мы представим три аннотации, упомянутые выше.

@Configuration

Начиная с Spring 3.0,@ConfigurationИспользуется для определения классов конфигурации, которые могут заменить файлы конфигурации xml.Аннотированный класс содержит один или несколько@Beanаннотированные методы, которые будутAnnotationConfigApplicationContextилиAnnotationConfigWebApplicationContextКлассы сканируются и используются для создания определений bean-компонентов и инициализации контейнера Spring.

Уведомление:@ConfigurationАннотированные классы конфигурации имеют следующие требования:

  1. не может быть конечным типом;
  2. не может быть анонимным классом;
  3. Вложенная конфигурация должна быть статическим классом.

@Configuration загружает методы Spring

1. @Configuration настраивает Spring и запускает контейнер Spring

@ConfigurationМаркировка на классе эквивалентна использовать класс как в файле конфигурации XML, который используется для настройки контейнера пружины (контекст приложения).

@Configuration
public class TestConfiguration {

    public TestConfiguration(){
        System.out.println("TestConfiguration容器启动初始化。。。");
    }
}

Эквивалентно

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd" default-lazy-init="false">
    <bean id="testConfiguration" class="com.example.configuration.TestConfiguration"></bean>
</beans>

Основной метод проверки:

public class TestMain {

    public static void main(String[] args) {
        // @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
//        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfiguration.class);

        //通过加载 spring-context.xml文件,此时将TestConfiguration上的注解取消
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
    }
}

Есть две реализации вышеуказанного метода, которые можно протестировать отдельно, и получить следующие результаты:

21:18:29.599 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testConfiguration'
TestConfiguration容器启动初始化。。。
2. @Configuration запускает контейнер + @Bean регистрирует bean-компонент

@BeanАннотированный к методу (метод, возвращающий экземпляр), он эквивалентен XML-файлу конфигурации Spring: регистрация объекта bean-компонента.

класс бобов:

public class TestBean {
    private String username;
    private String url;
    private String password;

    public void sayHello(){
        System.out.println("TestBean sayHello...");
    }

    public String toString(){
        return "username:"+this.username+",url:"+this.url+",password:"+this.password;
    }

    public void start(){
        System.out.println("TestBean 初始化。。。");
    }

    public void cleanUp(){
        System.out.println("TestBean 销毁。。。");
    }
}

Класс конфигурации:

@Configuration
public class TestConfiguration2 {
    public TestConfiguration2(){
        System.out.println("TestConfiguration容器启动初始化。。。");
    }

    @Bean
    @Scope("prototype")
    public TestBean testBean(){
        return new TestBean();
    }
}

Класс тестирования основного метода:

public class TestMain2 {

    public static void main(String[] args) {
        // @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfiguration2.class);

        //获取 Bean
        TestBean testBean = (TestBean) applicationContext.getBean("testBean");
        testBean.sayHello();
        System.out.println(testBean.hashCode());

        //再次获取 bean,如果testBean方法上没加@Scope(“prototype”),则@Bean注解默认作用域为单例singleton作用域,所以返回的都是同一个对象
        TestBean testBean1 = (TestBean) applicationContext.getBean("testBean");
        System.out.println(testBean1.hashCode());
    }
}

Когда класс Bean не добавляет@Scope("prototype")Вывод при аннотировании:

09:12:58.279 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testConfiguration2'
TestConfiguration容器启动初始化。。。
09:12:58.282 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testBean'
TestBean sayHello...
2143437117
2143437117

плюс@Scope("prototype")Вывод при аннотировании:

09:13:42.796 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testConfiguration2'
TestConfiguration容器启动初始化。。。
TestBean sayHello...
1989335500
1978869058

В заключение:

  1. @BeanАннотируется к методу, возвращающему экземпляр, если он не передан@BeanУкажите имя компонента, значение по умолчанию совпадает с отмеченным именем метода;
  2. @BeanОбластью действия аннотации по умолчанию является одноэлементная одноэлементная область, доступ к которой можно получить через@Scope("prototype")установить область прототипа;
  3. теперь, когда@BeanРоль заключается в регистрации объекта bean-компонента, после чего его можно использовать полностью@Component,@Controller,@Service,@RipositoryПодождите, пока аннотация зарегистрирует бин, конечно, вам нужно настроить@ComponentScanАннотации сканируются автоматически.
3. @Configuration запускает контейнер + @Component регистрирует bean-компонент

класс бобов:

package com.example.domain;

import org.springframework.stereotype.Component;

@Component
public class BeanWithComponent {

    public void sayHello(){

        System.out.println("BeanWithComponent sayHello...");
    }

    public void start(){
        System.out.println("BeanWithComponent 初始化。。。");
    }

    public void cleanUp(){
        System.out.println("BeanWithComponent 销毁。。。");
    }
}

Класс конфигурации:

@Configuration
@ComponentScan(basePackages = "com.example.domain")
public class ComfigureWithScan {

    public ComfigureWithScan(){
        System.out.println("spring容器启动初始化。。。");
    }
}

Класс тестирования основного метода:

public class TestComponnet {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(ComfigureWithScan.class);

        BeanWithComponent bean = (BeanWithComponent) context.getBean("beanWithComponent");
        bean.sayHello();
        System.out.println(bean);

        BeanWithComponent bean2 = (BeanWithComponent) context.getBean("beanWithComponent");
        System.out.println(bean2);
    }
}

Результат выполнения:

10:03:56.791 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'comfigureWithScan'
spring容器启动初始化。。。
10:03:56.796 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanWithComponent'
BeanWithComponent sayHello...
com.example.domain.BeanWithComponent@d706f19
com.example.domain.BeanWithComponent@d706f19

Как видно из результатов, использование@ComponentАннотация+@ComponentScanэквивалентно использованию@Beanне добавлять@ScopeAnnotation, то есть полученный объект bean-компонента является одним и тем же объектом.

4. Два метода регистрации класса AppContext с помощью AnnotationConfigApplicationContext

А. Класс конфигурации регистрируется путем передачи его вAnnotationConfigApplicationContextКонструктор

public class TestComponnet {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(ComfigureWithScan.class);

    }
}

Не делайте,AnnotationConfigApplicationContextМетод регистрации передается в класс конфигурации для регистрации класса конфигурации.

public class TestComponnet {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(ComfigureWithScan.class);
        context.refresh();
        ApplicationContext ctx = context;

    }
}

Этот метод на самом делеAnnotationConfigApplicationContextДля раздельного использования конструктора обратитесь к исходному коду этой части следующим образом:

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
    this();
    this.register(componentClasses);
    this.refresh();
}

Примечание. Код этой части в Интернете выглядит следующим образом:

public static void main(String[] args) {
  ApplicationContext ctx = new AnnotationConfigApplicationContext();
  ctx.register(AppContext.class)
}

Мы не знаем, почему они все могут пройти тест, в любом случае, я не могу написать такой код локально, поэтому мы можем только реализовать его по-другому. Взгляните сюдаAnnotationConfigApplicationContextДиаграмма иерархии структуры классов:

Что касается анализа этого класса, мы узнаем об этом позже.

5. Настройте веб-приложение (AnnotationConfigApplicationContext настраивается в файле web.xml)

Раньше вы обычно использовалиXmlWebApplicationContextContext для настройки веб-приложения Spring, указав путь к внешнему XML-файлу контекста в файле дескриптора веб-развертывания web.xml.XMLWebApplicationContext— класс контекста по умолчанию, используемый веб-приложениями. Следующий код описывает файл web.xml, на который будет указыватьContextLoaderListenerЭлемент внешнего XML-файла контекста, загружаемый классом прослушивателя.

<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <servlet>
    <servlet-name>sampleServlet</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    </servlet>
...
</web-app>

Теперь вы измените приведенный выше код в web.xml, чтобы использоватьAnnotationConfigApplicationContextДобрый. Запомнить,XmlWebApplicationContext— это реализация контекста по умолчанию, которую Spring использует для веб-приложений, поэтому вам никогда не придется явно указывать этот класс контекста в вашем файле web.xml. Теперь вы будете использовать конфигурацию на основе Java, поэтому при настройке веб-приложения вам нужно будет указать в файле web.xmlAnnotationConfigApplicationContextДобрый. Приведенный выше код будет изменен следующим образом:

<web-app>
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.
            support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            demo.AppContext
        </param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <servlet>
    <servlet-name>sampleServlet</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.
            support.AnnotationConfigWebApplicationContext
        </param-value>
    </init-param>
    </servlet>

...
</web-app>

Изменено вышеweb.xmlтеперь определеноAnnotationConfigWebApplicationContextКласс контекста как часть параметров контекста и элементов сервлета. Местоположение конфигурации контекста теперь указывает наAppContextКласс конфигурации.

Объединение нескольких классов конфигурации

Введите XML-файл конфигурации spring в @configuration.

Класс конфигурации:

@Configuration
@ImportResource("classpath:applicationContext-configuration.xml")
public class TestConfiguration2 {
    public TestConfiguration2(){
        System.out.println("TestConfiguration2容器启动初始化。。。");
    }

//    @Bean
//    @Scope("prototype")
//    public TestBean testBean(){
//        return new TestBean();
//    }
}

класс бобов:

public class TestBean {

    public void sayHello(){

        System.out.println("TestBean sayHello...");
    }

    public void start(){
        System.out.println("TestBean 初始化。。。");
    }

    public void cleanUp(){
        System.out.println("TestBean 销毁。。。");
    }
}

applicationContext-configuration.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd" default-lazy-init="false">
    <bean id = "testBean" class="com.example.domain.TestBean"></bean>
</beans>

Тестовый класс:

public class TestMain2 {

    public static void main(String[] args) {
        // @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfiguration2.class);

        //获取 Bean
        TestBean testBean = (TestBean) applicationContext.getBean("testBean");
        testBean.sayHello();
        System.out.println(testBean);

        TestBean testBean1 = (TestBean) applicationContext.getBean("testBean");
        System.out.println(testBean1);
    }
}

Результат выполнения:

16:35:28.837 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testConfiguration2'
TestConfiguration2容器启动初始化。。。
16:35:28.852 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testBean'
TestBean sayHello...
com.example.domain.TestBean@78aab498
com.example.domain.TestBean@78aab498

Хотя такая комбинация может дать тот же эффект, кажется проще использовать аннотацию @Bean непосредственно в классе конфигурации.

Введите другие конфигурации аннотаций в @configuration

Измените класс конфигурации:

@Configuration
@ImportResource("classpath:applicationContext-configuration.xml")
@Import(TestConfiguration.class)
public class TestConfiguration2 {

}

Остальное содержимое остается без изменений, а результаты выполнения следующие:

16:40:40.239 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.example.configuration.TestConfiguration'
TestConfiguration容器启动初始化。。。
16:40:40.239 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'testBean'
TestBean sayHello...
com.example.domain.TestBean@12e61fe6
com.example.domain.TestBean@12e61fe6
@configuration вложенность (вложенная конфигурация должна быть статическим классом)

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

класс бобов:

package com.example.domain;
@Component
public class BeanWithComponent {

    public void sayHello(){

        System.out.println("BeanWithComponent sayHello...");
    }

    public void start(){
        System.out.println("BeanWithComponent 初始化。。。");
    }

    public void cleanUp(){
        System.out.println("BeanWithComponent 销毁。。。");
    }
}
package com.example.domain;
public class DataSource {

    @Override
    public String toString() {
        return "I am DataSource";
    }
}

Класс конфигурации:

@Configuration
@ComponentScan(basePackages = "com.example.domain")
public class ComfigureWithScan2 {

    public ComfigureWithScan2(){
        System.out.println("spring容器启动初始化。。。ComfigureWithScan2");
    }

    @Configuration
    static class DataConfigure{
        @Bean
        DataSource dataSource(){
            return new DataSource();
        }
    }
}

Тестовый класс:

public class TestComponnet2 {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(ComfigureWithScan2.class);

        BeanWithComponent bean = (BeanWithComponent) context.getBean("beanWithComponent");
        bean.sayHello();

        DataSource dataSource = (DataSource) context.getBean("dataSource");
        System.out.println(dataSource);
    }
}

Результат выполнения:

16:55:10.429 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'comfigureWithScan2'
spring容器启动初始化。。。ComfigureWithScan2
16:55:10.429 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanWithComponent'
16:55:10.429 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.example.configuration.ComfigureWithScan2$DataConfigure'
16:55:10.429 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dataSource'
BeanWithComponent sayHello...
I am DataSource

Ссылка на ссылку: https://www.cnblogs.com/duanxz/p/7493276.html

@EnableAutoConfiguration

@EnableAutoConfigurationЗагрузите все определения bean-компонентов, подходящие для автоматической настройки, в контейнер Ioc с помощью @Import.

@EnableAutoConfigurationЭто также составная аннотация, и ее исходный код выглядит следующим образом:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

Среди них важнейшее@Import({AutoConfigurationImportSelector.class}), с помощьюAutoConfigurationImportSelectorэтот класс,@EnableAutoConfigurationЭто может помочь приложениям SpringBoot загружать все подходящие @configurations в текущий контейнер Ioc, созданный и используемый SpringBoot.

AutoConfigurationImportSelector

До SpringBoot 1.5 использованиеEnableAutoConfigurationImportSelector, который наследуется отAutoConfigurationImportSelector, через 1,5,EnableAutoConfigurationImportSelectorБольше не рекомендуется, но рекомендуетсяAutoConfigurationImportSelector.

когда это выполняется

Он будет использоваться при запуске Springboot.ConfigurationClassParserразобрать@ConfigurationМодифицированный класс конфигурации, а затем обработайте случай, когда класс изменен другими аннотациями, такими как@Importаннотация,@ComponentScanаннотация,@BeanЗаметки и т. д.

Если обнаружено, что аннотация существует@Import(ImportSelector), создается соответствующий объект importSelector и вызывается его метод selectImports, иAutoConfigurationImportSelectorЭто класс реализации ImportSelector. Дополнительный анализ ConfigurationClassParser см. в статье:Примечания к записи на весенние занятия

Таким образом, ConfigurationClassParser создаст экземплярAutoConfigurationImportSelectorи вызовите его метод selectImports().

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    } else {
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
        AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
}

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    } else {
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        configurations = this.removeDuplicates(configurations);
        Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
        this.checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = this.filter(configurations, autoConfigurationMetadata);
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    }
}

Существует метод под названием GetAutoconfigurationEnterentry () в методе Selectimports. Вход и проверьте этот метод, чтобы увидеть код для получения класса конфигурации, в частности, метод getCAndateConfigurations (), нажмите для просмотра его конкретной реализации:

Ключевой класс автоматической конфигурации: SpramFactory

Основная функция SpringFactoriesLoader — запуск из указанного конфигурационного файла.META/spring.factoriesЧтобы загрузить конфигурацию, spring.factories — это типичный файл свойств Java, а формат конфигурации — в формате «ключ-значение», за исключением того, что ключ и значение — это полные имена классов типов Java.

Войдя в метод loadFactoryNames(), вы обнаружите, что loadFactoryNames() считывает файл META-INF/spring.factories в ClassPath.

существует@EnableAutoConfigurationВ сценарии больше поддержки функции для поиска конфигурации, то есть по полному имени класса @EnableAutoConfigurationorg.springframework.boot.autoconfigure.EnableAutoConfigurationВ качестве ключа поиска получите соответствующий набор@ConfigurationДобрый.

Из-за длины статьи описание аннотации @Component помещено в следующую главу, добро пожаловать на просмотр!