在前面的文章中给大家简单介绍了CXF是如何和将一个POJO变成一个Web Services的,当中提到一个很重要的一个名词就是Sevices Model,现在我们就简单讨论一下CXF中有关Services Model的内容。
首先大家可以从 CXF的构架 上面获取到Service Model的简要描述。在这里我简单给翻译如下:
Serivce Model负责描述了在CXF所提供的一个服务信息。它由两部分内容组成。一是和WSDL相类似的服务信心,例如 operations, bindings,还有endpoints。 另一部分就是服务自身的信息,这些信息是和CXF runtime相关的,包括ServiceInfo, data-binding 信息,service interceptors,以及服务的一些属性等。
CXF的一个服务信息(service)可以通过Refelection从Java Classes获得,也可以通过WSDL1.1 或者 WSDL2.0获得。一般情况下CXF通过特定的Frontend模块中的ServiceFactory来创建服务信息。ServiceFactory 在创建服务信息的同时也负责进行interceptors,databindings等的配置。
Service Modle中包含了很多Info Class,各模块之间关系如下
ServiceInfo
+-Interface: InterfaceInfo
| +-operations: Collection<operationinfo>
| | +- Input: MessageInfo
| | +- Output: MessageInfo
| | +- Faults: Collection<messageinfo>
+-Bindings: Collection<bindinginfo>
| +-Operations: Collection<bindingoperationinfo>
+-Endpoints: Collection<endpointinfo>
CXF使用了Woden用以从WSDL构建Service Model,大家可以发现Service Model 与 Woden API中对WSDL元素的描述是很类似的。有关Service Model的详细信息大家可以从CXF API中的Java doc以及源代码一窥究竟。
下面我给大家简单介绍几个Service Model在CXF API设计中的应用,希望能对大家使用CXF API有所帮助。
ServerFactoryBean </endpointinfo></bindingoperationinfo></bindinginfo></messageinfo></operationinfo>
在CXF中有几个很相似名词 JaxWsServiceFactoryBean, JaxWsServerFactoryBean,当初我刚接触的时候也困惑了一阵,好在当时正好Dan Diephouse在北京,我就当面问了他一下这个问题,也算是得到一个权威解释了。其实如果大家仔细看过我的上一篇文章和这篇文章,应该对所谓的Server以及Service 的 FactoryBean有一个大概的认识了。
Server 是对服务器端来说,Service是针对服务信息来说的。也就是一个Server必然要包含一个Servie信息。
如果我们使用CXF内部API来创建服务的话,我们只需要通过设置JaxWsServerFactoryBean 就可以发布服务了。如果大家浏览一下具体的代码可以发现 在JaxWsServerFactorBean的构造函数中会创建一个缺省JaxWsServiceFactoryBean. 当然你在构建自己的Server的同时也可以设置自己的ServiceFactoryBean,我的理解是提供这样API目的在于CXF对Spring的支持。你可以在Spring中定义装配符合自己要求的服务,自然需要有读取和设置的这或者那样Bean的方法了。
AbstractServiceFactoryBean
作为ServiceFactoryBean的抽象类这里定义了我们前面提到的服务信息中包含了服务自身的内容,也就是CXF runtime需要的配置信息。主要包含了dataBinding, Interceptors等的信息。
ReflectionServiceFactoryBean
它是simple frontend的ServiceFactoryBean,至于为什么叫做ReflectionServiceFactoryBean要从Simple Frontend支持POJO的服务实现说起。简单来说我们可以通过Reflection API获取到POJO Class的方法,参数以及返回值信息。ReflectionServiceFactoryBean就是在这些信息的基础上,构建Service Model的。当然RefectionServiceFactoryBean 也支持从WSDL创建Service Model。大家在调用ServiceFactoryBean构建Service Modle的时候需要注意一条很重要的INFO日志 "Create service from WSDL: ..." 或者是 "Create sevice from class ..."。 这条日志来表明Service Model是通过WSDL创建还是通过Class信息创建的。
JaxWsServiceFactoryBean
SUN针对Java的Web Service实现先后提出两套API,一个是JaxRPC,另一个JaxWs。 JaxWsServiceFactoryBean继承了ReflectionServiceFactoryBean, 并提供JaxWsAPI的支持。在该类中这里主要是支持JSR181,重载了很多父类的方法,有关createServiceFromWSDL的部分则可重用父类ReflectionServiceFactoryBean.