Spring Framework版本 5.3.4

1. BeanPostProcessor是干什么的?

BeanPostProcessor接口作用是:如果咱们须要在Spring容器实现Bean的实例化、配置和其余的初始化前后增加一些本人的逻辑解决,咱们就能够定义一个或者多个BeanPostProcessor接口的实现,而后注册到容器中。(相似于拦截器和过滤器)。 BeanPostProcessor分为三大类如下图:

  • 实例化
  • 初始化
  • 销毁
Bean实例化会执行 InstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessor 这两类处理器,Bean实例化后每个bean就会通过 BeanPostProcessorMergedBeanDefinitionPostProcessor 实现的类的解决。Bean销毁会通过 DestructionAwareBeanPostProcessor 处理器。

Spring Bean的实例化图解:

在查看完 Aware 接口后,就开始调用 BeanPostProcessor 进行前置解决后置解决。上面来看一下Spring中的几类继承:

  • AOP相干的

  • bean 和 context相干的

  • Spring Boot相干的实现

BeanPostProcessor是在Bean实例化后,在自定义初始化办法前后执行。

2. BeanPostProcessor

处理器定义了Bean 初始化 前后执行的办法。

public interface BeanPostProcessor {    //自定义初始化办法之前执行    @Nullable    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        return bean;    }    //自定义初始化办法之后执行    @Nullable    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        return bean;    }}
代码示例地址:github.com/mxsm/spring…

代码演示:

public class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println( " ----before----- " + beanName);        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println( " ----after----- " + beanName);        return bean;    }}
public class TestBean {    private String name;    public void init(){        System.out.println("TestBean---init()");        this.name = "test";    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans        https://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context        https://www.springframework.org/schema/context/spring-context.xsd">    <bean id="testBean" class="com.github.mxsm.bean.TestBean" init-method="init"/>    <bean class="com.github.mxsm.processor.MyBeanPostProcessor" id="myBeanPostProcessor"/></beans>
public class ApplicationBoot{    public static void main( String[] args ) {        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");        TestBean testBean = applicationContext.getBean(TestBean.class);        System.out.println(testBean.getName());    }}


通过代码能够看进去执行的后果。

3.InstantiationAwareBeanPostProcessor

该处理器定义了Bean 实例化 前后执行的办法。

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {    //实例化之前    @Nullable    default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {         //这里能够自定义代理类        return null;    }    //实例化后-然而执行在初始化之前    default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {        return true;    }    //解决bean的Properties值    @Nullable    default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)            throws BeansException {        return null;    }}

4.DestructionAwareBeanPostProcessor

该处理器了销毁Bean之前的操作。

public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {    //bean销毁之前    void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;    //bean是否须要销毁    default boolean requiresDestruction(Object bean) {        return true;    }}

5. 看一下Spring本身的实现

class ApplicationContextAwareProcessor implements BeanPostProcessor {    private final ConfigurableApplicationContext applicationContext;    private final StringValueResolver embeddedValueResolver;    /**     * Create a new ApplicationContextAwareProcessor for the given context.     */    public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {        this.applicationContext = applicationContext;        this.embeddedValueResolver = new EmbeddedValueResolver(applicationContext.getBeanFactory());    }    @Override    @Nullable    public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {        AccessControlContext acc = null;        if (System.getSecurityManager() != null &&                (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||                        bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||                        bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {            acc = this.applicationContext.getBeanFactory().getAccessControlContext();        }        if (acc != null) {            AccessController.doPrivileged((PrivilegedAction<Object>) () -> {                invokeAwareInterfaces(bean);                return null;            }, acc);        }        else {            invokeAwareInterfaces(bean);        }        return bean;    }    private void invokeAwareInterfaces(Object bean) {        if (bean instanceof Aware) {            if (bean instanceof EnvironmentAware) {                ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());            }            if (bean instanceof EmbeddedValueResolverAware) {                ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);            }            if (bean instanceof ResourceLoaderAware) {                ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);            }            if (bean instanceof ApplicationEventPublisherAware) {                ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);            }            if (bean instanceof MessageSourceAware) {                ((MessageSourceAware) bean).setMessageSource(this.applicationContext);            }            if (bean instanceof ApplicationContextAware) {                ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);            }        }    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) {        return bean;    }}

以后次要用来解决继承了 Aware 接口类。而后依据 Aware 接口的不同实现设置对应的接口对象

6. BeanPostProcessor Spring源码剖析

首先明确一点 BeanPostProcessor 实现的类都是Spring容器中的一个Bean。在 AbstractApplicationContext#refresh 是最重要的一个办法:

public void refresh() throws BeansException, IllegalStateException {        synchronized (this.startupShutdownMonitor) {                //省了局部代码            try {                //省了局部代码                // Register bean processors that intercept bean creation.                registerBeanPostProcessors(beanFactory);              //省了局部代码            }            catch (BeansException ex) {            }            finally {                //省了局部代码            }        }}protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {    //通过PostProcessorRegistrationDelegate类的静态方法解决    PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}

上面看一下 PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); 办法

    public static void registerBeanPostProcessors(            ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);        // Register BeanPostProcessorChecker 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.        int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;        beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));        //解决分为三类:1 PriorityOrdered实现 2 Ordered 第三类就是一般的        List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();        List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();        List<String> orderedPostProcessorNames = new ArrayList<>();        List<String> nonOrderedPostProcessorNames = new ArrayList<>();        for (String ppName : postProcessorNames) {            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {                BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);                priorityOrderedPostProcessors.add(pp);                if (pp instanceof MergedBeanDefinitionPostProcessor) {                    internalPostProcessors.add(pp);                }            }            else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {                orderedPostProcessorNames.add(ppName);            }            else {                nonOrderedPostProcessorNames.add(ppName);            }        }        // 解决PriorityOrdered实现        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);        registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);        // 解决 Ordered实现.        List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();        for (String ppName : orderedPostProcessorNames) {            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);            orderedPostProcessors.add(pp);            if (pp instanceof MergedBeanDefinitionPostProcessor) {                internalPostProcessors.add(pp);            }        }        sortPostProcessors(orderedPostProcessors, beanFactory);        registerBeanPostProcessors(beanFactory, orderedPostProcessors);        // 解决失常的        List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();        for (String ppName : nonOrderedPostProcessorNames) {            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);            nonOrderedPostProcessors.add(pp);            if (pp instanceof MergedBeanDefinitionPostProcessor) {                internalPostProcessors.add(pp);            }        }        registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);        //注册MergedBeanDefinitionPostProcessor        sortPostProcessors(internalPostProcessors, beanFactory);        registerBeanPostProcessors(beanFactory, internalPostProcessors);        // Re-register post-processor for detecting inner beans as ApplicationListeners,        // moving it to the end of the processor chain (for picking up proxies etc).        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));    }

通过该办法将 BeanPostProcessor 的以上几种实现类都注册到Spring中。

而后在生成Bean的时候去执行, AbstractAutowireCapableBeanFactory.createBean 创立Bean

    protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)            throws BeanCreationException {            //省略代码            try {            // 执行实例化之前办法.            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);            if (bean != null) {                return bean;            }                      //省略代码            }    }    protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {        Object bean = null;        if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {            if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {                Class<?> targetType = determineTargetType(beanName, mbd);                if (targetType != null) {                    //执行InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(实例化之前办法)                    bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);                    if (bean != null) {                        //执行InstantiationAwareBeanPostProcessor#postProcessAfterInitialization(初始化后的办法)                        bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);                    }                }            }            mbd.beforeInstantiationResolved = (bean != null);        }        return bean;    }

通过代码能够晓得 resolveBeforeInstantiation 办法是执行实例化之前的办法。如果实例化之前的办法返回了对应Bean那么间接执行初始化后的办法。实例化 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation 办法执行返回Bean为空就调用 AbstractAutowireCapableBeanFactory#doCreateBean 办法。在这个办法外面有如下几个重要的办法:

  • AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors 办法
  • 执行 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition 办法
  • AbstractAutowireCapableBeanFactory#populateBean 办法
  • 执行 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation 办法,如果后面办法返回true,执行办法 InstantiationAwareBeanPostProcessor#postProcessProperties 办法
  • AbstractAutowireCapableBeanFactory#initializeBean 办法
  • 执行 BeanPostProcessor#postProcessBeforeInitialization 办法,而后执行 AbstractAutowireCapableBeanFactory#invokeInitMethods 办法(包含实现了InitializingBean接口的办法或者有注解@PostConstruct的办法),而后执行 BeanPostProcessor#postProcessAfterInitialization

7. 总结

BeanPostProcessor 次要用来解决Bean外部的注解。比方Spring本人实现的@Autowired、@Value, @EJB,@WebServiceRef,@PostConstruct,@PreDestroy等

自定义相似于@Value,@Autowired的注解,次要用于Java类变量或者办法上的注解 次要用于解决Bean外部的注解实现,次要是变量或者办法下面的注解