Springboot启动配置原理

一、启动原理

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.模式

启动器只用来做依赖导入,专门来写一个自动配置模块;

启动器依赖自动配置;别人只需要引入这个启动器;

经验分享 程序员 微信小程序 职场和发展