上篇文章,介绍了spring中bean的生命周期,并且在文章末尾提到,spring使用BeanPostProcessor接口来处理生命周期的回调。我们可以在初始化函数(init())中定制化一些逻辑。上述BeanPostProcessor就是spring扩展点(extension points)。Spring及其灵活,一般情况下我们并不需要去继承ApplicationContext 去扩展功能,只需要使用spring提供的扩展接口,就可以刻spring无缝集成。
Spring主要提供了两类扩展点BeanPostProcessor和BeanFactoryPostProcessor。前者是操作bean的实例,后者使对bean的元数据定义进行扩展。
BeanPostProcessor
接口说明
BeanPostProcessor提供对bean实例的操作扩展,在spring容器对bean实例化和设置依赖之后,其回调开始执行。BeanPostProcessor接口定义的两个方法,分别在bean的初始化方法(InitializingBean接口,或者init-method定义)执行的前后执行:
public interface BeanPostProcessor{
/**
* 在bean的初始化方法执行后执行
*/
public Object postProcessAfterInitialization(Object arg0, String arg1)
throws BeansException ;
/**
* 在bean的初始化方法执行前执行
*/
public Object postProcessBeforeInitialization(Object arg0, String arg1)
throws BeansException ;
}
以上两个方法的参数列表中分别是spring容器创建的对象和beanName,返回值是经过定制化的对象。
BeanPostProcessor对bean实例进行操作,其在bean被实例化和后开始被执行相关回调。它是与容器相关的,它只对其所在容器中的bean有影响,对其父容器没有影响。
BeanPostProcessor也是一个bean,只不过它对其它bean进行后续的扩展处理。Spring容器可以自动的发现实现这个接口的bean。所以如果我们要使我们自定义的BeanPostProcessor起作用,可以像配置其他bean一样在配置文件中进行配置(当然也可以编码实现,向容器注册一个)。Spring容器对BeanPostProcessor类型的bean专门处理,所有的BeanPostProcessor及其引用的依赖在spring容器启动的时候实例化,作为spring容器启动的一个阶段。
Spring容器中内置很多BeanPostProcessor的实现,如上篇文章中使用JSR注解@PostConstruct,对它的处理就是使用BeanPostProcessor。它的另外一哥较常见的作用是spring-aop动态代理。
另外我们可以定义多个BeanPostProcessor,他们执行的顺序可以通过实现Ordered接口来控制。
一个示例
代码说明
这个示例演示有两个点:
1. BeanPostProcessor的在bean的生命周期中执行时机。
2. 模拟实现一个aop的事务处理代理。
这个示例使用的代码基本上还是上篇文章的代码,增加了一个BeanPostPr