Camel 4结合Spring使用时,<proxy>标签的替代方案是什么?
Camel 4中Spring XML 标签的替代方案
问题背景
Camel Spring 3的XML配置里曾包含<proxy>标签,用来生成对应接口的代理Bean,将方法调用转发到指定的Camel端点,示例配置如下:
<proxy id="myAbcService" serviceInterface="com.test.MyAbcService" serviceUrl="direct:abcService"/>
升级到Camel 4后,Spring XML的Camel schema已经移除了该标签,要是直接注释掉这个标签,会触发NoSuchBeanDefinitionException异常。官方升级文档只提到该功能已移除,但没给出具体的替代方案,文档相关内容翻译如下:
在Spring XML中,
和 已被移除。它们仅在Spring XML中可用,在其他XML DSL(Blueprint和CDI)中不可用。
替代方案
1. 用Spring原生ProxyFactoryBean实现
借助Spring的ProxyFactoryBean结合Camel的BeanInvocationProcessor,手动创建代理并绑定到Camel端点:
<bean id="myAbcService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces" value="com.test.MyAbcService"/> <property name="interceptorNames"> <list> <value>camelBeanInvocationInterceptor</value> </list> </property> </bean> <bean id="camelBeanInvocationInterceptor" class="org.apache.camel.processor.BeanInvocationProcessor"> <constructor-arg value="#{camelContext.getEndpoint('direct:abcService')}"/> </bean>
2. Java配置类创建代理(推荐)
如果项目支持Java配置,用Camel提供的ProxyBuilder可以更简洁地生成代理Bean:
@Configuration public class CamelProxyConfig { @Autowired private CamelContext camelContext; @Bean public MyAbcService myAbcService() throws Exception { return new ProxyBuilder(camelContext) .endpoint("direct:abcService") .build(MyAbcService.class); } }
3. 手动配置ProxyFactory实现
也可以直接用Spring的ProxyFactory类来构建代理,灵活性更高:
@Configuration public class CamelProxyConfig { @Autowired private CamelContext camelContext; @Bean public MyAbcService myAbcService() throws Exception { ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setInterfaces(MyAbcService.class); proxyFactory.addAdvice(new BeanInvocationProcessor(camelContext.getEndpoint("direct:abcService"))); return (MyAbcService) proxyFactory.getProxy(camelContext.getClassLoader()); } }
内容的提问来源于stack exchange,提问作者Kevin Van Ryckegem
相关产品推荐
相关产品推荐

