SpringBoot启动流程
2022-09-03 23:19:13 0 举报
登录查看完整内容
SpringBoot启动流程
作者其他创作
大纲/内容
初始化SpringApplicationnew SpringApplication(primarySources)
10.refreshContext(context);调用过程跟Spring一样,很多SpringBoot的核心功能都是在此方法中完成的
如果没有,则获取ServletWebServerFactory
type:SpringApplicationRunListener.class
main方法/命令行
1.创建计时器对象,开始计时:stopWatch.start();
getServletContextInitializerBeans()
1.根据传入的类得到需要的实体类的集合2.通过类加载器加载META-INF/spring.factories的属性3.获取文件中类的路径4.通过反射获取到具体的实例化对象
tomcat.start();
启动run(args)
发布上下文启动事件
根据main方法推算出mainApplicationClass:this.mainApplicationClass = deduceMainApplicationClass();
prepareWebApplicationContext(servletContext);
加载 META-INF/spring.factories文档,找到type接口名对应的value值,value就是继承了该接口的类名
beans.onStartup(servletContext);
7.创建Spring应用程序上下文createApplicationContext();
加载IOC容器
进行初始化操作
initialize();
tomcat配置
创建servlet容器根据不同的web调用不同类实现
onRefresh()
从spring.factorties中加载所有的初始化器: getSpringFactoriesInstances(ApplicationContextInitializer.class)
SpringApplication 的 run 方法做了什么?1️⃣创建一个 StopWatch 并执行 start 方法,该类主要记录任务的执行时间。2️⃣配置 Headless 属性。Headless 模式是在缺少显示屏、键盘或者鼠标时候的系统配置。3️⃣在文件 META-INF\\spring.factories 中获取 SpringApplicationRunListener 接口的实现类 EventPublishingRunListener,主要发布 SpringApplicationEvent。4️⃣把输入参数转成 DefaultApplicationArguments 类。5️⃣创建Environment并设置比如环境信息,系统熟悉,输入参数和profile信息。6️⃣打印Banner信息7️⃣创建 Application 的上下文,根据 WebApplicationType 来创建 Context 类,如果非web项目则创建 AnnotationConfigApplicationContext,在构造方法中初始化 AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner。8️⃣在文件 META-INF\\spring.factories 中获取 SpringBootExceptionReporter 接口的实现类 FailureAnalyzers。9️⃣准备 application 的上下文:①初始化 ApplicationContextInitializer。②执行 Initializer 的 contextPrepared 方法,发布 ApplicationContextInitializedEvent 事件。③如果延迟加载,在上下文添加处理器 LazyInitializationBeanFactoryPostProcessor。④执行加载方法,BeanDefinitionLoader.load 方法,主要初始化了AnnotatedGenericBeanDefinition。⑤执行 Initializer 的 contextLoaded 方法,发布 ApplicationContextInitializedEvent 事件。🔟刷新上下文,在这里真正加载bean到容器中。如果是web容器,会在onRefresh方法中创建一个Server并启动。回到 run 方法,最后的逻辑就是发布启动完成的事件,并调用监听者的方法。
监听配置
refresh((ConfigurableApplicationContext)applicationContext)
1. 获取启动类 2.获取web应用类型 3.加载所有初始化器ApplicationContextInitializer4.加载所有的监听器ApplicationListener5.根据main推算出所在的类
source 可以是数组,是specified的。命令行时,source = new Object[0]
2.配置headless的属性并设置到系统属性中
3.初始化监听器:this.getRunListeners(args);
自动装配
type 要实例化类的继承的接口parameterTypes用于查找构造方法的args 实例化参数
返回集合
设置环境对象
SpringBoot 启动执行 SpringApplication.run()底层创建 SpringApplication 对象并执行 run 方法
4.设置命令行参数
getSpringFactoriesInstances
防止启动完就关闭tomcat.getServer.await();
启动
将启动类作为配置类放入primarySources:new LinkedHashSet(Arrays.asList(primarySources));
getServletContext();
ServletContextInitializer有一个OnStartUp()启动。Debug可以看见里面有DispatcherServlet这个类。在springboot中,注册Servlet需要通过ServletRegistrationBean,并且通过DispatcherServletAutoConfiguration注入
设置环境监听器集合
从spring.factorties中加载所有的监听器: getSpringFactoriesInstances(ApplicationListener.class)
getWebServerFactory();
集合排序
内嵌tomat
8.准备异常报告器
发布上下文准备就绪事件
通过类名以及parameterTypes,args 参数,实例化该类,并添加到集合中
6.控制台打印启动标记:printBanner(environment);
type:ApplicationListener
stopWatch.stop();
获取servlet上下文
得到内嵌tomcat
getSelfInitializer()
SpringBoot 主启动类启动后会进入 main 方法中,并在方法中由 SpringApplication 调用 run(),方法中传入当前类的 class 对象以及 main 方法的 args 参数。下一步进入 run() 中,在 run() 中还调用了另一个 run( )。
factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});
创建环境对象
加载系统参数
调用runner执行器
load对应资源:listeners.contextLoaded(context);
SpringBoot启动完成
5.准备环境对象
判断是否为web应用
启动监听器(ApplicationStartingEvent):listeners.starting();
设置servlet上下文
startDaemonAwaitThread
new SpringApplication(sources).run(args)
取所有servlet组件
this.createWebServer();
加载自动配置类:invokeBeanFactoryPostProcessors , 创建servlet容器onRefresh
type:ApplicationContextInitializer
0 条评论
回复 删除
下一页