SpringBoot启动类核心注解及SpringBoot的启动机制
@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}
)}
)
-
@SpringBootApplication:是SpringBoot中的最核心注解,用于开启自动配置和启动SpirngBoot项目的前置条件。
- @ComponentScan:用于扫描被@Component注解标注的类,用于交给SpringBoot管理并注入bean容器。也即是控制反转IOC的实现方式。不过虽然其中含有这个扫描注解,但也可以在启动类上添加@ComponentScan注解进一步标点其扫描的范围,而不需要关系SpringBoot的启动类的位置。
- @EnableAutoConfiguration:借助@Import的支持,收集和注册特定场景相关的bean定义。其借助@Import(AutoConfigurationImportSelector.class)注解使用AutoConfigurationImportSelector将所有被@Configuration注解标注的类加载并注入到ioc容器中。
- SpringFactoriesLoader类:其主要是从特点的配置文件META-INF/spring.factories中加载配置。配合@EnableAutoConfiguration注解使用时,@EnableAutoConfiguration注解会优先找到这个加载文件并将其中的配置汇总为一个配置类并加载到ioc容器中。
- @SpringBootConfiguration:其功能和@Configuration注解功能类似,都是声明这个类为配置类并加载到ioc容器中
- @Inherited :表示这个使用这个注解的类被继承了之后。我子类也会继承这个注解。表示注解继承的概念。
- @Documented: 用于记录的注解
- @Retention():其中RetentionPolicy是一个枚举类,拥有标定这个注释的保留时间
- @Target():表示该注解的可标定范围,类或方法或属性等等。
-
SpringBoot的启动流程机制:有SpringApplication类的run()方法来实现项目的启动
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MyApplication.class);
Environment nev = app.run(args).getEnvironment();//可以拿到在启动后的端口数据和主机地址
//SpringApplication.run(MyApplication.class, args); //寻常启动方式
}
- 首先向SpringApplication的实例对象中传入启动类的class对象,根据这个传入的实例对象的classpath,并使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer(应用程序上下文初始化器)和ApplicationListener(应用程序监听器)
- 首先使用在上下文中拿到的所有应用监听器,分别遍历的调用它们的SpringApplicationRunListener类的started()方法,使其启动
- 创建并配置SpringBoot需要用到的Environment配置,包括主机编号和端口号等
- 环境准备好了之后,再次调用监听器SpringApplicationRunListener的environmentPrepared()方法,加载环境变量并进行下一步动作
- 若使用了banner,则打印横幅,启动的图像,代表SpringBoot开始启动
- 通过前置配置创建ApplicationContext并将环境参数传入其中
- 创建好应用程序上下文之后,再次使用SpringFactoriesLoader遍历查找加载classpath下的ApplicationContextInitializer类并调用initialize(applicationContext)方法完成上下文的初始化操作
- 在完成初始化操作之后,再将之前通过注解等方式获取到的ioc容器中的配置类加载到准备完毕的ApplicationContext中
- 再遍历调用SpringApplicationRunListener监听器的contextLoaded()方法,告知监听器初始化操作已经完成
- 完成上下文的基本配置后,再调用ApplicationContext的refresh()方法,完成IOC容器的所有与初始化操作
- 查找ApplicationContext中的所有存在的CommandLineRunner,遍历的执行这些命令行操作
- 最后,再调用SpringApplicationRunListener的finished()方法,完成整个时间的监听过程。