今天用到了Spring 的后處理
或者說是“后置處理”
后處理是什么意思呢?
在Spring初始化容器內(nèi)的Bean之后 ,Spring的后處理給了你一個(gè)執(zhí)行代碼的機(jī)會(huì),來對(duì)
初始化好的Bean實(shí)例,進(jìn)一步的加強(qiáng),調(diào)整等...
我用到的是jbpm的例子:
jbpm中常用的服務(wù)有3個(gè)
private RepositoryService repositoryService;
private ExecutionService executionService;
private TaskService taskService;
分別通過 get 方法獲得
我的意思是想在Spring注入jbpm引擎的時(shí)候,就把3個(gè)服務(wù)給填充好
不必每一次都用get方法取得服務(wù),那樣太浪費(fèi)效率了(我寧愿犧牲點(diǎn)空間)
但是,如果你在構(gòu)造函數(shù)中把3個(gè)服務(wù)填充是用問題的
因?yàn)镾pring 實(shí)例化bean的順序是:
調(diào)用構(gòu)造函數(shù)(或者指定的構(gòu)造方法)——> 前處理 ——> 注入對(duì)象 ——> 后處理
所以在構(gòu)造函數(shù)中賦值給3個(gè)服務(wù)會(huì)有空指針錯(cuò)誤,
因?yàn)閖bpm的引擎還沒有注入進(jìn)來!
(也就是構(gòu)造函數(shù)的調(diào)用在注入對(duì)象之前)
但是如果不在構(gòu)造函數(shù)中賦值,那么我們就沒有機(jī)會(huì)賦值了
(除非你做靜態(tài)的)
所以,在這樣的情況下,后處理給我們帶來了這個(gè)執(zhí)行代碼的機(jī)會(huì)!
Spring 的后處理有2種
1. bean級(jí)別上的后處理
2. factory級(jí)別上的后處理
第一種是只對(duì)單個(gè)bean有作用,也就是這個(gè)后處理的觸發(fā),只有實(shí)例化該類bean的時(shí)候
是通過接口來實(shí)現(xiàn)的:
接口為:org.springframework.beans.factory.InitializingBean
也就是那個(gè)bean需要實(shí)現(xiàn)一個(gè)接口
(如果是這個(gè)bean不是你自己的,比如SessionFactory那些,是別人的bean,你
就只能使用下一種方法)
完成函數(shù):
/**后處理方法*/
public void afterPropertiesSet() throws Exception {
this.executionService = this.processEngine.getExecutionService();
this.taskService = this.processEngine.getTaskService();
this.repositoryService = this.processEngine.getRepositoryService();
}
我這里就是上面jbpm的后處理
this.processEngine 是Spring注入進(jìn)來的對(duì)象,在這里它已經(jīng)注入完成,已經(jīng)有值了
第二種是Spring容器級(jí)別的
也就是,它會(huì)對(duì)每一個(gè)Spring管理的bean實(shí)例化的時(shí)候進(jìn)行觸發(fā)
當(dāng)然,你可以使用 xxx instancesof XXXX 來判斷
只不過是麻煩點(diǎn)而已
這種方法是以一個(gè)Bean的形式給Spring
也就是注冊(cè)一個(gè)后處理bean,和普通bean是一樣的,但是需要多實(shí)現(xiàn)一個(gè)接口
BeanPostProcessor
當(dāng)你把實(shí)現(xiàn)了這個(gè)接口的Bean注冊(cè)給Spring的時(shí)候,Spring就會(huì)自動(dòng)判別,然后
把它當(dāng)做容器級(jí)別的后處理
需要填充方法:
public Object postProcessBeforeInitialization(Object bean , String
beanName)throws BeansException
和
public Object postProcessAfterInitialization(Object bean , String
beanName)throws BeansException
具體我就不多做解釋了,看方法名就知道做什么的了
這種方法一般用于對(duì)所有bean或者大多數(shù)bean進(jìn)行統(tǒng)一后處理的時(shí)候使用
還用于處理,自己不能為bean加入接口的情況下使用(比如上面提到的SessionFactory)
打完,手工
聯(lián)系客服