SpringBoot启动原理简析

1.启动类

@SpringBootApplication
public class MybootApplication {

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

2.@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 {
    ......
}

2.1 @SpringBootConfiguration

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

2.2 @ComponectScan

@ComponentScan对应XML配置中的元素,其功能就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。

2.3 @EnableAutoConfiguration

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

@EnableAutoConfiguration借助@Import将所有符合自动配置条件的bean定义加载到IoC容器。具体实现通过AutoConfigurationImportSelector类借用SpringFactoriesLoader相关机制读取META-INF/spring.factories文件配置,并通过反射实例化对象。


SpringBoot启动原理简析_第1张图片

2.3.1 自动化配置

SpringBoot启动原理简析_第2张图片

SpringBoot启动原理简析_第3张图片

3.源码流程

SpringBoot启动原理简析_第4张图片

4.扩展点

4.1 SpringApplicationRunListener

SpringBoot应用的main方法执行过程中用于接收不同执行点事件通知的监听器,通常无需自定义,如果手动实现时,需要注意该类的构造器包含两个参数,参数sa就是SpringApplication,参数args是参数列表。同时,需要在classpath目录下META-INF/spring.fatories填写自定义的Listener。

4.2 ApplicationListener

Spring原有机制,属于Spring框架对Java中实现的监听者模式的一种框架实现,有两种实现方式:

  • 通过SpringApplication.addListeners(…)或者SpringApplication.setListener(…)方法添加一个或者多个自定义的ApplicationListener。
  • 借助SpringFactoriesLoader机制,在SpringBoot的项目自定义的META-INF/spring.factories文件中添加配置。

4.3 ApplicationContextInitializer

主要作用就是在ConfigurableApplicationContext类型(或者子类型)的ApplicationContext做refresh之前,允许我们对ConfiurableApplicationContext的实例做进一步的设置和处理,并在META-INF/spring.factories文件中添加配置。

4.4 CommandLineRunner

SpringBoot应用特定的回调扩展接口

@FunctionalInterface
public interface CommandLineRunner {

    void run(String... args) throws Exception;
}
  • 所有CommandLineRunner的执行时间点是在SpringBoot应用的Application完全初始化工作之后(可以认为是SpringBoot应用启动类main方法执行完成之前的最后一步)。
  • 当前SpringBoot应用的ApplicationContext中的所有CommandLinerRunner都会被加载执行(无论是手动注册还是被自动扫描注册到IoC容器中)。

参考文献
SpringBoot启动原理解析
SpringBoot源码解析
SpringBoot启动原理及源码
Spring Boot 2.x 启动全过程源码分析(全)
SpringBoot启动流程源码分析
SpringBoot扩展点详解
<>

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