Springboot 项目的整个启动流程
要从注解讲起否则就是耍流氓
@SpringBootApplication注解
讲解:该注解是一个复合注解,它由三个注解组成。
①@SpringBootConfiguration(打开是@Configuration):表明这是一个java配置类
②@EnableAutoConfiguration:自动配置注解,会将所有符合自动配置条件的@Configuration配置加载到IOC容器中。
③@ComponentScan:扫描注解,自动扫描符合条件的组件 (@Service,@Component)或者bean定义,记载到IOC容器中
springBoot的启动流程
从spring.factories配置文件中加载EventPublishingRunListener对象,该对象拥有SimpleApplicationEventMulticaster属性,即在springboot启动过程的不同阶段用来发射内置的生命周期事件。
准备环境变量,包括系统变量,环境变量,命令行参数,默认变量,servlet相关配置变量,随机值及配置文件(比如application.properties)等
控制台打印springboot的bannner标志
根据不同类型环境创建不同类型的applicationcontext容器,如果是servlet环境,创建的就是AnnotationConfigServletWebServerApplicatonContext容器对象
从spring.factories配置文件中加载FailureAnalyZers对象,用来报告springboot启动过程中的异常
为刚创建的容器对象做一些初始化工作,准备一些容器属性值等,对ApplicationContext应用一些相关的后置处理和调用各个ApplicationContextInitializer的初始化方法来执行一些初始逻辑等
刷新容器,这一步至关重要。比如调用bean factory的后置处理器,注册BeanPostProcessor后置处理器,初始化事件广播器且广播事件,初始化剩下的单例bean和springboot创建内嵌的Tomcat服务器等重要且复杂的逻辑都在这里实现
执行刷新新容器后的后置处理逻辑,注意这里为空方法
调用ApplicationRunner和CommandLineRunner的run方法,我们实现这两个接口可以在spring容器启动后需要的一些东西 比如加载一些业务数据等
报告启动异常,即若启动过程中抛出异常,此时哟个FailureAnalyzers来报告异常
最终返回容器对象,这里调用方法没有声明对象来接收