在上一篇文章里,我們使用了基于事件傳遞的機(jī)制來對(duì)企業(yè)應(yīng)用的子系統(tǒng)進(jìn)行解耦,但是由于需要強(qiáng)制地繼承或者實(shí)現(xiàn)一個(gè)廣播事件的接口EventBrocast,實(shí)際上,就職責(zé)分離和功能單一的角度來看,前篇文章中的例子中,這個(gè)機(jī)制對(duì)OrderService侵入太大了,我們必須尋找更為有效的方法,不需要程序?qū)崿F(xiàn)某個(gè)接口或繼承某個(gè)超類來完成這個(gè)工作,這一切必須對(duì)具體程序完全透明,這個(gè)責(zé)任誰(shuí)能承擔(dān)呢,毫無疑問,歷史的重?fù)?dān)就落在了AOP身上 ;) 。下面我們來看看具體的實(shí)現(xiàn):
OrderService已經(jīng)實(shí)現(xiàn),除了訂單的處理,沒有任何的職責(zé),為了完成事件的廣播,必須要有一個(gè)途徑能夠攔截到OrderService的所有方法調(diào)用,然后分析調(diào)用的語(yǔ)義(參數(shù)),并根據(jù)這些內(nèi)容給廣播出去。而恰好,AOP組織統(tǒng)一的接口MethodInterceptor可以完成這個(gè)功能。于是上篇文章的程序可以這樣修改:
// 訂單服務(wù)只負(fù)責(zé)做好自己的事
public class OrderService {
public Order saveOrder(Order order){
。。。。處理訂單
。。。保存
}
}
而為了攔截任何的方法調(diào)用,則實(shí)現(xiàn)了攔截器EventBrocaster:
public class EventBrocaster extends LifeEventBrocast implements MethodInterceptor {
private List eventListeners;
public void setEventListener(List list){
this.eventListeners=list;
}
public List geteEventListeners(){
return eventListeners;
}
public Object invoke(MethodInvocation invoke) {
obj = invoke.proceed();// 執(zhí)行被攔截的方法完成業(yè)務(wù)操作
Object[] params = invoke.getArguments();
Object param = params.length > 1 ? params : params[0];
Event le = new Event(param, eventType);
brocast(le);// 廣播
}
}
事件偵聽器:
public OrderEventListener implements EventListener{
private FinancialService financialService;
public void setFinancialService(FinancialService fs){
this.financialService=fs;
}
public void performed(Event e){
Order order =(Order) e.getObject();
financialService.createRequestOfMoney(order.getAmount()
);
}
}
然后,在Spring配置里將這些組件全部連接起來:
1.OrderService實(shí)現(xiàn):
<bean id="orderServiceImpl" class="OrderService" autowire="byName">
</bean>
2. 聲明OrderService代理:
<bean id="orderService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="orderServiceImpl"/>
</property>
<property name="interceptorNames"> <!--攔截器列表-->
<list>
<value>eventBrocaster</value>
</list>
</property>
<property name="singleton">
<value>true</value>
</property>
</bean>
3.事件廣播攔截器
<bean id="eventBrocaster" class="com.wolfsquare.core.service.EventBrocaster" singleton="true">
<property name="lifecycleListeners">
<list>
<ref bean="orderEventListener"/>
</list>
</property>
</bean>
4.具體的財(cái)務(wù)子系統(tǒng)的偵聽器實(shí)現(xiàn)與財(cái)務(wù)系統(tǒng)的通訊:
<bean id="orderEventListener" class="OrderEventListener" autowire="byName">
<propety name="financialService"><ref bean="financialService"/></property>
</bean>
這樣,我們與具體實(shí)現(xiàn)無關(guān)的事件廣播就做到了,聰明的朋友看到這里,肯定想到了攔截器方式不僅僅適用與事件廣播,還可以實(shí)現(xiàn)事務(wù)的統(tǒng)一管理,事實(shí)上Spring的事務(wù)管理就是這樣完成的,還可以實(shí)現(xiàn)權(quán)限的控制例如Acegi,簡(jiǎn)直有點(diǎn)象萬能的膠水,呵呵。
從兩篇文章的逐步探討下,同一個(gè)機(jī)器,同一個(gè)虛擬機(jī)之內(nèi)的數(shù)據(jù)通訊都可以實(shí)現(xiàn)了,那么異構(gòu)系統(tǒng)和多虛擬機(jī)間的通訊又如何處理呢,于是ESB(企業(yè)服務(wù)總線)的概念就慢慢浮現(xiàn)出來了,不過這個(gè)不在本文探討的范疇了,也許在不久的將來,我會(huì)補(bǔ)上這一篇。
(全文完)