1.導入CXF相關jar包,我是用maven管理工程的,所以直接貼出CXF的maven依賴
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.7.11</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>2.7.11</version>
</dependency>
2.接口
package cn.cjc.cxf;
public interface IMessage {
String getMsg(String username);
}
3.實現類
package cn.cjc.cxf;
public class MessageImpl implements IMessage {
@Override
public String getMsg(String username) {
return username + ",歡迎學習CXF";
}
}
4.發佈服務,CXF發佈服務需要內置jetty服務器的支持,maven依賴中cxf-rt-transports-http-jetty的引入目的就在此
package cn.cjc.cxf;
import org.apache.cxf.frontend.ServerFactoryBean;
public class PubCXF {
public static void main(String[] args) {
// 創建服務
ServerFactoryBean server = new ServerFactoryBean();
// 設置發佈地址
server.setAddress("http://localhost:9999/mymsg");
// 設置接口
server.setServiceClass(IMessage.class);
// 設置實現類
server.setServiceBean(new MessageImpl());
// 發佈服務
server.create();
}
}
5.調用服務,新建一個工程,然後用JDK自帶的wsimport命令或者CXF自帶的wsdl2java命令生成客戶端調用代碼,調用方式有兩種,既可以使用JDK的方式調用,也可以使用CXF的方式調用
a)使用傳統方式調用
package cn.cjc.cxf;
public class Invoke {
public static void main(String[] args) {
IMessagePortType service = new IMessage().getIMessagePort();
System.out.println(service.getMsg("Junki"));
}
}
b)使用CXF方式調用
package cn.cjc.cxf;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
public class Invoke {
public static void main(String[] args) {
// 創建調用客戶端
ClientProxyFactoryBean client = new ClientProxyFactoryBean();
// 設置調用地址
client.setAddress("http://localhost:9999/mymsg");
// 設置調用接口
client.setServiceClass(IMessagePortType.class);
IMessagePortType service = (IMessagePortType) client.create();
System.out.println(service.getMsg("Junki"));
}
}
6.輸出結果
Junki,歡迎學習CXF
7.結束語
可以看到,CXF方式的發佈用的是ServerFactoryBean,調用用的是ClientProxyFactoryBean,這種方式無需在接口和實現類上使用任何註解,缺點就是無法個性化協議文件。其實CXF還有一對發佈調用類,發佈類JaxWsServerFactoryBean和調用類JaxWsProxyFactoryBean,這種方式發佈服務時需要JDK原生WebService註解的支持,好處也很明顯,就是可以個性化協議文件。