0


SpringBoot的启动原理

1、@SpringBootApplication注解

启动类注解,该注解包含下面三个注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@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 {
//省略
}

2、@SpringBootConfiguration

几乎和**@Configuration**注解没有区别,标识这是一个配置类。

3、@EnableAutoConfiguration

从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中
org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的lOC容器配置类,然后汇总为一个,并加载到loC容器。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

    /**
     * Environment property that can be used to override when auto-configuration is
     * enabled.
     */
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    /**
     * Exclude specific auto-configuration classes such that they will never be applied.
     * @return the classes to exclude
     */
    Class<?>[] exclude() default {};

    /**
     * Exclude specific auto-configuration class names such that they will never be
     * applied.
     * @return the class names to exclude
     * @since 1.3.0
     */
    String[] excludeName() default {};

}

该注解包含下面两个个注解:

  • @AutoConfigurationPackage:

   
  • @Import(AutoConfigurationImportSelector.class):

  1. @EnableAutoConfiguration注解导入了AutoConfigurationImportSelector类,它负责查找所有的配置类。
  2. AutoConfigurationImportSelector类中的selectImports方法会查询META-INF/spring.factories文件,这个文件列出了所有Spring Boot的自动配置类【原理参考扩展中的5.1】。
  3. 对于每一个自动配置类,Spring会检查@Conditional注解,只有满足条件的配置类才会被实例化。
#AutoConfigurationImportSelector

源码:

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
        ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }

    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        }
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
        configurations = removeDuplicates(configurations);
        Set<String> ex
标签: spring boot java spring

本文转载自: https://blog.csdn.net/qq_19952029/article/details/140358771
版权归原作者 Hiker帝国 所有, 如有侵权,请联系我们删除。

“SpringBoot的启动原理”的评论:

还没有评论