SpringBoot(三):SpringBoot启动原理

* 查看SpringBoot启动原理

1.SpringBoot启动入口

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloWorldApplication {

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

}

我们开发的任意一个项目,都有相同的启动入口。
其中,我们主要要分析@SpringBootApplicationSpringApplication.run(),搞清楚这两个,我觉得SpringBoot启动原理应该可以搞清楚。

2.@SpringBootApplication

Many Spring Boot developers like their apps to use auto-configuration, component scan and be able to define extra configuration on their "application class".
可以看出,一个@SpringBootApplication注解有自动配置,组建扫描,定义额外配置。
其中,起到关键作用的三个注解:

  • @EnableAutoConfiguration: 开启自动配置功能
  • @ComponentScan:
  • @SpringBootConfiguration:SpringBoot配置类
    image.png

    image.png

2.1 @SpringBootConfiguration

标注在某个类上面,就说明这是SpringBoot的配置类
点击去可以看到@Configuration。可以查看@configuration介绍

2.2 @EnableAutoConfiguration

开启自动配置功能,将所有符合条件的bean定义自动添加到IOC容器中。点击可看到:

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

其中@AutoConfigurationPackage再点进去,可以看到:

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

}
  • @Import(AutoConfigurationPackages.Registrar.class):给容器中导入组件,根据AutoConfigurationPackages.Registrar.class,导入符合的类
    image.png

    image.png

    可以看出来,将标准@SpringBootApplication所在包下的所有组件扫描到Spring IOC容器中。
  • @Import(AutoConfigurationImportSelector.class):给容器中导入组件,根据AutoConfigurationImportSelector选择器选择导入哪些组件添加到Spring IOC容器中。
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
        ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
 ···
 //判断是否开启自动配置
 protected boolean isEnabled(AnnotationMetadata metadata) {
        if (getClass() == AutoConfigurationImportSelector.class) {
            return getEnvironment().getProperty(EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true);
        }
        return true;
    }
 
 protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
            AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        }
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        List configurations = getCandidateConfigurations(annotationMetadata, attributes);
        configurations = removeDuplicates(configurations);
        Set exclusions = getExclusions(annotationMetadata, attributes);
        checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = filter(configurations, autoConfigurationMetadata);
        fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationEntry(configurations, exclusions);
    }
        
}
image.png

image.png

image.png

image.png

image.png

SpringBoot启动的时候将autoconfigure-2.2.5.RELEASE.jar!/META-INF/spring.factories中符合条件的配置类添加到IOC容器中,无需手动配置。

2.3 @ComponentScan

在指定的包中扫描符合条件的组件并添加到IOC容器中。

/*********启动步骤待更新,这里大概了解一下******/

你可能感兴趣的:(SpringBoot(三):SpringBoot启动原理)