29.2. 通过注入实例化代理
概述
Apache CXF 使用 Spring Framework 可让您避免使用 JAX-WS API 创建服务代理。它允许您在配置文件中定义客户端端点,然后将代理直接注入实施代码。当运行时实例化 implementation 对象时,它还会根据配置实例化外部服务的代理。该实施通过引用实例化代理来分发。
由于代理使用配置文件中的信息实例化,因此 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
属性指示运行时从类路径加载 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
对象中。您可以使用此对象在代理的外部服务上进行调用。