源码解读全文
三种后置增强器
BeanFactoryProcessor
在执行invokeBeanFactoryPostProcessors(beanFactory);
,通过getBean
进行创建,并根据顺序加入集合,没有保存在工厂属性中,是局部变量集合,增强完就结束使命Bean
后置处理器
registerBeanPostProcessors(beanFactory);
中通过getBean
进行顺序创建getBeanNamesForType
,获取BeanPostProcessor.class
的所有BeanNames
- 依次创建,并加入集合
this.beanPostProcessors.add(beanPostProcessor);
BeanPostProcessor
Bean
功能增强,在于改变,围绕着Bean
的创建和初始化过程- 流水线增强所有
- 功能增强逻辑
- 注入了什么组件
- 在什么位置,用什么后置增强器,增强了什么
BeanFactoryPostProcessor
- 后置增强工厂
- 唯一的方法
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
InitializingBean
- 针对单个
Bean
的增强 Bean
初始化后,属性注入完之后,进行额外处理
线程池初始化之后,进行属性的显示
PostProcessorRegistrationDelegate
- 代理执行所有的后置增强器(
BeanFactoryPostProcessor
和BeanFactoryPostProcessor
),后置增强器的管理员
BeanFactoryPostProcessor
- 工厂创建好后进行对工厂增强,创建的是
DefaultListableBeanFactory
,也是一个注册中心 refresh()
中invokeBeanFactoryPostProcessors(beanFactory);
执行bean工厂的后置增强- 先获取
this.beanFactoryPostProcessors;
,工厂中有的工厂后置处理器,进行执行,一般为null
BeanDefinitionRegistryPostProcessor
Set<String> processedBeans
保证只存在一个,拿到底层已经存在的BeanFactoryPostProcessor
,并调用postProcessBeanDefinitionRegistry
,先执行getBeanFactoryPostProcessors()
,实际上是没有的- 从工厂中的
BD
中,根据类型获取BeanDefinitionRegistryPostProcessor.class
的beanNames
,并getBean
,加入registryProcessors
- 优先处理实现了
PriorityOrdered/Ordered
,指定了顺序,如果都没有实现,根据类名排序- 创建过程跟创建普通的
Bean
是一样的流程,并且此时加入了单例池中
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
开始执行所有当前的后置处理器的postProcessBeanDefinitionRegistry
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
,执行postProcessBeanFactory
方法执行过程
postProcessBeanDefinitionRegistry
,操作BeanDefinition
注册中心,自定义注册postProcessBeanFactory
ConfigurationClassPostProcessor
- 实现了
PriorityOrdered
会被先执行 - 调用
postProcessBeanDefinitionRegistry
- 进行
BeanDeinfition
的扫描,configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
,找出配置类,加入候选集合 - 进行配置,名称解析器
ConfigurationClassParser parser = new ConfigurationClassParser(this.metadataReaderFactory, this.problemReporter, this.environment, this.resourceLoader, this.componentScanBeanNameGenerator, registry);
- 解析配置类的注解信息,
sourceClass = doProcessConfigurationClass(configClass, sourceClass, filter);
BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
同样是该方法内,在处理完BeanDefinitionRegistryPostProcessor
之后,进行处理String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
获取所有BeanFactoryPostProcessor
,并创建出Bean
- 根据
PriorityOrdered/Ordered/无顺序
,依次调用invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
BeanPostProcessor
registerBeanPostProcessors(beanFactory);
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
获取所有的Bean
后置处理器- 根据
PriorityOrdered/Ordered/无顺序
,依次加入集合,并依次调用 BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
生成Bean
- 其中处理实现了
MergedBeanDefinitionPostProcessor
接口的后置处理器,internalPostProcessors.add(pp);
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
,加入beanPostProcessors
集合,再创建Bean
的时候进行调用
同样会加入单例池中
SmartInstantiationAwareBeanPostProcessor调用
功能
- 通过后置处理器,可以返回自定义的
bean
类型,在predictBeanType
期间改变bean
的类型
- 此时,后置处理器,已经形成
Bean
,被处理过了,不会再被处理- 在其他
Bean
生成之前,还有机会进行类型改变
getBean
时,用构造器创造对象之前,可以调用determineCandidateConstructors
指定构造器- 代理增强,可以自定义返回早期
Bean
第一次调用流程
PostProcessor
处理完后,registerListeners();
开始调用
- 事件监听机制
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
,处理BeanDefinition
为ApplicationListener
的名字
获取容器中的所有监听器的名字,为了获取监听器对象
doGetBeanNamesForType
,通过类型,获取名字
- 先获取所有
BD
名字,beanDefinitionNames
- 遍历所有名字,在
beanDefinitionMap
找定义信息,看类型是否匹配- 只保存了<name, type>的信息,没有保存<type, name[]>的信息
matchFound = isTypeMatch(beanName, type, allowFactoryBeanInit);
boolean allowFactoryBeanInit = (allowEagerInit || containsSingleton(beanName));
,决定是否能进行类型调整,allowEagerInit
默认为false
,containsSingleton(beanName)
是否已经被创建好
predictedType = predictBeanType(beanName, mbd, typesToMatch);
,没有被提前生成Bean
,会进行类型干预- 遍历处理,最终调用自定义的处理器,在
getBeanPostProcessorCache
会进行分类
第二次调用
finishBeanFactoryInitialization(beanFactory);
中String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
进行调用
加载时织入组件
InstantiationAwareBeanPostProcessor
功能
postProcessBeforeInstantiation
自定义创建Bean
过程
finishBeanFactoryInitialization(beanFactory);
中创建Bean
,beanFactory.preInstantiateSingletons();
中调用getBean
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
,创建对象之前给后置处理器一个机会,能够提前返回一个对象,此时还没有真正创建对象
创建成功,
getBean
直接结束
- 调用
postProcessBeforeInstantiation
MergedBeanDefinitionPostProcessor
功能
- 修改
BeanDefinition
信息
过程
instanceWrapper = createBeanInstance(beanName, mbd, args);
创建好后执行applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
InstantiationAwareBeanPostProcessor
功能
postProcessAfterInstantiation
,属性赋值之前,可以进行中断postProcessProperties
,进行自定义赋值,解析自定义注解
返回false,赋值过程全部结束
过程
populateBean(beanName, mbd, instanceWrapper);
赋值时执行postProcessAfterInstantiation
- 自动注入,也在这个过程中,但是直接返回
true
,没做处理 postProcessProperties
,该过程中会进行AutowiredAnnotationBeanPostProcessor
自动注入
@Autowired
在属性上,直接复制@Autowried
在方法上,调用其方法,并加入pvs
中,后续调用applyPropertyValues
进行属性赋值
BeanPostProcessor
功能
postProcessBeforeInitialization
改变Bean
对象
过程
exposedObject = initializeBean(beanName, exposedObject, mbd);
赋值结束后,进行初始化wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
初始化之前的增强处理invokeInitMethods
之后,wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
- 调用
postProcessAfterInitialization
,初始化之后进行处理
Aware
- 其实就是
BeanPostProcessor
initializeBean
中,wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
调用初始化前的后置处理器- 其中会调用
ApplicationContextAwareProcessor
的postProcessBeforeInitialization
,进行接口判断,并执行Aware
接口规定的方法,invokeAwareInterfaces(bean);
- 利用多态方式进行处理
- 还有很多,可以自行查看
invokeAwareInterfaces(bean);
InitializingBean
功能
- 自定义初始化方法,可以所有属性都准备好,初始化数据库连接池
过程
invokeInitMethods(beanName, wrappedBean, mbd);
,执行初始化方法
- 可以通过
beanDefinition.setInitMethodName();
或者@PostConstruct
自定义初始化方法invokeCustomInitMethod(beanName, bean, mbd);
执行自定义初始化方法
- 如果实现了
InitializingBean
,调用afterPropertiesSet
对getBean影响
- 可以通过
InstantiationAwareBeanPostProcessor
,自定义返回Bean
- 在选择构造器时,可以通过
SmartInstantiationAwareBeanPostProcessor
自定义构造器 - 创建
Bean
之后,通过MergedBeanDefinitionPostProcessor
,修改BeanDefinition
信息 - 开始赋值前,通过
InstantiationAwareBeanPostProcessor
的postProcessAfterInstantiation
,进行自定义赋值处理,可以终端初始化 - 真正赋值时,可以通过
InstantiationAwareBeanPostProcessor
调用postProcessProperties
,进行自定义赋值 - 赋值结束后,在初始化之前,可以通过
BeanPostProcessor
,调用postProcessBeforeInitialization
,改变Bean
- 初始化过程中,可以通过实现
InitializingBean
接口,自定义初始化方法afterPropertiesSet
- 在初始化之后,可以通过
BeanPostProcessor
,调用postProcessAfterInitialization
,改变Bean