Spring是目前最流行的JavaEE Framework,但是使用Spring的Spring-WS開發WebService卻十分繁瑣。XFire是一個簡化WebService開發的開源項目,通過Spring和XFire的結合可以大大簡化基于Spring Framework的應用中的WebService開發。
XFire是完全基于流數據處理進行工作的系統,這意味著XFire不是將整個SOAP文檔緩存在內存中,而是以管道的方式接收SOAP流數據。這種工作方式的轉變帶來了可觀的性能回報,同時節省了內存的占用。
對于習慣了Axis、GLUE等這些基于DOM處理模型Web Service框架的開發者來說,需要一些時間來適應這種轉變。
XFire從管道中接收一個SOAP請求到返回一個SOAP響應,會經歷一系列的階段。在管道調用的任何一個階段,XFire都可以添加一些額外的 Handler,在對消息進行加工處理后再傳入到下一個階段中。圖1展示了XFire管道從接收SOAP請求到返回SOAP響應所經歷的所有階段:
圖1 XFire Web Service請求和響應的過程
在SOAP請求消息對Web Service發起真正調用之前,分別會經過傳輸(Transport)、預轉發(PreDispatch)、轉發(Dispatch)、策略實施(Policy)、用戶信息處理(User)、預調用(PreInvoke)、服務調用(Service Invocation)等階段。當,Web Service調用后,XFire生成響應SOAP消息并通過管道發送給客戶端請求者,這一過程會先后經歷調用后(PostInvoke)、用戶信息處理(User)、策略實施(Policy)、傳輸(Transport)這四個階段。每一個階段都是一個可控點,通過編寫并注冊一些相應的Handler就可以實施一些額外處理邏輯,如審計、SOAP消息加密、簽名、壓縮等。
將POJO Bean導出為Web Service
通過XFire為Spring提供的服務導出器可以輕松地將POJO導出為標準的Web Service,此外,XFire還允許我們使用JSR 181注解對POJO進行標注,無需使用XML配置就可以導出為Web Service,各種復雜的轉換細節被巧妙地隱藏在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 "計算的結果:" + result;
}
}
這樣便生成一個web Service,可以通過域名 http://localhost:8080/testwebservice_server/services/mathWebService?wsdl 來訪問,并編寫客戶端代碼了