springboot总结:从jar包启动到启动完成的层级结构流程
2021-12-28 15:58:37 2 举报
按颜色分级,springboot项目启动的核心逻辑都在图中。 汇总之前springboot源码学习的多张图,整体性、概况性的总结。 如果想深入学习可以参考之前画的源码图。
作者其他创作
大纲/内容
⑤将需要不加载的属性设置为隐藏。
文档里有main-calss指定主类
doGetBean
4、注册bean后置处理器,初始化容器时间的多播器spring留的扩展口。onRefresh方法注册监听器
①判断缓存池中是否已经加载了,加载了就直接跳到init方法
⑧完成AOP
springboot启动类运行
6收尾:finishRefresh:生命周期处理器初始化并启动,容器事件
⑨当需要注销bean时,才会调用这里,完成bean的注销。
预实例化:beanFactory.preInstantiateSingletons();
③将beandefinition转型为rootBeanDefinition
停止stopwatch,打印启动时间
jar启动
加载启动前置处理:1、设置类读取器resourceLoader和对应的类加载器ClassLoader2、应用初始化器,循环回调每个初始化器的initial方法3、循环所有的监听器,依次调用contextPrepared方法(目前spring内部的监听器的contextPrepared方法都是空方法)4、注册单例对象DefaultApplicationArguments,用于处理启动传的入参5、打印启动标识图形,获取配置类,load进容器中
三
3、加载beanfactory的后置处理器(实现排序接口>@order>普通的),然后加载bean的后置处理器
5、实例化所有剩余的(非惰性初始化)单例--》创建bean就是在这一步完成bean: this.finishBeanFactoryInitialization(beanFactory);
先实例化容器的启动监听器,然后设置一下基础的环境信息
调用主类的加载方法
2、postProcessBeanFactory(beanFactory);
1.先从单例缓存池获取Object sharedInstance = this.getSingleton(beanName);
EventPublishingRunListener启动对容器的监听
1、创建beanfactory,并加载spring内部bean、配置类。
都是先通过loadSpringFactories(classLoader)方法以spi的方式加载spring.factories文件中的所有内部类,然后根据传来的类型,找到对应的类集合。
实现aware接口的类或@poststructure修饰的方法,都会被这里的后置处理器加载,在这里触发执行。
核心分四部分
主要通过SPI方式加载MATE/spring.factories
二
new JarLauncher().launch(args);}最终会找到获取MANIFEST.MF文件中Start-Class指定的启动类
按颜色分级,springboot项目启动的核心逻辑都在图中
META-INF\\MANIFEST.MF文件
⑥将需要提前设置的属性完成加载
④将未设置属性参数的对象,存到缓存池中,以便循环依赖使用。
加载内部监听类ApplicationListener的所有实现类
Main-Class: org.springframework.boot.loader.JarLauncher
②获取构造方法,默认加载无参构造。也可以通过AutowireMode为3指定使用有参构造。
RUN方法
创建stopwatch
找到
SpringFactoriesLoader#loadFactories
new SpringApplication(primarySources).run(args);
特别处:
默认返回servelet
初始化获取beanfactory:获取所有bean的信息 初试化spring内置的bean 初试化配置文件指定的bean 比如spring2.xml初试化注册的配置类比如appconfig。准备bean工厂以供在此上下文中使用:绑定bean工厂的相关属性:类加载器,回调函数,监听器,ApplicationEventPublisher,ApplicationContext等
获取内部bean中的单例对象集合beanDefinitionNames(比如注册器,配置类,后置处理器,工厂,mvc的视图解析器,dispatcherServlet等)。循环将每一个转为rootBeanDefinition(这里和mergedBeanDefinitionPostProcessor作用类似),三层do{}while()分别判断,只要三条件(单例,非抽象,非懒加载)都满足就实例化,再调用getBean实例化对象。(spring4中还会提前对beanfactory实例化,后面spring5就改了)
加载初始化的一些基础内部类:ApplicationContextInitializer 的所有实现类
没有缓存
2、再获取其工厂类,如果有工厂类,通过工厂类实例化对象
初始化容器的基础参数
还是没有实例化成功,再走这里
⑦完成属性参数设置后,调用init方法前,留的一个扩展口。
判断是web项目还是其他类型项目。
ApplicationListener
根据前面获取到的,项目类型,创建对应的上下文,比如默认的web项目就是servelet
九大后置处理器贯穿整个bean的生命周期。
比如是否延迟加载,有没有指定类加载器,启动日志信息是否打印等等。
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
一
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
IOC容器启动(从springboot源码跳到spring-context)AbstractApplicationContext#refresh
onRefresh方法该方法在spring中是空方法
springboot在这里进行了实现,通过前面加载的容器类ServletWebServerApplicationContext#onRefresh,最终启动WebServer
this.refreshContext(context)
context = this.createApplicationContext();
new SpringApplication
该方法在spring中是空方法,springboot对其进行了实现,在AnnotationConfigServletWebServerApplicationContext类中对postProcessBeanFactory方法进行了实现,将WebApplicationContext容器加载
核心
0 条评论
下一页