cxf整合spring,精簡版

2021-09-01 10:02:27 字數 3539 閱讀 9214

上次總結了spring整合cxf的方法,不過有些地方說得不清楚:

上次把web service客戶端介面,用註解注入到別的bean裡,結果報錯了。當時一直沒有找到原因,現在回想,有可能是當時**環境的問題,spring和cxf的配置都有些混亂

最近在搭建乙個培訓的框架,開發環境很純淨,上次那個問題沒有再發生了。因此也簡化了一下,重新總結一下。不過由於上次那個問題,最終也沒找到原因,所以不敢保證這次也一定是正確的,只能說,在以下環境是ok的:

tomcat7.0.29

spring-framework-3.1.0

cxf-2.6.1

neethi-3.0.2

wsdl4j-1.6.2

xmlschema-core-2.0.2

首先是web.xml

cxfservlet

org.apache.cxf.transport.servlet.cxfservlet

1 這裡因為沒有整合spring-mvc,所以web.xml就很簡單

然後是spring的配置檔案

<?xml version="1.0" encoding="utf-8"?>

這裡是簡化後的配置,僅包含必要的配置資訊

這裡分別配置了乙個web service的客戶端,和乙個web service的服務端

這裡要注意的是,jaxws:endpoint裡的implementor,不能直接寫***.***.classname,因為這裡的實現類,自身也是乙個bean,如果直接寫的話,裡面的依賴關係就沒有了,要用#beanname的語法

jaxws:client裡的serviceclass,寫的是介面的完整類名,address是目標endpoint的位址

接下來是要發布的webservice介面**

@webservice

public inte***ce helloworldwebservice

就是乙個普通的介面宣告,只是要加上@webservice註解

最後是webservice實現類**

@controller

public class helloworldwebserviceimpl implements helloworldwebservice

}

實現類更加簡單,只需要繼承剛才宣告的介面就可以了,不需要額外的註解

這裡用到了@controller和@autowired註解,只是為了演示把實現類自身宣告為spring bean,並把下層的業務bean,和webservice client的bean注入進來

啟動tomcat後,webservice就發布成功了,並且itestservice和idemosupport都是注入成功的

[img]

用soapui呼叫一下,控制台打出如下資訊:

dosomething()

wed aug 15 17:12:50 cst 2012

說明此時業務bean和client bean都是注入成功的。上次死活就不行,估計確實是**環境的原因,現在也沒法還原現場了,成為懸案

執行之後,控制台打出bean資訊:

cxforg.apache.cxf.bus.spring.buswiringbeanfactorypostprocessor

org.apache.cxf.bus.spring.jsr250beanpostprocessor

org.apache.cxf.bus.spring.bu***tensionpostprocessor

testservice

helloworldwebserviceimpl

org.springframework.context.annotation.internalconfigurationannotationprocessor

org.springframework.context.annotation.internalautowiredannotationprocessor

org.springframework.context.annotation.internalrequiredannotationprocessor

org.springframework.context.annotation.internalcommonannotationprocessor

org.springframework.context.annotation.internalpersistenceannotationprocessor

propertyconfigurer

datasource

sessionfactory

helloworld

client.proxyfactory

client

org.springframework.context.annotation.configurationclasspostprocessor$importawarebeanpostprocessor#0

前4個都是cxf.xml裡註冊的

testservice是業務bean

helloworldwebserviceimpl是webservice實現類的bean,注意這個只是乙個普通的spring bean,還沒有被發布為web service,下面的helloworld才是

helloworld,就是那行生成的bean,實際的web service

client,是那行生成的bean。這個類是cxf生成的**類,但是實現了web service服務端介面。**不可見,但是可以像普通的spring bean一樣注入到別的bean裡

object clientproxyfactory = context.getbean("client");

system.out

.println("client: " + clientproxyfactory.getclass().getname());

system.out.println(clientproxyfactory instanceof idemosupport);

執行以後,輸出是:

client: $proxy42

true

如果跟進去除錯,可以看得更清楚一點:

[img]

client.proxyfactory應該是cxf生成的乙個內部bean,bean definition是abstract的,如果嘗試用getbean()方法獲取,會丟擲異常

object clientproxyfactory = context.getbean("client.proxyfactory");

org.springframework.beans.factory.beanisabstractexception: error creating bean with name 'client.proxyfactory': bean definition is abstract

Spring啟動過程 精簡版

專案開放中,spring框架的啟動過程是什麼樣的呢?以下就簡單的概述一下 首先了解一些基本的概念,1.beanfactory spring構建過程中的核心介面,頂級介面,主要提供根據beanname獲取bean例項 getbean string beanname 方法,注意 這個獲取bean例項存在...

cxf 整合 spring 入門

定義服務介面以及實現 web.xml 當啟動tomcat的時候 會載入 spring cxf server.xml 並且建立指定的service並發布,web service 服務的 url 由endpoint中指定的 address myservice 即 建立客戶端 helloworld hel...

AsyncTask原理精簡版

asynctask有三個主要的方法 onpreexecute doinbackground string.params onpostexecute 建立asynctask物件需要重寫乙個類繼承asynctask,因為asynctask本身是抽象類 new asynctask execute para...