Springboot 2.2.12 启动流程
2021-02-23 10:41:35 2 举报
Springboot 2.2.12 启动流程,包括Spring
作者其他创作
大纲/内容
每次监听器在实际操作的时候都会执行 listner() 方法
listeners.contextLoaded(context);发布【ApplicationPreparedEvent】事件
getSpringFactoriesInstances根据传入的类名,得到需要的工厂类名实例
createBeanFactory();创建 BeanFactory
添加后置处理器ApplicationListenerDetector
finishBeanFactoryInitialization(beanFactory);完成此上下文的bean工厂的初始化,初始化所有剩余的单例bean
添加后置处理器LoadTimeWeaverAwareProcessor
listeners.contextPrepared(context);发布【ApplicationContextInitializedEvent】事件
publishEvent(new ContextRefreshedEvent(this));发布【ContextRefreshedEvent】事件
获取运行主类
标准初始化后修改应用程序上下文的内部 bean工厂。 所有的bean定义将被加载,但还没有 bean 会被实例化。 这允许某些的ApplicationContext实现注册特殊BeanPostProcessor的等
计时结束,并打印启动时长stopWatch.stop();
customizeBeanFactory(beanFactory);自定义 BeanFacoty
loadBeanDefinitions(beanFactory);加载 BeanDefinition
存储预刷新的ApplicationListeners
prepareBeanFactory(beanFactory);获取BeanFactory并进行相关设置
设置beanFactory类加载器设置bean表达式解释器设置PropertyEditor属性编辑器
设置类型转换器
注册关闭的钩子 registerShutdownHook() 发布【ContextClosedEvent】事件,销毁 Bean 与 BeanFactory,销毁子类相关数据:如果是 Web 容器则停止 WebServer 容器(tomcat),如果是 Reactive 容器则停止 ServerManager 容器
回调所有SpringApplicationRunListener对象的running()方法listeners.running(context);
onRefresh();由子类实现
registerListeners();
new SimpleCommandLineArgsParser().parse(args)
配置PropertySources(在第一步获取)
设置'${...}'占位符处理器
如果环境是 reactive 则创建AnnotationConfigReactiveWebServerApplicationContext
AbstractRefreshableApplicationContext
匹配不同类型的时间,然后从所有的监听器中把不符合条件的监听器过滤掉
ReactiveWebServerApplicationContext
getLifecycleProcessor().onRefresh();首先将刷新传播到生命周期处理器
计时开始
设置BeanFactory 序列化ID
子类实现
加载初始化容器ApplicationContextInitializer.class
刷新上下文环境(重要)refreshContext(context);
invokeBeanFactoryPostProcessors(beanFactory);调用上下文中的 BeanFactoryPostProcessor 。(在单例实例化之前调用)
注册
初始化ApplicationEventMulticaster。 如果上下文中未定义,则使用SimpleApplicationEventMulticaster。
判断是否有图片,支持 { \"gif\
运行 run 方法
GenericApplicationContext
getBeanNameGenerator();
getClassPathBeanDefinitionScanner(beanFactory);
此处在看到创建应用上下文的对象后一定要看类图,在父子关系的类中完成了很多初始化操作,容易被忽略。ConfigurableApplicationContextDefaultListableBeanFactory
registerBeanPostProcessors(beanFactory);注册拦截Bean创建的Bean处理器
finishRefresh();
如果环境变量,系统配置与系统环境的相应的 Bean 不存在则注册
listeners.environmentPrepared(environment);发布【ApplicationEnvironmentPreparedEvent】事件
设置异常对应报告
设置初始化进行执行,向 beanFactory 中注入三个 postProcessor 在后续的自动装配中使用
clearResourceCaches();清除上下文级别的资源缓存(例如来自扫描的ASM元数据)
initMessageSource();为此上下文初始化消息源。
starting()发布【ApplicationStartingEvent】事件
设置相应的属性转换类 ConversionService
加载【LoadTimeWeaverAware】
启动结束
加载 META-INF/spring.factories 中的内容
符合条件的监听器会循环执行具体的自己的处理逻辑
configureHeadlessProperty();配置 headless 模式(意义不大)
生成对象后在返回给调用者
获取 Spring 应用运行时监听器,并启动
new SpringApplication(primarySources)
获取文件中对应类的全限定名
加载监听器ApplicationListener.class
配置 Profile :spring.profiles.active
getAnnotatedBeanDefinitionReader(beanFactory);
Springboot 应用启动
准备刷新阶段 prepareRefresh();容器状态设置;初始化属性设置;检查必备属性是否存在
new DefaultApplicationArguments(args);加载并解析命令行中的参数(key->value)值
设置系统属性保证某些 bean 不会添加到准备的环境中configureIgnoreBeanInfo(environment);-> spring.beaninfo.ignore
LiveBeansView.registerApplicationContext(this);
getBeanFactory();
initPropertySources();初始化属性资源
initApplicationEventMulticaster();初始化事件广播器
根据当前应用的类型创建应用上下文context = createApplicationContext();
如果环境是 none 则创建AnnotationConfigApplicationContext
beanFactory.preInstantiateSingletons();实例化所有剩余的(非延迟初始化)单例
refresh()
obtainFreshBeanFactory()设置beanFactory序列化id;获取beanFactory
applyInitializers(context);应用【ApplicationContextInitializer】类型的初始化器
在应用代码就可以通过类型自动装配把工厂实例和ApplicationContext实例设置到自定义bean的属性中
准备 banner 的打印Banner printedBanner = printBanner(environment);
绑定环境到当前应用
WebApplicationType.deduceFromClasspath();判断当前程序类型[Reactive,None,Servlet]
getEnvironment().validateRequiredProperties();校验必要属性
initLifecycleProcessor();为此上下文初始化生命周期处理器
getOrCreateEnvironment();根据当前应用程序的类型判断,获取或创建一个环境;加载,PropertySource,系统配置与环境配置
获取一个SpringApplicationRunListeners 对象,此对象会贯穿整个应用程序的启动过程,每次在进行监听器操作的时候都会从中获取具体的监听器
ServletWebServerApplicationContext
创建并启动计时器 StopWatch【System.nanoTime()】
读取 banner.txt 内容
postProcessBeanFactory(beanFactory);
开启所有的监听器对象listeners.started(context);
存在 BeanFactory 则删除其托管的 Bean,关闭 BeanFactory
根据反射获取到实例对象
添加后置处理器ApplicationContextAwareProcessor,忽略特定属性的自动注入(各种aware)beanFactory.ignoreDependencyInterface,因为在ApplicationContextAwareProcessor中已经完成了手动注入
默认
beanFactory.setTempClassLoader(null);停止使用临时的ClassLoader进行类型匹配
refreshBeanFactory();刷新 Bean 工厂
循环打印输入默认的 banner
beanFactory.freezeConfiguration();允许缓存所有bean定义元数据,而不期望进一步的更改
getScopeMetadataResolver();
如果环境是 servlet 则创建AnnotationConfigServletWebServerApplicationContext
注册几个自动装配规则beanFactory.registerResolvableDependency
getRunListeners(args)加载 Springboot 运行时监听器SpringApplicationRunListener.class
注册【ApplicationListener】监听器
执行 refresh() 方法。如果是子类则调用父类的 AbstractApplicationContext#refresh 方法
java.awt.headless是J2SE的一种模式,用于在缺失显示屏、鼠标或者键盘时的系统配置。
0 条评论
下一页