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文件配置,并通过反射实例化对象。
2.3.1 自动化配置
3.源码流程
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揭秘 快速构建微服务体系>>