spring初始化涉及的类和函数
SpringApplication
1、createApplicationContext()
:创建默认的ApplicationContext,在其中添加默认的bean,默认添加的bean在后续初始化中使用的到,其中包括3个BeanPostProcessor,分别为AutowiredAnnotationBeanPostProcessor(处理@AutoWired注解)、CommonAnnotationBeanPostProcessor(处理@PostConstruct、@PreDestroy以及@Resource 由java提供的注解)以及RequiredAnnotationBeanPostProcessor(处理@Required注解)。
2、prepareContext()
:把用户传入的资源(类)添加到BeanFactory,用户传入的类一般具有bean扫描功能或通过其他方式导入bean的功能,如有@ComponentScan注解等,在ApplicationContext中添加BeanfactoryPostProcessor,
3、invokeBeanFactoryPostProcessors()
:执行BeanFactoryPostProcessor,完成前期bean的注册。
4、afterRefresh()
:执行ApplicationRunner和CommandLineRunner。
AbstractApplicationContext
1、prepareRefresh()
:没有做什么操作;
2、obtainFreshBeanFactory()
:获取当前ApplicationContext中的BeanFactory;
3、prepareBeanFactory()
:为BeanFactory初始化做准备,如通过registerResolvableDependency()添加被依赖类型的默认值,添加BeanPostProcessor,添加预先实例化的单例对象;
4、postProcessBeanFactory()
:根据ApplicationContext类不同有些实现类是空函数;
5、invokeBeanFactoryPostProcessors(beanFactory)
;
5.1、执行ApplicationContext中的BeanFactoryPostProcessor,
5.2、在处理过程中会循环获取BeanFactory中的BeanFactoryPostProcessor,先执行BeanFactory中注册的BeanFactoryPostProcessor,执行完毕后检测BeanFactory中有没有增加新的BeanFactoryPostProcessor,如果有继续执行,直到所以的BeanFactoryPostProcessor都处理完,
5.3、循环处理的原因是BeanFactoryPostProcessor在处理时可能引入新的BeanFactoryPostProcessor。在这里会处理@EnableConfigurationProperties、@Configuration、@Bean等注解。执行完后完成Bean的注册(此时完成了Bean的注册,但是Bean还没有实例化)
6、registerBeanPostProcessors()
会在BeanFactory中注册BeanPostProcessor,这些BeanPostProcessor并没有注册到容器中,这些BeanPostProcessor用于自动注入等操作;
7、finishBeanFactoryInitialization()
:完成Bean的实例化、属性的自动注入以及其他Bean的初始化(@PostConstruct等注解的函数等等),调用BeanPostProcessor完成属性注入等操作,在AbstractAutowireCapableBeanFactory的initializeBean()函数中会调用所有在registerBeanPostProcessors()中注册的BeanPostProcessor;