29.2. 通过 Injection 实例化代理
概述
Apache CXF 使用 Spring Framework 可让您避免使用 JAX-WS API 创建服务代理的问题。它允许您在配置文件中定义客户端端点,然后将代理直接注入到实施代码中。当运行时实例化实现对象时,它还将根据配置实例化外部服务的代理。实现通过引用实例化代理来移交。
由于代理使用配置文件中的信息实例化,所以不需要硬编码 WSDL 位置。它在部署时可以更改。您还可以指定运行时应该为 WSDL 搜索应用程序的类路径。
流程
将外部服务的代理注入服务提供商的实现中:
配置代理
您可以使用应用配置文件中的 jaxws:client
元素配置 JAX-WS 客户端端点。这告知运行时使用指定属性实例化 org.apache.cxf.jaxws.JaxWsClientProxy
对象。此对象是要注入服务供应商的代理。
您至少需要提供以下属性的值:
-
id
- 指定用于识别要注入的客户端的 ID。 -
serviceClass
-Spec 表示代理发出请求的服务的 SEI。
例 29.1 “注入到服务实施的代理的配置” 显示 JAX-WS 客户端端点的配置。
例 29.1. 注入到服务实施的代理的配置
<beans ... xmlns:jaxws="http://cxf.apache.org/jaxws" ... schemaLocation="... http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd ..."> <jaxws:client id="bookClient" serviceClass="org.apache.cxf.demo.BookService" wsdlLocation="classpath:books.wsdl"/> ... </beans>
在 例 29.1 “注入到服务实施的代理的配置” 中 ,wsdlLocation
属性指示运行时从 classpath 加载 WSDL。如果 books.wsdl
位于 classpath 上,则运行时将可以找到它。
有关配置 JAX-WS 客户端的更多信息,请参阅 第 17.2 节 “配置消费者端点”。
为供应商实施编码
您可以使用 @Resource
将配置代理注入服务实施中,作为 例 29.2 “将代理注入服务实现” 所示。
例 29.2. 将代理注入服务实现
package demo.hw.server;
import org.apache.hello_world_soap_http.Greeter;
@javax.jws.WebService(portName = "SoapPort", serviceName = "SOAPService",
targetNamespace = "http://apache.org/hello_world_soap_http",
endpointInterface = "org.apache.hello_world_soap_http.Greeter")
public class StoreImpl implements Store {
@Resource(name="bookClient") private BookService proxy;
}
该注解的 name
属性对应于 JAX-WS 客户端的 id
属性的值。配置的代理会在注解后马上被注入到 BookService
对象中。您可以使用此对象在代理的外部服务上进行调用。