今天用到了Spring 的后处理
或者说是“后置处理”
后处理是什么意思呢?
在Spring初始化容器内的Bean之后 ,Spring的后处理给了你一个执行代码的机会,来对
初始化好的Bean实例,进一步的加强,调整等...
我用到的是jbpm的例子:
jbpm中常用的服务有3个
private RepositoryService repositoryService;
private ExecutionService executionService;
private TaskService taskService;
分别通过 get 方法获得
我的意思是想在Spring注入jbpm引擎的时候,就把3个服务给填充好
不必每一次都用get方法取得服务,那样太浪费效率了(我宁愿牺牲点空间)
但是,如果你在构造函数中把3个服务填充是用问题的
因为Spring 实例化bean的顺序是:
调用构造函数(或者指定的构造方法)——> 前处理 ——> 注入对象 ——> 后处理
所以在构造函数中赋值给3个服务会有空指针错误,
因为jbpm的引擎还没有注入进来!
(也就是构造函数的调用在注入对象之前)
但是如果不在构造函数中赋值,那么我们就没有机会赋值了
(除非你做静态的)
所以,在这样的情况下,后处理给我们带来了这个执行代码的机会!
Spring 的后处理有2种
1. bean级别上的后处理
2. factory级别上的后处理
第一种是只对单个bean有作用,也就是这个后处理的触发,只有实例化该类bean的时候
是通过接口来实现的:
接口为:org.springframework.beans.factory.InitializingBean
也就是那个bean需要实现一个接口
(如果是这个bean不是你自己的,比如SessionFactory那些,是别人的bean,你
就只能使用下一种方法)
完成函数:
/**后处理方法*/
public void afterPropertiesSet() throws Exception {
this.executionService = this.processEngine.getExecutionService();
this.taskService = this.processEngine.getTaskService();
this.repositoryService = this.processEngine.getRepositoryService();
}
我这里就是上面jbpm的后处理
this.processEngine 是Spring注入进来的对象,在这里它已经注入完成,已经有值了
第二种是Spring容器级别的
也就是,它会对每一个Spring管理的bean实例化的时候进行触发
当然,你可以使用 xxx instancesof XXXX 来判断
只不过是麻烦点而已
这种方法是以一个Bean的形式给Spring
也就是注册一个后处理bean,和普通bean是一样的,但是需要多实现一个接口
BeanPostProcessor
当你把实现了这个接口的Bean注册给Spring的时候,Spring就会自动判别,然后
把它当做容器级别的后处理
需要填充方法:
public Object postProcessBeforeInitialization(Object bean , String
beanName)throws BeansException
和
public Object postProcessAfterInitialization(Object bean , String
beanName)throws BeansException
具体我就不多做解释了,看方法名就知道做什么的了
这种方法一般用于对所有bean或者大多数bean进行统一后处理的时候使用
还用于处理,自己不能为bean加入接口的情况下使用(比如上面提到的SessionFactory)
打完,手工
联系客服