Spring源码(3):创建Bean的前置后置处理器

679 阅读2分钟

BeanPostProcessor接口

在Spring创建bean的过程中,会在Bean创建之前和之后做一些操作,这些操作是通过前置后置处理器完成,而BeanPostProcessor就是前置后置处理器的接口,在bean的创建过程中,还会使用到 InstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessorMergedBeanDefinitionPostProcessor这几个基于BeanPostProcessor实现的前置后置处理器。

image.png

前置后置处理器执行顺序

自定义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方法

前置后置执行器的执行顺序为:

image.png

前置后置处理器分析

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;
}