CXF BUS 使用

本文版权归Stephen Wang所有。可以任意复制、转载,但请注明出处。

    CXF中的BUS就是一个骨架,管理着CXF的扩展插件以及提供拦截器。注意,BUS提供的拦截器与具体的服务endpoint提供的拦截器是有一点区别的。BUS提供的拦截器将作用于所有的收到、发送以及错误(Fault)的消息。默认情况下,BUS没有为我们提供任何拦截器。

    一,BUS提供全局拦截器功能

    下面来举例子说明,如何为所有的endpoint提供日志拦截:

    <bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    <cxf:bus>
        <cxf:outInterceptors>
            <ref bean="logOutbound"/>
        </cxf:outInterceptors>
    </cxf:bus> 

    上面提供了拦截所有出去的消息日志。可以提供的拦截点包括:    

Name Value
inInterceptors 拦截接收到的消息
inFaultInterceptors 拦截接收错误消息
outInterceptors 拦截发出去的消息
outFaultInterceptors l拦截发出去的错误消息

    这个拦截器与各endpoint的拦截器一样,需要实现Interceptor接口。这些拦截器都是作用于全局的。

二、CXF bus提供了一些feature。通过配置即可激活这些功能。

    举例来说,bus有一个logging的feature。能够拦截所有的进入、发出以及错误的消息。呵呵,不需要配置拦截器咯,激活这个功能即可。实现这个功能的是org.apache.cxf.feature.LoggingFeature类。下面举例说明如何激活这个feature:

    <cxf:bus>
        <cxf:features>
            <cxf:logging/>
        </cxf:features>
    </cxf:bus> 

    比较简单,这样就可以输出日志了。它还提供了其他的一些feature,可以参考:

    http://cxf.apache.org/docs/featureslist.html。用到的话可以查询下了。具体用法参考上面的例子即可。大概提供的feature涵盖了故障转移、加解密消息、压缩解压消息,ws-address支持,ws-policy支持以及轻量级消息转发。

     当然,你也可以扩展自己的featrue,只需要继承AbstractFeature并实现initializeProvider 这个方法即可。这个方法提供了修改InterceptorProvider  的机会。查看InterceptorProvider 接口即知道,这个接口提供了访问上面提到的四个拦截的入口。

public interface InterceptorProvider {
    
    List<Interceptor> getInInterceptors();
    
    List<Interceptor> getOutInterceptors();

    List<Interceptor> getInFaultInterceptors();

    List<Interceptor> getOutFaultInterceptors();
    
}

三、CXF bus还管理了扩展插件extension

    如果把 CXF BUS翻译为公交车(或者叫比喻吧),感觉还是比较能表明它所代表的含义的。bus是一辆公交车,那么售票员就相当于拦截器了。而公交公司就像是一个feature了,它管理所有的售票员和bus的其它东西。公交车上的座位就是这里的extension了。它提供了一些位置供这些扩展对象使用。当公交车到达一个站时,从这些座位上取出对象,然后进行处理(这些座位上的貌似不能下车,呵呵)。当然,也有一些reserved的座位,供cxf自己使用,比如 DestinationFactoryManager 可以在运行时从extension中获取,

Bus bus = BusFactory.getThreadDefaultBus();
DestinationFactoryManagerImpl dfm = bus.getExtension(DestinationFactoryManagerImpl.class);

类似的还有BindingFactoryManager.ConduitInitiatorManager等。这些是专用位置哦。一般,这些可用对象可以从classpath以下路径看到:

META-INF/cxf/cxf.xml (e.g., in cxf-rt-core only)  
META-INF/cxf/cxf-extension.xml (e.g. in cxf-rt-bindings-soap)  
META-INF/cxf/cxf-property-editors.xml (e.g. in cxf-rt-transports-http)  

例如:可以从cxf-rt-core-****.jar包中的META-INF/cxf/cxf-extension.xml 文件中,看到以下已经注入的对象org.apache.cxf.wsdl11.WSDLManagerImpl,org.apache.cxf.phase.PhaseManagerImpl等等。

当然,你可以自定义extension。并且在自己的jar包的META-INF/cxf/cxf-extension.xml这个路径中,配置你自己的bean。这个bean是一个POJO的bean,不需要实现任何依赖于cxf的接口。当然,你也可以扩展cxf已有的功能。配置完成后,你可以在运行时bus.getExtension(your.class);来获取你的扩展啦。

我觉得这个设计虽然灵活,但设计的过于灵活啦,只是简单的把这些可用的bean放入一个map里面,以供查询使用。违背了面向对象的设计原则。我相信很多读者到这都会感觉,这个扩展可以扩展的东西其实是无限的,但刚开始却会让你无从下手。

 本文版权归Stephen Wang所有。可以任意复制、转载,但请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值