spring的上下文执行流程(refresh()底层原理及bean扫描流程)
以AnnotationConfigApplicationContext为例子:
1、this
a.在调用AnnotationConfigApplicationContext的构造方法之前,会调用父类GenericApplicationContext的无参构造方法,会构造一个BeanFactory,为DefaultListableBeanFactory。
b.new AnnotatedBeanDefinitionReader,(主要为了添加一些基础的PostProcessor,同时通过reader进行BeanDefinition的注册,同时对BeanFactory设置和添加PostProcessor(后置处理器))
c.new ClassPathBeanDefinitionScanner,主要作用可以用来扫描得到并注册BeanDefinition(可参考 bean扫描流程图 很详细了,在下面)
2、register
使用第一步中的reader注册AppConfig为BeanDefinition,类型为AnnotatedGenericBeanDefinition
3、refresh
a.prepareRefresh(),主要作用记录启动时间,并且可以允许子容器设置一些内容到Environment中,验证Environment中是否包括了必须要有的属性
b.obtainFreshBeanFactory(),进行BeanFactory的refresh,最终调用子类的方法产生一个BeanFactory
c.prepareBeanFactory(beanFactory),为beanFactory设置一些属性,比如设置表达式解析器、后置处理器、ResolvableDependency、DependencyInterface等等
d.postProcessBeanFactory为了给子类提供扩展(子类可以继续向beanFactory中添加东西)
e.invokeBeanFactoryPostProcessors(beanFactory),拿到context中所有的beanFactoryPostProcessors,执行BeanFactoryPostProcessor(这一步是spring中的一个重点),到此BeanDefinition就注册到BeanFactory了
f.registerBeanPostProcessors,注册一些程序员自己写的bean处理器
g、initMessageSource():假如BeanFactory中有"messageSource"的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的messageSource属性,让ApplicationContext拥有国际化的功能
h.initApplicationEventMulticaster():如果BeanFactory中有"applicationEventMulticaster"的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的applicationEventMulticaster属性,让ApplicationContext拥有事件发布的功能
i.onRefresh():提供给AbstractApplicationContext的子类进行扩展(springboot中用来启动内置tomcat)
j. registerListeners():从BeanFactory中获取ApplicationListener类型的beanName,然后添加到ApplicationContext中的事件广播器
applicationEventMulticaster中去,到这一步因为FactoryBean还没有调用getObject()方法生成Bean对象,所以这里要在根据类型找一下ApplicationListener,记录一下对应的beanName.
k.
finishBeanFactoryInitialization(beanFactory):完成BeanFactory的初始化,主要就是实例化非懒加载的单例Bean。
l. finishRefresh():BeanFactory的初始化完(设置ApplicationContext的lifecycleProcessor、调用lifecycleProcessor的onRefresh()方法,然后调用它的start()方法,这一步必须是是DefaultLifecycleProcessor才调用,这就是ApplicationContext的生命周期扩展机制、发布ContextRefreshedEvent事件)
上下文执行流程图1
上下文执行流程图2
bean扫描流程图
CSDN-Ada助手: 你的文章入选【CSDN 每天最佳新人】,请看:https://bbs.csdn.net/topics/609344083