本文基于AnnotationConfigApplicationContext的方式启动,解析Spring启动的流程
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
一、构造方法
容器启动需要扫描BD(BeanDefinition),并创建BD,Spring将这两个功能分成了两个类,分别是
- AnnotatedBeanDefinitionReader,BD阅读器,用于根据Bean的元信息(比如类名、注解信息)创建BD
- ClassPathBeanDefinitionScanner,BD扫描器,用于根据指定路径扫描出符合条件的BD
this()构造方法中有两个关键方法
this.reader = new AnnotatedBeanDefinitionReader(this);
创建一个BD(BeanDefinition)阅读器
该构造方法需要传递一个BeanDefinitionRegistry注册器对象进去,我们可以看到这个注册器对象就是ApplicationContext本身
接着往下看,重点方法
这个方法是将spring内置的一些PostProcessor注册为BD
一共有6个内置的beanFactoryPostProcessor
- ConfigurationClassPostProcessor
- AutowiredAnnotationBeanPostProcessor
- CommonAnnotationBeanPostProcessor(当项目中存在JSR250,即javax.annotation.Resource注解)
- PersistenceAnnotationBeanPostProcessor(当项目使用JPA)
- EventListenerMethodProcessor
- DefaultEventListenerFactory(这个比较特殊,不是beanFactoryPostProcessor)
registerPostProcessor方法只需要关注将PostProcessor注册为BD,简单理解为加入到DefaultListableBeanFactory中的beanDefinitionMap中。
this.scanner = new ClassPathBeanDefinitionScanner(this);
为给定的BeanFactory创建一个scanner
在scanner的构造方法中注册了一个默认的Filter,作用是包含所有@Component注解的类
二、register方法,将启动类注册为BD
使用上文new出的AnnotatedBeanDefinitionReader将启动类class
简单理解为解析类上的注解等元信息,并注册为BD
三、refresh方法
prepareBeanFactory方法
添加BeanPostProcessor:
- ApplicationContextAwareProcessor
- ApplicationListenerDetector
invokeBeanFactoryPostProcessors方法,执行BeanFactoryPostProcessor方法
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法
将BeanFactoryPostProcessor分为两种,
一种是常规类型,还有一种是BeanDefinitionRegistryPostProcessor
- 执行所有内部的BeanDefinitionRegistryPostProcessor。
- 将容器中的所有BeanDefinitionRegistryPostProcessor根据BD创建出Bean(提前实例化)
此时容器内部一般只有ConfigurationClassPostProcessor
- 执行容器中BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
实际上->执行ConfigurationClassPostProcessor
的