Springboot2.5.4启动流程
2021-10-27 23:43:30 0 举报
Springboot2.5.4启动详细流程
作者其他创作
大纲/内容
创建环境getOrCreateEnvironment()根据应用类型new不同的环境对象
新建了一个运行时异常对象,通过这个对象获取当前的调用函数堆栈数组StackTrace,之后遍历这个堆栈数组,找到方法名为main的类,返回这个类
java.awt.headless系统属性设置
setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
new SpringApplication()
判断应用类型是否为web
加载所有依赖的初始化器
注册beanNameGenerator(跳过)
设置main方法的定义类
生成工厂类实例,并返回
构造方法初始化
根据webApplicationType类型创建不同的应用上下文ConfigurableApplicationContext,默认是AnnotationConfigServletWebServerApplicationContext
将启动类中设置的source封装成一个BeanDefinition对象,并将其注册到beanFactory的BeanDefinitionMap中
发送上下文load化完成事件ApplicationPreparedEventlisteners.contextLoaded(context)
SpringApplicationRunListener类型监听器EventPublishingRunListener执行environmentPrepared方法发布ApplicationEnvironmentPreparedEvent事件
计时器实例并启动
SpringApplicationRunListener类型监听器EventPublishingRunListener执行contextPrepared方法发布ApplicationContextInitializedEvent事件
初始化一个BeanDefinitionLoader实例并调用load()方法使用AnnotatedBeanDefinitionReader的实例来注册source(启动类的Class)
设置所有可用程序监听器
刷新上下文refreshContext(context)
这里因为在刷新上下文的时候给上下文初始化了事件发布器ApplicationEventMulticaster所以就不需要使用EventPublishingRunListener的initialMulticaster了,而是直接调用上下文进行发布context.publishEvent
设置resourceLoader(跳过)
装配环境参数new DefaultApplicationArguments(args)
postProcessApplicationContext(context)
给context/reader/scanner设置环境context.setEnvironment(environment)
getSpringFactoriesInstances
发送应用已运行中事件ApplicationReadyEventlisteners.running(context)
在bean中查找ApplicationRunner.class和CommandLineRunner.class的实现,然后按照顺序(可以通过实现Ordered接口或者使用Order注解指定)执行
bindToSpringApplication(environment)
通过工厂类反射,得到工厂的class对象,构造方法
SpringApplication启动
发布事件
开始执行run()方法
构造方法中初始化this.reader = new AnnotatedBeanDefinitionReader(this)和this.scanner = new ClassPathBeanDefinitionScanner(this)
发送上下文初始化完成事件ApplicationContextInitializedEventlisteners.contextPrepared(context)
检查是否有配置图片banner和文字banner,有的话循环打印,没有则打印默认 的banner图案
getRunListeners(args)获取SpringApplicationRunListener类型监听器EventPublishingRunListener并执行starting方法发布应用启动ApplicationStartingEvent事件
SpringApplication启动结束
往上下文的applicationListeners中添加应用关闭监听器ApplicationContextClosedListener(此时上下文中一共有12个监听器)
获取文件中工厂类的全路径
将当前SpringApplication实例中的8个监听器加入到上下文的监听器集合中,此时上下文中共有11个监听器
通过类加载器获取spring.factories文件
1.将应用参数对象ApplicationArguments的实例注入到单例beanFactory中2.将Banner对象Banner的实例注入到单例beanFactory中3.设置beanFactory的allowBeanDefinitionOverriding属性为false
在EventPublishingRunListener的构造方法中完成this.initialMulticaster初始化this.initialMulticaster = new SimpleApplicationEventMulticaster();for (ApplicationListener<?> listener : application.getListeners()) { this.initialMulticaster.addApplicationListener(listener);}
根据传入的类名,得到所需要的工厂集合的实例
EnvironmentPostProcessorApplicationListener监听器的EnvironmentPostProcessor
使用状态模式让7个初始化器分别对上下文进行初始化(往上下文的beanFactoryPostProcessors中添加BeanFactoryPostProcessor或者applicationListeners中添加ApplicationListener)
初始化并设置类型转换器和格式化器ApplicationConversionService(转换器用途:controller接口接口中String可以自动转Integer等,参数可以转换为对象实例等)设置默认属性和命令行参数设置激活的profile(空方法未设置)这里实际的设置操作是通过下一步的环境准备完成事件监听器EnvironmentPostProcessorApplicationListener中获取的ConfigDataEnvironmentPostProcessor完成的
设置上下文beanFactory的格式转换器(配置环境时初始化的)
发送应用启动完成事件ApplicationStartedEventlisteners.started(context)
beanFactory是在GenericApplicationContext的构造方法中初始化的this.beanFactory = new DefaultListableBeanFactory()
收藏
收藏
0 条评论
下一页