一、Spring注册自己的BeanDefinition到BeanFactory
构造AnnotationConfigApplicationContext,
实例化AnnotatedBeanDefinitionReader对象时,
注册如下6个BeanDefinition到Bean工厂的beanDefinitionMap中
0 = {BeanDefinitionHolder@799} "Bean definition with name 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor': Root bean: class [org.springframework.context.annotation.ConfigurationClassPostProcessor];
BeanDefinitionRegistryPostProcessor --> BeanFactoryPostProcessor
1 = {BeanDefinitionHolder@800} "Bean definition with name 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor];
BeanPostProcessor
2 = {BeanDefinitionHolder@801} "Bean definition with name 'org.springframework.context.annotation.internalRequiredAnnotationProcessor': Root bean: class [org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor];
BeanPostProcessor
3 = {BeanDefinitionHolder@802} "Bean definition with name 'org.springframework.context.annotation.internalCommonAnnotationProcessor': Root bean: class [org.springframework.context.annotation.CommonAnnotationBeanPostProcessor];
BeanPostProcessor
4 = {BeanDefinitionHolder@803} "Bean definition with name 'org.springframework.context.event.internalEventListenerProcessor': Root bean: class [org.springframework.context.event.EventListenerMethodProcessor];
ApplicationContextAware
5 = {BeanDefinitionHolder@804} "Bean definition with name 'org.springframework.context.event.internalEventListenerFactory': Root bean: class [org.springframework.context.event.DefaultEventListenerFactory];
EventListenerFactory
二、Spring注册BeanPostProcessors到BeanFactory
1、准备BeanFactory时,注册了如下两个BeanPostProcessor到BeanFactory的 List<BeanPostProcessor> beanPostProcessors
// Configure the bean factory with context callbacks.
// 能够在bean中获取各种 *Aware (各Aware都有其作用)
org.springframework.context.support.ApplicationContextAwareProcessor
// Register early post-processor for detecting inner beans as ApplicationListeners.
org.springframework.context.support.ApplicationListenerDetector
2、执行ConfigurationClassPostProcessor类中postProcessBeanFactory()(BeanFactoryPostProcessor接口的方法)方法中,注册一个BeanPostProcessor到BeanFactory的 List<BeanPostProcessor> beanPostProcessors
org.springframework.context.annotation.ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor
3、AnnotationConfigApplicationContext的refresh()中专门注册BeanPostProcessors
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
从Bean工厂中取出BeanPostProcessor的Bean,有如下三个:
0 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor" AutowiredAnnotationBeanPostProcessor
1 = "org.springframework.context.annotation.internalRequiredAnnotationProcessor" RequiredAnnotationBeanPostProcessor
2 = "org.springframework.context.annotation.internalCommonAnnotationProcessor" CommonAnnotationBeanPostProcessor
注册一个检测功能的BeanPostProcessor,用于当存在Bean实例化时没能执行全部的BeanPostProcessor时打印日志(BeanFactory中需要注册进去的BeanPostProcessor还么有完全注册进去,beanPostProcessors个数小于总的需要注册的个数),BeanPostProcessorChecker中提取存放了总的需要执行的BeanPostProcessor的个数(7)
/**
* BeanPostProcessor that logs an info message when a bean is created during
* BeanPostProcessor instantiation, i.e. when a bean is not eligible for
* getting processed by all BeanPostProcessors.
*/
org.springframework.context.support.PostProcessorRegistrationDelegate.BeanPostProcessorChecker
从Bean工厂中取出BeanPostProcessor的Bean都实现了PriorityOrdered接口,进行排序后优先注册到Bean工厂,排序后顺序为:
0 = {CommonAnnotationBeanPostProcessor@1972}
1 = {AutowiredAnnotationBeanPostProcessor@1930}
2 = {RequiredAnnotationBeanPostProcessor@1953}
注册后的 7个 BeanPostProcessor如下:
0 = {ApplicationContextAwareProcessor@1208}
1 = {ApplicationListenerDetector@1993}
2 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@1767}
3 = {PostProcessorRegistrationDelegate$BeanPostProcessorChecker@1900}
4 = {CommonAnnotationBeanPostProcessor@1972}
5 = {AutowiredAnnotationBeanPostProcessor@1930}
6 = {RequiredAnnotationBeanPostProcessor@1953}
最后将ApplicationListenerDetector移至最后,最终结果为:
0 = {ApplicationContextAwareProcessor@1167}
1 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@1731}
2 = {PostProcessorRegistrationDelegate$BeanPostProcessorChecker@1732}
3 = {CommonAnnotationBeanPostProcessor@1733}
4 = {AutowiredAnnotationBeanPostProcessor@1734}
5 = {RequiredAnnotationBeanPostProcessor@1735}
6 = {ApplicationListenerDetector@1725}