SpringBoot run方法原理

SpringBoot通过主程序的Main方法启动,main程序中通过SpringApplication的run方法去启动整个SpringBoot程序

 一,SpringApplication run方法

 静态的run方法中重载到了另外一个run方法中,第一步去实例化了SpringApplication对象,传入参数为main方法所在类class对象,然后利用实例化好的SpringApplication对象去执行run方法。

 二,SpringApplication的实例化

 1,将项目启动类进行存储

 2,应用类型的判断(枚举类WebApplicationType)

前面两种类型不说,因为使用了SpringMVC,Spring应用层面上的框架,前端去请求controller,那么就会用到DispatcherServlet,那么一定忽悠WebApplicationType.SERVLET类型的类出现。

 3,设置初始化器 

设置初始化器的参数为getSpringFactoriesInstances的返回结果,那么直接跟踪这个方法即可,该方法的参数传入了一个ApplicationContextInitializer类的Class对象

 同样是调用重载的方法,首先会去获取一个类加载器,然后把传入的class对象,还有刚刚实例化好的类加载器传入到loadFactoryNames方法中去,并返回一个容器对象。

 然后会发现又回到了这个方法中去加载spring.factories,而传入的ApplicationContextInitializer类的class对象,就是去判断加载,放入到集合中,set去重复

 4,设置监听器

这里和上面是调用的同样的一个方法,也是去Spring.factoris中去找这个类,然后去实例化返回。

 5,初始化 mainApplicationClass属性

 三,SpringApplication的run方法

1,执行计时器,上下文异常报告集合初始化.... 

2,获取监听器  && 创建Arguments对象实例化初始化配置信息

这里还是和之前一样,去Spring.factoris中实例化SpringApplicationRunListener对象。

 3,运行环境的预配置

将第二步实例化的监听对象与默认配置Argument对象传入,实例化ConfigurabeEnvironment环境对象,绑定监听与配置属性,绑定运行环境并返回。

 4,创建Spring容器

这里的applictionContextClass有可能为NULL,为Null则会进行判断,类型的问题上面有提到过,一定会是一个Servlet类型,创建一个class字节码对象,然后传入创建一个ApplicationContext对象并且返回,到这里为止Spring容器创建成功。 

 5,Spring的前置处理

这里因为篇幅问题着重去看load方法,它会去加载启动类成BeanDefinition。

 6,刷新容器

首先会对实例化完成的ApplicationContext进行刷新,然后去注册一个钩子--即一个方法。这里比拟的是如果JVM关闭了,那么这些容器中的内容也可以被销毁了。

7,后置处理

afterRefresh方法中并没有操作,这里是方便开发人员做一些后置的操作。

 

 8,发出执行的事件通知

 9,执行Runners

用于执行项目中自定义的执行器,当程序启动完成默认执行一次。从callRunners中可以发现,如果要去自定义执行类,我们只需要去实现ApplicationRunner和CommandLineRunner接口即可。

 10,发布上下文就绪事件并返回容器

猜你喜欢

转载自blog.csdn.net/qq_42773863/article/details/120581587