`
jnn
  • 浏览: 286479 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我眼中的CXF之Bus

    博客分类:
  • ESB
阅读更多
CXF在设计之初就提供了对多种的Binding,Transport可插拔的配置,你只需要在你的Class Path中添加相关的Binding,Transport jars,CXF的Core就会自动加载这些模块,并调用相关接口创建对应的Binding和Transport。

想知道CXF是如何实现Plugable的灵活配置吗?想知道你如何获取你想要的各种CXF内部对象吗?想知道这些内部对象是如何注册和相互查找的吗?

在这里我们可以研究一下CXF Bus,看看Bus是如何帮助CXF内部扩展模块隔离其与Core模块之间的依赖关系的。 

 



说到Bus,它有很多的含义。Bus是我们每天乘坐的公车;也是现在炒得很火得概念ESB中的总线。在CXF中,我觉得Bus更像是一个全局配置仓库,你可以向Bus中存放任何你想存放的扩展对象,你也可以从Bus中获取你想要的扩展对象,这个Bus将CXF中的各扩展模块有机地组合在一起了。

我们现在从相关的代码中一窥究竟。

首先是Bus的接口

这里我们使用了Java5中的泛型,这样让我们的{get|set}Extension 接口简单明晰。
当然这样的接口也不是一开始就设计出来的。要知道在CXF之前的ObjectWeb Celtix版本中Bus的概念虽然没有怎么变,但是那时的接口很复杂,基本上你如果想要添加一个内部扩展对象,就得写上好几行得代码。

这里也许有人会问,Bus为什么要继承 InterceptorProvider呢?这和CXF架构中另一个有意思的部分Interceptor有关,大家可以参看我后面的文章。

而 run和shutdown 两个方法是从 CORBA 中的Bus延续过来的。
最后说一下 getId,这是由于一个JVM中可以存在多个Bus,我们可以通过Bus ID 来区分这些不同的Bus。


这里有几个和Bus创建相关的类

BusFactory
定义了创建Bus的基本方法,它是一个抽象类。这里需要注意的{get|set}DefaultBus这两个方法。了解JAXWS API的朋友可能会有这样的疑问,就是JAXWS API中没有Bus这一概念,如果CXF要实现JAXWS API
接口怎么引入Bus这一对象呢?CXF在实现JAXWS API过程中,通过调用BusFactory.getDefaultBus()来设置内部模块使用的Bus。getDefaultBus会检测静态变量defaultBus赋值情况来决定是否要创建新的Bus。 在这我们就引出了在CXF中如果要使用JAXWS API来创建服务的话,我们可以预先配置好Bus,然后通过调用BusFactory.setDefaultBus(),来设置CXF 在实现JAWS API中使用的Bus。

具体的例子大家可以参看AbstractJaxWsTest中的setUpBus()。在这里我们没有使用到HTTPTransport来进行UnitTest,而是使用一个简单LocalTransport来测试Client Server之间的通讯,其中奥妙大家可以慢慢体会。


CXFBusImpl
是Bus接口的具体实现。这里大家可以看看如何实现{get|set}Extension。


ExtensionManagerBus
是Bus接口的另一个实现。这个Bus通过读取Class Path 中的META-INF/bus-extensions.xml文件来获取扩展模块的信息。
在ExtensionManagerBus中的初始化代码中,你可以发现CXF core中所必须的Managers(Bus也算是一个Manager集中营)。其中有负责获取资源管理的ResourceManager,负责扩展模块管理的ExtensionManger,负责Bus生命周期管理的BusLifeCycleManager, 负责初始化Server端Transport的DestionationFactoryManager, 复杂初始化Client端Transport的ConduitInitiatorManager, 负责初始化Binding的BindingFactoryManager。

这里是SoapBinding bus-extension.xml的例子。


CXFBusFactory
继承了BusFactory,并通过ExtensionManagerBus来负责加载CXF的扩展模块。


SpringBusFactory
通过SpringApplicationContext来加载CXF扩展模块。SpringBusFactory是缺省的BusFactory。这里需要说明的是SpringBusFactory需要配合Spring来使用,如果Class Path中没有包含Spring jars,那CXF Core会使用CXFBusFactory来加载扩展模块。随着Spring的大量普及,相信大家会大量使用SpringBusFactory来创建Bus。
在SpringBusFactory中,初始化的Bus实例是CXFBusImpl。但是如果你搜索一下SpringBusFactory以及CXFBusImpl的代码,是不会发现类似与ExtensionManagerBus那样的初始化代码的。 这是为什么呢?

当当当, 这是就是Spring的强大Wire功能,相关的Manager初始化代码转变成为了CXF.xml。有意思吧!

分享到:
评论

相关推荐

    cxf最少依赖jar包

    【CXF最少依赖JAR包】是针对Apache CXF框架的一种精简打包方式,旨在减少项目中的依赖体积,提高项目的加载速度和管理效率。Apache CXF是一个开源的、基于Java的Web服务框架,它允许开发者创建和消费各种类型的Web...

    WebServiceConfig java springboot利用Apache CXF创建webserice接口配置类

    Apache CXF 核心架构是以BUS为核心,整合其他组件。 * Bus是CXF的主干, 为共享资源提供一个可配置的场所,作用类似于Spring的ApplicationContext,这些共享资源包括 * WSDl管理器、绑定工厂等。通过对BUS进行扩展...

    cxf3.2.0 webservice 最少jar包

    1. **Bus**:CXF的核心,负责管理服务、消息处理器、协议绑定和其他组件。它是整个框架的运行时环境。 2. **WS-* Implementations**:CXF支持各种Web服务标准,如SOAP、WSDL、WS-Security等。这些实现需要对应的JAR...

    apache-cxf-2.7.5所有jar都在

    Apache CXF是一个开源的Java框架,它主要用于构建和开发服务导向架构(SOA)和Web服务。这个"apache-cxf-2.7.5"压缩包包含的是CXF的特定版本2.7.5的所有相关JAR文件,这些文件是运行和开发CXF应用程序所必需的。 ...

    CXF soap例子源码

    CXF(CXF: Composite eXtensible Framework)是一个开源的Java框架,它主要用于构建和开发Web服务。SOAP(Simple Object Access Protocol)是用于交换结构化信息的协议,常用于Web服务通信。在这个"CXF soap例子源码...

    cxf和springnvc整合

    <bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus"> <bean id="busFactory" class="org.apache.cxf.bus.spring.SpringBusFactory"/> ``` 4. **使用 Spring 注解**:通过在服务类上使用 @...

    CXF与Spring 2.5整合

    5. **CXF的Bus对象**:CXF的Bus对象是整个框架的核心,它管理着所有的组件和服务。在Spring中,我们可以通过`<cxf:bus>`标签来配置Bus,并设置全局的属性,如日志级别、异常处理器等。 6. **Spring的...

    webservice cxf 整合spring例子源代码

    2. **CXF Bus**:CXF的Bus是整个框架的核心,它可以管理服务的生命周期,处理各种协议和消息格式。在Spring中,可以通过`<cxf:bus>`标签来创建和配置Bus,将它注入到其他需要使用CXF功能的bean中。 3. **服务接口与...

    Cxf例子Cxf例子我自己写的

    【标题】:“Cxf例子Cxf例子我自己写的” 在IT领域,Apache CXF是一个非常流行的开源框架,用于构建和开发Web服务。CXF允许开发者利用Java编程语言来创建和使用Web服务,支持SOAP、RESTful等多种通信模式。本示例是...

    cxf所需jar包(内含配置文件)

    7. **Bus配置**:CXF的Bus是其核心组件,负责管理所有组件和服务。可以在这里配置全局的行为,比如错误处理策略。 "压缩包子文件的文件名称列表"中的spring-cxf.xml文件,正是这样一个配置文件,它包含了上述配置,...

    cxf 3.1.1 jar包

    CXF(CXF: The Apache CXF project is an open source services framework)是一个开源的Java服务框架,它允许开发者创建和消费各种Web服务。CXF的名字来源于"Code first"和"XML first",代表着它支持从Java代码或者...

    apache-cxf-2.7.7以及cxf客户端所需要的jar包

    1. **CXF Bus**:这是CXF框架的基础,负责管理服务、端点和绑定配置,以及消息处理链。 2. **Data Binding**:CXF支持多种数据绑定机制,如JAXB(Java Architecture for XML Binding)用于将XML与Java对象相互转换,...

    CXF实现WebService详解实例

    CXF是开发WebService的首选工具之一,因为它提供了一种直观的方式将Java类映射为Web服务接口,反之亦然。通过CXF,开发者可以轻松地创建基于JAX-WS(Java API for XML Web Services)的SOAP服务,或者使用JAX-RS...

    Cxf转换器示例

    【Cxf转换器示例】是一个关于Web服务技术的实践项目,主要聚焦于Apache CXF框架中的转换器(Converter)功能。Apache CXF是一个开源的Java框架,它用于构建和开发服务导向架构(SOA)和RESTful应用程序。CXF不仅支持...

    我的cxf与ws-security

    【标题】"我的cxf与ws-security"涉及的是在Java Web服务开发中使用Apache CXF框架集成WS-Security(Web Service Security)的安全机制。Apache CXF是一个开源的、功能丰富的Web服务框架,它允许开发者创建和消费各种...

    apache-cxf-3.2.4完整版

    - **Bus**:CXF的核心是Bus组件,它管理服务的生命周期,处理消息传输,并提供了插件机制以扩展其功能。 - **Endpoint**:表示Web服务的实例,它定义了服务如何接收和发送消息。 - **DataBinding**:负责将XML...

    CXF整合Spring步骤

    <bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus" /> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> ``` 7. **部署和测试...

    cxf框架包 apache-cxf-3.4.3.tar.gz

    Apache CXF是一个开源的Java框架,它主要用于构建和开发Web服务。这个框架允许开发者通过SOAP、RESTful HTTP、XML以及各种协议来实现服务接口。在本案例中,我们讨论的是"apache-cxf-3.4.3.tar.gz",这是Apache CXF ...

    实战Web Service 之CXF

    实战Web Service 之 CXF 实战Web Service 之 CXF

    web service cxf 2.7.5 与spring 3.0 集成

    2. **创建Spring配置**:在Spring的XML配置文件中声明CXF的Bus实例,然后配置服务端点和服务实现。例如: ```xml <cxf:bus> <cxf:properties> <entry key="org.apache.cxf.logging.FaultListener" value-ref=...

Global site tag (gtag.js) - Google Analytics