BeanFactoryPostProcessor和BeanPostProcessor

一.概述
我们经常使用Spring框架,Spring帮我托管bean的创建以及bean的管理,同时又暴漏出一些可扩展的地方,方面程序员去干涉bean或者Spring容器的创建。今天有同学问BeanPostProcessor相关的东西,由此很容易想到BeanFactoryPostProcessor,这里总结一下,方便后面在开发的过程中灵活使用。

二.BeanPostProcessor前置处理器
Spring容器在创建bean的时候,会看有没有BeanPostProcessor,如果有的话,会回调BeanPostProcessor接口中的两个方法,在bean创建之前执行程序员的一些个性化代码,在bean创建之后也执行一些程序员的个性化代码。

1
2
3
4
5
6
public interface BeanPostProcessor {
    /** 创建bean之前回调 **/
	Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
	/** 创建bean之后回调 **/
	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

三.BeanFactoryPostProcessor
这个可以让程序员去干涉一下Spring容器的创建,Spring容器创建的时候会回调这个接口的定义的这个方法,比如你可以在实现了这个接口的方法中给Spring容器注册一个JVM关闭时回调的钩子。

1
2
3
4
5
6
7
8
9
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 注册JVM关闭时的回调
        ConfigurableApplicationContext cxt = (ConfigurableApplicationContext)beanFactory;
        cxt.registerShutdownHook();
    }
}