天天看点

spring的上下文执行流程(refresh()底层原理及扫描流程)

作者:wuweixianzheng

以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事件)

spring的上下文执行流程(refresh()底层原理及扫描流程)

上下文执行流程图1

spring的上下文执行流程(refresh()底层原理及扫描流程)

上下文执行流程图2

spring的上下文执行流程(refresh()底层原理及扫描流程)

bean扫描流程图