SpringBoot的启动机制
两大原理
SpringBootApplication原理
@SpringBootApplication注解的原理与@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration等注解有关。
@SpringBootConfiguration
与@SpringBootConfiguration注解原理相关的是@Configuration和一些其他的元注解。
SpringBoot能去除xml配置的原因就在于使用了@Configuration这个注解。该注解的作用就是将当前类声明为配置类。同时还可以使用@bean注解将类以方法的形式实例化到spring容器,其中方法名即为实例名。
@ComponentScan
@ComponentScan的作用就是扫描当前包以及子包,将有@Component,@Controller,@Service,@Repository等注解的类注册到容器中,以便调用。
注解@Mapper不是这个注解扫描的,而是在启动类上加@MapperScan。
@EnableAutoConfiguration
@Import(AutoConfigurationImportSelector.class)包含一个selectImports()方法,该方法包括getAutoConfigurationEntry()方法,该方法读取classpath下的META-INF/spring.factories文件的配置,将相应的bean的配置项读取出来,通过反射机制实例化为配置文件,然后注入spring容器。
SpringApplication.run()原理
创建SpringApplication实例化对象后调用执行run方法。
创建SpringApplication实例化对象
获取应用类型
包含三种类型:
- NONE: 非web应用,即不会启动服务器。
- SERVLET: 基于servlet的web应用。
- REACTIVE: 响应式web应用(暂未接触过)。
Servlet是一种运行在Web服务器或应用服务器上的程序,作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。它是Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。
获取初始化器
在META-INF/spring.factories配置文件里获取初始化器,然后实例化、排序后再设置到initializers属性中。
获取监听器
在META-INF/spring.factories配置文件里获取监听器,然后实例化。
定位main方法
遍历获取main方法所在的类并且返回对应的位置。
调用执行run方法
- 启动监听器
- 创建上下文
- 开启日志
- 读取配置文件