springboot2.4.5启动流程
2021-05-11 11:04:36 1 举报
springboot2.4.5+spring5启动流程。不含getBean,以后添加
作者其他创作
大纲/内容
发布环境准备完成事件、并绑定当前环境1、listeners.environmentPrepared(environment);2、bindToSpringApplication(environment);
容器中:找出所有实现BeanFactoryPostProcessor接口的Bean的beanName
自定义异常回调接口SpringBootExceptionReporter.class
加载初始化监听工厂getSpringFactoriesInstances(ApplicationListener.class)
加载beanDefinesloadBeanDefinitions(beanFactory);
1、希望初始化得,则通过beanName获取bean实例2、普通Bean实例话getBean();
1、ApplicationContextAwareProcessor:能够在bean中获得各种*Aware2、忽略特定属性的注入因为在ApplicationContextAwareProcessor中手动注入了
初始化conversionService
初始化国际化问题的消息源支持信息的国际化和包含参数的信息的替换initMessageSource()
获取beanName对应的MergedBeanDefinition,父定义、自定义等
用于保存本次要执行的BeanDefinitionRegistryPostProcessorcurrentRegistryProcessors
添加一个BPP LoadTimeWeaverAwareProcessor添加动态织入功能如果当前BeanFactory包含loadTimeWeaver Bean,说明存在类加载期织入AspectJ,则把当前BeanFactory交给类加载期BeanPostProcessor实现类LoadTimeWeaverAwareProcessor来处理,从而实现类加载期织入AspectJ的目的
加载初始化类applyInitializers
获取beanFactory并进行相关设置prepareBeanFactory(beanFactory)
同名异常设置setAllowBeanDefinitionOverriding
finishRefresh
getEnvironment().validateRequiredProperties();校验启动必要的参数
扩展:可以加载自定义bean工厂customizeBeanFactory(beanFactory);
这里面初始化的工厂类、有个类图beanFactory = context.getBeanFactory()
run()
返回工厂类getBeanFactory()
设置某些bean不会添加到准备的环境中configureIgnoreBeanInfo(environment);
jdk headless模式configureHeadlessProperty
设置容器启动时间startupDate
入参中、用于存放普通的BeanFactoryPostProcessorregularPostProcessors
调用上下文中注册为bean的工厂 BeanFactoryPostProcessorinvokeBeanFactoryPostProcessors(beanFactory);
???
上一步注册完成工厂类、此步注册真正的后置处理器
计时器 StopWatch
springBoot启动
将监听类放置到容器中、并发布事件listeners.contextLoaded(context);
允许在上下文子类中对bean工厂进行后处理、可以添加自定义BPPpostProcessBeanFactory()
发布准备监听事件listeners.contextPrepared(context)
一共有三项、但是目前只进行了类型绑定预设置postProcessApplicationContext(context);
容器中:找出所有实现BeanDefinitionRegistryPostProcessor接口的Bean的beanNamepostProcessorNames
循环区分1、已经加载过的bean2、找出实现了PriorityOrdered的bean3、找出实现了Ordered的bean4、以上三个以外的bean
根据应用类型创建上下文context = createApplicationContext();
入参中、用于存放实现了接口:BeanDefinitionRegistryPostProcessorregistryProcessors
设置ApplicationContext容器的环境Environmentcontext.setEnvironment(environment);
banner打印Banner printedBanner = printBanner(environment);
如果没有注册嵌入值解析器,则注册默认的嵌入值解析器:主要用于注解属性值的解析addEmbeddedValueResolver
初始化LoadTimeWeaverAware Bean实例对象LoadTimeWeaverAware
非web应用中关闭IoC容器、销毁bean及beanFactory、及子类若为web容器、则停止Webserver若为Reactive、则停止ServerManagercontext.registerShutdownHook();
刷新BeanFactoryrefreshBeanFactory()
排序、添加、后置处理器注册。最后清空当前需要加载的currentRegistryProcessors
加载解析命令行中的参数new DefaultApplicationArguments(args)
实例化所有剩余(非懒加载)单例对象 beanFactory.preInstantiateSingletons()
完成bean工厂得初始化、初始化剩余的beanfinishBeanFactoryInitialization
加载初始化容器工厂getSpringFactoriesInstances(ApplicationContextInitializer.class)
加载springBoot运行时监听并启动1、getRunListeners2、listeners.starting();
判断是否已经存在BeanFactory,存在则销毁所有Beans,并且关闭BeanFactorydestroyBeans()closeBeanFactory()
开启活跃状态active
撤销关闭状态closed
初始化context environment(上下文环境)中的占位符属性来源initPropertySources();父类不做处理、子类有逻辑GenericWeb
new SpringApplication(primarySources)
设置对应的转换类ConfigurableConversionService
1、注册几个自动装配相关的类和实例2、在应用代码就可以通过类型自动装配把工厂实例和ApplicationContext实例设置到自定义bean的属性中3、几个属性都会被自动设置,虽然没有在显示的在bean定义xml中注入它们
按照上述1,3,4,2的顺序,排序、注册对应的bean
创建具体的beanFactory,这里创建的是DefaultListableBeanFactory,最重要的beanFactorycreateBeanFactory()
初始化ApplicationEventMulticaster、如果上下文中未定义、则初始化SimpleApplicationEventMulticaster
初始化事件广播器initApplicationEventMulticaster
创建beanDefinitionNames的副本beanNames用于后续的遍历,以允许init等方法注册新的bean定义
spring容器启动核心spring5.3.6refresh
在创建上下文时、在父子类别中完成了很多初始化操作AnnotationConfigServletWebServerApplicationContext
拿到当前应用上下文beanFactoryPostProcessors变量中的值getBeanFactoryPostProcessors
不抽象、不懒加载是单例、实例话对象
从缓存中获取bean定义、RootBeanDefinition一直到根节点
设置beanFactory类加载器设置bean(EL)表达式解析器设置propertiyEditor属性编辑器
解析加载类定义、这里面有个较长的逻辑链、最终跟踪到doLoadBeanDefinitions-》doRegisterBeanDefinitions-》parseBeanDefinitions
注册后置处理器BBPregisterBeanPostProcessors
设置工厂的序列化idGenericApplicationContext
如果发现没有这些bean则spring自己注册、系统环境配置信息等
是否希望急切的初始化isEagerInit
重新注册ApplicationListenerDetector(主要是为了移动到处理器链的末尾)
添加一个BPP ApplicationListenerDetector1、在Bean初始化完成之后:如果Bean是单例的则并且bean instanceof ApplicationListener。加入到this.applicationListeners中。2、在Bean销毁之前搞事情: 如果Bean是一个ApplicationListener,则会从ApplicationEventMulticaster(事件广播器)中提前删除
根据WebApplicationType选择加载环境变量getOrCreateEnvironment
冻结所有bean定义,注册的bean定义不会被修改或进一步后处理beanFactory.freezeConfiguration()
注册ApplicationListenersregisterListeners
核心
动态织入
AbstractRefreshableApplicationContext
子类向上继承1、DefaultApplicationArguments2、SimpleCommandLinePropertySource3、CommandLinePropertySource4、EnumerablePropertySource5、PropertySource6、5下面得子类getProperty->getOptionValues
排序、添加、后置处理器注册。清除元数据缓存
准备prepareRefresh()
1、通过addApplicationListener(listen)注册监听器(参数重、容器中)2、自定义实现ApplicationListen接口的bd3、发布监听器
大核心
1、用于存放实现PriorityOrdered接口的BeanPostProcessor:priorityOrderedPostProcessors2、用于存放Spring内部的BeanPostProcessor:internalPostProcessors3、用于存放实现Ordered接口的BeanPostProcessor的beanName:orderedPostProcessorNames4、用于存放普通BeanPostProcessor的beanName:nonOrderedPostProcessorNames
三次1、实现了PriorityOrdered2、1未加载过的、实现了Ordered3、1和2未加载过的、剩下的
是否为FactoryBeanisFactoryBean
初始化特定上下文子类中的其他特殊bean、但是当前版本spring未实现onRefresh
实例化并调用所有已注册的BeanFactoryPostProcessorinvokeBeanFactoryPostProcessors
遍历beanNames,触发所有SmartInitializingSingleton的后初始化回调-》afterSingletonsInstantiated()
0 条评论
回复 删除
下一页