BeanPostProcessor接口
在Spring创建bean的过程中,会在Bean创建之前和之后做一些操作,这些操作是通过前置后置处理器完成,而BeanPostProcessor就是前置后置处理器的接口,在bean的创建过程中,还会使用到
InstantiationAwareBeanPostProcessor、SmartInstantiationAwareBeanPostProcessor、MergedBeanDefinitionPostProcessor这几个基于BeanPostProcessor实现的前置后置处理器。
前置后置处理器执行顺序
自定义BeanPostProcessor接口:
public class BeanPostProcessorTest implements MergedBeanDefinitionPostProcessor, SmartInstantiationAwareBeanPostProcessor {
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
System.out.println(beanName + ": 执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法");
}
@Override
public void resetBeanDefinition(String beanName) {
System.out.println(beanName + ": 执行MergedBeanDefinitionPostProcessor的resetBeanDefinition方法");
}
@Override
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
System.out.println(beanName + ": 执行SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors方法");
return null;
}
@Override
public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
System.out.println(beanName + ": 执行SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法");
return bean;
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println(beanName + ": 执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法");
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.println(beanName + ": 执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法");
return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
System.out.println(beanName + ": 执行InstantiationAwareBeanPostProcessor的postProcessProperties方法");
return null;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + ": 执行BeanPostProcessor的postProcessBeforeInitialization方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + ": 执行BeanPostProcessor的postProcessAfterInitialization方法");
return bean;
}
}
再定义两个循环依赖的bean(循环依赖可以触发getEarlyBeanReference()方法的调用),打印结果为:
classOne: 执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
classOne: 执行SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors方法
classOne: 执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法
classOne: 执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
classOne: 执行InstantiationAwareBeanPostProcessor的postProcessProperties方法
two: 执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
two: 执行SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors方法
two: 执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法
two: 执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
two: 执行InstantiationAwareBeanPostProcessor的postProcessProperties方法
classOne: 执行SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法
two: 执行BeanPostProcessor的postProcessBeforeInitialization方法
two: 执行BeanPostProcessor的postProcessAfterInitialization方法
classOne: 执行BeanPostProcessor的postProcessBeforeInitialization方法
classOne: 执行BeanPostProcessor的postProcessAfterInitialization方法
前置后置执行器的执行顺序为:
前置后置处理器分析
1. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation.applyBeanPostProcessorsBeforeInstantiation()
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
return null;
}
2. SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors()
protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
throws BeansException {
if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
Constructor<?>[] ctors = bp.determineCandidateConstructors(beanClass, beanName);
if (ctors != null) {
return ctors;
}
}
}
return null;
}
3. MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors()
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
for (MergedBeanDefinitionPostProcessor processor : getBeanPostProcessorCache().mergedDefinition) {
processor.postProcessMergedBeanDefinition(mbd, beanType, beanName);
}
}
4. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean()
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
return;
}
}
}
5. InstantiationAwareBeanPostProcessor#postProcessProperties()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean()
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
if (filteredPds == null) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
return;
}
}
pvs = pvsToUse;
}
6. SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getEarlyBeanReference()
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
}
}
return exposedObject;
}
7. BeanPostProcessor#postProcessBeforeInitialization()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization()
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
8. BeanPostProcessor#postProcessAfterInitialization()
调用栈:
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean()
- org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization()
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}