Spring是目前最流行的JavaEE Framework,但是使用Spring的Spring-WS開發(fā)WebService卻十分繁瑣。XFire是一個簡化WebService開發(fā)的開源項目,通過Spring和XFire的結(jié)合可以大大簡化基于Spring Framework的應(yīng)用中的WebService開發(fā)。
XFire是完全基于流數(shù)據(jù)處理進行工作的系統(tǒng),這意味著XFire不是將整個SOAP文檔緩存在內(nèi)存中,而是以管道的方式接收SOAP流數(shù)據(jù)。這種工作方式的轉(zhuǎn)變帶來了可觀的性能回報,同時節(jié)省了內(nèi)存的占用。
對于習(xí)慣了Axis、GLUE等這些基于DOM處理模型Web Service框架的開發(fā)者來說,需要一些時間來適應(yīng)這種轉(zhuǎn)變。
XFire從管道中接收一個SOAP請求到返回一個SOAP響應(yīng),會經(jīng)歷一系列的階段。在管道調(diào)用的任何一個階段,XFire都可以添加一些額外的 Handler,在對消息進行加工處理后再傳入到下一個階段中。圖1展示了XFire管道從接收SOAP請求到返回SOAP響應(yīng)所經(jīng)歷的所有階段:
圖1 XFire Web Service請求和響應(yīng)的過程
在SOAP請求消息對Web Service發(fā)起真正調(diào)用之前,分別會經(jīng)過傳輸(Transport)、預(yù)轉(zhuǎn)發(fā)(PreDispatch)、轉(zhuǎn)發(fā)(Dispatch)、策略實施(Policy)、用戶信息處理(User)、預(yù)調(diào)用(PreInvoke)、服務(wù)調(diào)用(Service Invocation)等階段。當,Web Service調(diào)用后,XFire生成響應(yīng)SOAP消息并通過管道發(fā)送給客戶端請求者,這一過程會先后經(jīng)歷調(diào)用后(PostInvoke)、用戶信息處理(User)、策略實施(Policy)、傳輸(Transport)這四個階段。每一個階段都是一個可控點,通過編寫并注冊一些相應(yīng)的Handler就可以實施一些額外處理邏輯,如審計、SOAP消息加密、簽名、壓縮等。
將POJO Bean導(dǎo)出為Web Service
通過XFire為Spring提供的服務(wù)導(dǎo)出器可以輕松地將POJO導(dǎo)出為標準的Web Service,此外,XFire還允許我們使用JSR 181注解對POJO進行標注,無需使用XML配置就可以導(dǎo)出為Web Service,各種復(fù)雜的轉(zhuǎn)換細節(jié)被巧妙地隱藏在XFire之中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="mathService" class="com.zjh.manager.MathServiceImpl" />
<bean id="mathExporters" class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceFactory" ref="xfire.serviceFactory" />
<property name="xfire" ref="xfire" />
<property name="serviceBean" ref="mathService" />
<property name="serviceClass" value="com.zjh.manager.MathService" />
<property name="name" value="mathWebService" />
</bean>
</beans>
package com.zjh.manager;
public interface MathService {
public String add(int a,int b);
}
package com.zjh.manager;
public class MathServiceImpl implements MathService {
public String add(int a, int b) {
long result = a+b;
return "計算的結(jié)果:" + result;
}
}
這樣便生成一個web Service,可以通過域名 http://localhost:8080/testwebservice_server/services/mathWebService?wsdl 來訪問,并編寫客戶端代碼了