一、启动原理
1.main方法是入口,传入主配置类和args
2.进入springbootApplicati的run方法:先创建SpringAppcition对象,再执行run方法
3.如何创建对象
3.1 先把主对象保存
3.2 再判断是不是web应用
3.3 然后加载initializers类
3.31 先创建主线程的类加载器 ClassLoader classLoader = Thread.currentThread().getConTextClassLoader()
3.32 从classLoader中获取指定的url:classLoader.getResources("META.INF/spring.factories") ;
3.33 通过url,可以获取到Properties
3.34 再传入ApplicationContextInitializer.class,从Properties中获取指定的资源
3.35 找到这6个资源
3.4 创建listeners类
5.找到有main方法的主配置类
6.创建对象的所有操作如下图
7.run方法,启动应用
7.1 从类路径下META-INF/spring/factories,获取SpringApplicationListeners(所以该监听需要配置)
7.2 回调所有SpringApplicationListeners的start方法
7.3 prepareEnvironment:创建ioc环境运行需要的环境,里面还有回调SpringApplicationListeners的prepared方法
7.4 创建ApplicationContext(IOC容器):根据上面是否web应用,创建web的ioc还是普通的ioc,里面是用beanUtils.instantiate,反射出来
7.5 new failureAnalyzers //做异常分析报告
7.6 prepareContext(context,environment,listeners)准备上下文环境:传入ioc容器,ioc运行需要的环境,监听
7.61 将enviroment环境保存到ioc
7.62 applyInitailizer(context):将之前保存的initailzer的6个对象,传入ioc,回调initailzer的initialize方法
7.63 回调springApplicationListeners的contextPrepared方法
7.64 回调springApplicationListener的contextLoad方法
7.7 refreshContext(context):IOC容器初始化,调用父类的AbstractApplicationContext,加载所有的配置类、组件、bean
7.8 afterRefresh():从ioc容器中,获取ApplicationRunner(先回调)和CommandRunner(后回调)进行回调
7.9 所有的SpringApplicationRunner回调所有的finished方法
8.0 整个springboot应用启动完成后,返回ioc容器
二、代码实现以上这几种监听
1.ApplicationContextInitializer
2.SpringApplicationRunListener 这2种是配置在META-INF/spring.factories
3.ApplicationRunner
4.CommandRunner 这二种注入到ioc容器即可
三、springboot自定义场景启动器
1.Springboot的一个比较厉害的地方是,有众多的场景启动器,如下,引入场景启动器,Springboot就会自动的引入相关依赖,配置
2.自定义starters,自己写好starters,别人可以引用
2.1 如何编写自动配置
2.11 @Configuration //编写这个类是一个配置类
2.12 @ConditionOnXXX //在指定条件成立的情况下自动配置类生效
2.13 @AutoConfigurationAfter //指定自动配置类的顺序
2.14 @Bean //给容器中添加组件
2.15 @ConfigurationProperties结合相关XXXProperties类绑定相关的配置 //结合
2.16 @EnableConfigurationProperties //让XXXProperties生效加入达到容器中
自动配置加载:将需要启动加载的自动配置类,配置在META-INF/spring.factories
3.模式
启动器只用来做依赖导入,专门来写一个自动配置模块;
启动器依赖自动配置;别人只需要引入这个启动器;