spring初始化涉及的类和函数

2018-10-18  本文已影响0人  继李扶危

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;

上一篇下一篇

猜你喜欢

热点阅读