Spring-boot启动加载流程
2019-11-18 10:44:25 0 举报
Spring-boot启动加载流程图源码分析
作者其他创作
大纲/内容
Y
initializeBean()
TomcatWebServer.start()
createApplicationContext
PostProcessorRegistrationDelegate.registerBeanPostProcessors
afterRefresh()
tomcat
finishBeanFactoryInitialization(beanFactory)注册初始化剩下的非懒加载的singletons bean
AbstractApplicationContext.refersh()
AnnotationConfigServletWebServerApplicationContext继承了ServletWebServerApplicationContext
onRefersh() Initialize other special beansServletWebServerApplicationContext
获取所有bean 描述的NamebeanDefinitionNames
getSingleton(beanName)在实例化bean,该方法返回null和context.getBean()bean获取都会调用该方法,这时候方法返回存在的bean
createWebServer()
FatoryBean和普通的bean区别:1. 在单例池中的位置不同2.FactoryBean可以返回两个Spring管理的bean,一个是其本身,另一个是getObject方法返回的
beanFactory.preInstantiateSingletons();DefaultListableBeanFactory实现
transformedBeanName()name可能以&开头或者有别名,需要转化
singletonFactory.getObject();真正创建bean
SpringApplication.run
beforeSingletonCreation()将beanName存放到一个set集合中
启动类扫描和注册生成bean描述存储到BeanDefinition.map中
getBean()实例化bean
refreshContext()刷新容器
REACTIVE
@PostConstruct比InitializingBean先执行
finishRefresh()完成refersh
doGetbean()
结束
Context?
Web创建
N
spring-context包下
FactoryBean<T>接口的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,相当于FactoryBean#getObject()代理了getBean()方法如果要获取FactoryBean对象本身,请在id前面加一个&符号来获取。
getBean(& + beanName);
registerBeanPostProcessors()注册拦截bean创建的bean处理器。BeanPostProcessor实例化之后执行
JettyWebServer.start()
lazy/循环依赖才执行
invokeBeanFactoryPostProcessors()实例化并调用所有注册的beanfactorypostprocessor bean,调用postProcessBeanFactory方法。BeanFactoryPostProcessor容器加载了bean的定义文件之后,在bean实例化之前执行的
singletonObjects.get()从单例池中获取bean
是否是FactoryBean
是单例
AbstractBeanFactory.getbean()
postProcessBeanFactory()AnnotationConfigServletWebServerApplicationContext实现该方法
执行每个BeanPostProcessor的postProcessBeforeInitialization,然后调用invokeInitMethods方法,执行bean的初始化方法,最后调用applyBeanPostProcessorsAfterInitialization方法,执行每个BeanPostProcessor的postProcessAfterInitialization方法
Jetty
getServletContext()是哪个WebServer
AbstractAutowireCapableBeanFactory.doCreateBean()创建bean
收藏
0 条评论
下一页