之前阅读Spring画的图和笔记,有误的话请多加指正。
1.初始化AnnotationBeanDefinitionReader(创建一个读取注解的BeanDefinition读取器)
1)完成一些Spring内置的bean的BeanDefinition的注册到beanDefinitionMap
(1) ConfigurationClassPostProcessor -> BeanDefinitionRegistryPostProcessor -> BeanFactoryPostProcessor
(2) AutowiredAnnotationBeanPostProcessor -> BeanPostProcessor
(3) CommonAnnotationBeanPostProcessor -> BeanPostProcessor
(4) EventListenerMethodProcessor -> BeanFactoryPostProcessor
(5) DefaultEventListenerFactory
2.初始化ClassPathBeanDefinitionScanner(创建BeanDefinition扫描器)
1)这里的scanner仅仅是为了程序员可以手动调用AnnotationConfigApplicationContext对象的scan方法
(1) spring默认的扫描包不是这个scanner对象,而是自己new的一个ClassPathBeanDefinitionScanner
(2) spring在执行工程后置处理器ConfigurationClassPostProcessor时,去扫描包时会new一个ClassPathBeanDefinitionScanner
3.执行register()方法,注册我们的配置类
1)调用AnnotatedBeanDefinitionReader.doRegisterBean()方法,将我们设置的配置类注册到beanDefinitionMap
4.调用refresh()方法
1)prepareRefresh()
(1)获取容器的当前时间,同时给容器设置同步标识
2)ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
(1)设置一个Id,返回一个DefaultListableBeanFactory
3)prepareBeanFactory(beanFactory); BeanFactory的预处理工作(DefaultListableBeanFactory)
(1)设置BeanFactory的类加载器、EL表达式解析器、属性注册解析器PropertyEditor
(2)添加BeanPostProcessor[ApplicationContextAwareProcessor],能够在bean中获得各种*Aware
(3)为beanFactory设置忽略自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware
(4)设置可以自动装配的类BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
(5)添加BeanPostProcessor[ApplicationListenerDetector], 处理事件监听器
(6)添加编译时的AspectJ[LoadTimeWeaverAwareProcessor]
(7)给BeanFactory中注册一些环境组件
4)postProcessBeanFactory(beanFactory)
(1)设置BeanFactory的后置处理器,spring中并没有具体去实现postProcessBeanFactory方法
5)invokeBeanFactoryPostProcessors(beanFactory):主要完成自定义的或者内置BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor的方法,重要的ConfigurationClassPostProcessor完成了扫描->class->注册到beanDefinitionMap中
(1)getBeanFactoryPostProcessors() 获取自定义的BeanFactoryPostProcessor实现类
(2)PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors:实例化并调用所有已注册的BeanFactoryPostProcessor
①执行通过ac.addBeanFactoryPostProcessor添加的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
②执行【Spring内置】的BeanDefinitionRegistryPostProcessor[ConfigurationClassPostProcessor]
通过 ConfigurationClassPostProcessor再去【扫描】自定义的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor
③执行通过【扫描】的【自定义】的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
先执行实现了PriorityOrdered接口的
再执行实现了Ordered接口的
然后再实现其他的
④执行所有BeanDefinitionRegistryPostProcessor实现类的postProcessBeanFactory方法
⑤执行通过ac.addBeanFactoryPostProcessor添加的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
⑥调用所有的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
先执行实现了PriorityOrdered接口的
再执行实现了Ordered接口的
然后再实现其他的
Spring的内部实现类ConfigurationClassPostProcessor,主要完成
(1)postProcessBeanDefinitionRegistry:扫描 得到class 并转换成BeanDefinition,并注册到beanDefinitionMap中
(2)postProcessBeanFactory:对加了@Configuration注解的配置类进行Cglib代理,添加一个BeanPostProcessor后置处理器ImportAwareBeanPostProcessor
6)registerBeanPostProcessors(beanFactory):注册BeanPostProcessor,把每个BeanPostProcessor设置到beanFactory的beanPostProcessors
7)initMessageSource():初始化上下文中的资源文件,如国际化文件的处理
8)initApplicationEventMulticaster():初始化上下文事件广播器,添加到BeanFactory中,以后其他组件直接注入
9)onRefresh()
10)finishBeanFactoryInitialization(beanFactory);将BeanDefinition变成bean,所有非延迟单例对象的实例化
①遍历所有的已经注册的beanDefinitionNames,根据名称得到BeanDefinition -> RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
②通过AbstractBeanFactory#doGetBean将beanDefinition实例化成bean
(2.1)第一次getSingleton(),一般返回null
a.从一级缓存singletonObjects (存放完整的Bean)拿,一般不存在返回null
b.如果在正常创建的bean集合中,从二级缓存earlySingletonObjects拿,存的是代理bean工厂
c.如果二级缓存不存在,且allowEarlyReference允许提前创建,从三级缓存singletonFactories中拿,存的是对应的 ObjectFactory(半成品bean)
(2.2)将beanName放到alreadyCreated缓存,并清除MergedBeanDefinition -> markBeanAsCreated(beanName)
(2.3)根据beanName重新获取MergedBeanDefinition -> final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName)
(2.4)检查dependsOn,如果有dependsOn先初始化依赖的bean
(2.5)第二次getSingleton,
a. 从singletonObjects获取,一般不存在
b. 初始化Bean -> createBean()
Ⅰ .解析beanName对应的Bean的类型 -> Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
Ⅱ:如果BeanFactory中存在InstantiationAwareBeanPostProcessor,执行postProcessBeforeInstantiation,AOP的核心
Ⅲ:创建Bean对象 -> Object beanInstance = doCreateBean(beanName, mbdToUse, args);反射来实例化对象
Ⅳ:MergedBeanDefinitionPostProcessors后置处理修改 BeanDefinition
Ⅴ:如果BeanFactory中存在InstantiationAwareBeanPostProcessor,执行postProcessAfterInstantiation -> populateBean -> ibp.postProcessAfterInstantiation
Ⅵ:对 bean 进行属性填充 -> populateBean(beanName, mbd, instanceWrapper);
Ⅶ:执行部分group1-Aware:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware ->initializeBean()开始
执行部分group2-Aware:ApplicationContextAwareProcessor -> applyBeanPostProcessorsBeforeInitialization()
Ⅷ:在初始化前调用BeanPostProcessor的postProcessBeforeInitialization方法,允许对bean实例进行包装 -> applyBeanPostProcessorsBeforeInitialization()
Ⅸ:执行注解版的生命周期初始化回调方法
Ⅹ:调用接口版的生命周期初始化回调方法,调用afterPropertiesSet方法,调用自定义初始化方法init-method
ⅩⅠ :在初始化后调用BeanPostProcessor的postProcessAfterInitialization方法,允许对bean实例进行包装,完成aop—生成代理,事件发布、监听 -> initializeBean 结束
c. 将单例对象放到单例池singletonObjects中