引入:java
咱們上述例子展現瞭如何從java code開始來開發一個基於jaxws的web service並使其對外服務,可是咱們建立web service的過程,其實並非由spring來完成的,咱們這裏講展現如何利用spring配置文件來完成這件事情。web
實踐:spring
其實很簡單,只要稍做修改就能夠了。apache
首先,在web.xml中,咱們定義一個spring的應用上下文文件(反正我不太喜歡它默認的applicationContext.xml,由於咱們本身起有意義的名字會讓應用更加有可控制性而且提升可讀性),而且被ContextLoader所載入,爲了節省篇幅,咱們只貼代碼片段了,你們都知道放在哪裏。app
<!-- 這裏演示cxf怎麼和Spring容器集成,從而利用Spring的配置文件來管理髮布的web service --> <!-- BEGIN SPRING BEAN CONFIGURATION--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- END SPRING BEAN CONFIGURATION -->
因此咱們必須在WEB-INF/beans.xml中定義一個bean的配置文件,其實大致上和咱們上文中的cxf-servlet.xml差很少,只不過咱們要導入一些spring配置:maven
<?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:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- 導入cxf中的spring的一些配置文件,他們都在cxf-<version>.jar文件中 --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="calcService" implementor="com.charles.cxfstudy.server.services.CalcServiceImpl" address="/calc" /> </beans>
從這裏能夠看出,顯著的不一樣在於,咱們用<import>元素導入了3個配置文件,他們都和spring相關,他們中定義的bean纔會負責建立和管理web service,這些配置文件都在類路徑下的 cxf-<version>.jar的jar包中。ide
而後咱們在下面就能夠定義咱們的要建立的web service的endpoint了,這裏咱們用<endpoint>元素來給定要建立的webservice是用具體的什麼實現類來建立的,而且綁定到什麼路徑上,最後賦予一個被bean容器引用的id.url
由於在上面配置文件中咱們定義了一個CalcServiceImpl,因此咱們必須爲其寫一個服務接口和服務實現類:spa
服務接口以下,爲了簡單起見,咱們計算服務只提供2個整數的相加運算:code
/** * 這是一個web服務接口定義,假設這裏定義了一個計算服務,而且簡單起見只有加法與水暖 */ package com.charles.cxfstudy.server.services; import javax.jws.WebParam; import javax.jws.WebService; /** * @author charles.wang * */ @WebService public interface ICalcService { /** * 計算兩個整數類型的和 * @param val1 第一個運算子 * @param val2 第二個運算子 * @return 和 */ int calcSum (@WebParam(name="a")int val1,@WebParam(name="b")int val2); }
這裏我第一次使用了@WebParam的註解,這個目的是爲了告訴CXF引擎在生成對應的wsdl文件時候,不要把這些參數映射到參數名val1,val2上,而是映射到這裏我用name屬性指定的a和b上。
而後就定義一個服務實現類,和之前徹底同樣:
/** * 服務實現類,提供計算服務 */ package com.charles.cxfstudy.server.services; import javax.jws.WebService; /** * @author charles.wang * */ @WebService(endpointInterface="com.charles.cxfstudy.server.services.ICalcService") public class CalcServiceImpl implements ICalcService { /** * 計算兩個整數類型的和 * @param val1 第一個運算子 * @param val2 第二個運算子 * @return 和 */ @Override public int calcSum(int val1, int val2) { return val1+val2; } }
如今就大功告成了,咱們用maven構建成二進制war包而後部署到容器中:
爲了對比咱們這個實驗和上面實驗,我吧2種方式同時放在一個工程下,如圖 /calc的服務發佈過程咱們採用了spring的機制,而上文實驗的/greeting咱們沒有采用spring,而是用原生的JAX-WS來負責發佈,咱們仍是能夠清晰的看到這2個過程是有區別的
最後發佈成功,咱們經過url http://localhost:8080/cxf_jaxws_server/services/calc?wsdl 來訪問對應的web服務:
事實證實,這是正確的,若是細心點,還能夠發現,咱們這裏的方法"calcSum"定義的參數列表( 位於 <xs:complexType name="calcSum">中,參數名字是a和b而不是val1,val2,這代表咱們在服務接口定義中的@WebParam的設定生效了。