启动流程
2022-05-20 18:33:50 15 举报
springboot 启动流程
作者其他创作
大纲/内容
new SpringApplication(primarySources).run(args)
addSingletonFactory()
拿后置处理后的bean对象与当前实力化的Bean进行对比,如果相同且缓存中存在提前暴露的bean,则替换(aop需要用到)
执行所有ApplicationRunner和CommandLineRunner bean的后置处理方法
1、确定应用类型2、获得应用的Initializer和Listener3、确定main方法类
refreshContext()
listeners.running(context)
initializeBean()
1、执行beanPostProcess实例话后置方法2、属性填充,注入依赖的所有Bean实际也是为每个依赖的对象进行getBean
1、处理Lifecycle bean2、发布ContextRefreshedEvent3、web应用启动startWebServer4、发布ServletWebServerInitializedEvent
初始化bean1、执行aware接口的后置方法2、beanPostProcess初始化前置方法3、postConstruct初始化方法4、afterPropertiesSet方法5、beanPostProcess初始化后置方法
finishBeanFactoryInitialization()
registerBeanPostProcessors()
printBanner()
1、添加内部所需后置处理器,如aware的后置处理器2、设置忽略的aware注入接口3、注册一些内部bean,如系统配置bean
1、此处算是个预留的方法,父类逻辑为空2、web应用会注册一个ServletContextAware后置处理ServletContextAware 的bean3、web应用还会注册scope相关,用得少,不深入
发布应用启动完毕事件 ApplicationReadyEvent
invokeBeanFactoryPostProcessors()
addSingleton()
发布ApplicationStartingEvent事件
earlySingletonExposure
createApplicationContext()
prepareRefresh()
根据orderded顺序注册所有的BeanPostProcessor,这里会注册createApplicationContext()中初始化的几个内部的后置处理器
1、设置一些启动的状态位2、一些初始化操作,如早期事件lisenner
1、从三层缓存依次获取bean,拿不到2、从父工厂获取bean,拿不到
1、创建ServerApplicationContext对象2、创建AnnotatedBeanDefinitionReader(注册各种注解、配置类相关的后置处理器)3、bean定义扫描组件的初始化(ClassPathBeanDefinitionScanner)
1、设置工厂id(即名字)2、从application中拿到BeanFactory
callRunners()
CreateBean()
postProcessBeanFactory()
prepareBeanFactory()
1、按照PriorityOrdered、Ordered、Normal的顺序注册并执行BeanDefinitionRegistryPostProcessor2、按照PriorityOrdered、Ordered、Normal的顺序注册并执行BeanFactoryPostProcessor
afterRefresh()
1、调用spring framwork的容器刷新方法,此处ApplicationContext是继承了AbstractApplicationContext的,所以就是调用父类的刷新方法2、注册jvm销毁的钩子,用于关闭容器等操作。
结束并返回context
预留的钩子,暂时没用
添加进三级工厂,此工厂仅仅存放一个函数的回调,解决循环依赖的关键
1、设置一些context的属性2、执行应用的Initializer#initialize方法3、发布InitializedEvent事件4、添加一些内部bean5、发布容器PreparedEvent事件
obtainFreshBeanFactory()
onRefresh()
打印beanner,可自定义
创建bean
此处省去了部分方法
listeners.starting()
1、beanPostProcess实例化之前执行,返回非空,则不走下面逻辑2、执行创建doCreateBean的逻辑
1、准备配置环境,加载系统、yaml等配置源,初始化Profiles2、发布ApplicationEnvironmentPrepared事件
createBeanInstance()
完成所有非懒加载的单例bean
populateBean()
prepareContext()
finishRefresh()
利用反射,创建bean实例此处会推断使用自定义构造器还是默认构造器
预留的钩子,boot在此处复写了web应用会在此初始化webServer,创建tomcat、jetty等web应用对象
doGetBean()
添加进一级缓存中
main()
spring framwork app context
springboot app context
此处有几个核心的beanPostProcessor:1、AutowiredAnnotationBeanPostProcessor2、CommonAnnotationBeanPostProcessor3、AbstractAutoProxyCreator
prepareEnvironment()
此处有个核心的后置处理器ConfigurationClassPostProcessor它会处理@Configuration配置类, @ComponentScan、@Import、selectImports、@Bean核心方法:ConfigurationClassParser#doProcessConfigurationClass并且该类还会对配置类进行增强
0 条评论
回复 删除
下一页