使用@Bean配置时如何到达消息端点

时间:2015-02-08 10:20:05

标签: java spring spring-integration

当我使用spring docs中描述的配置时:

@Configuration
@EnableIntegration
public class MyFlowConfiguration {

    @Bean
    @InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
    public MessageSource<String> consoleSource() {
        return CharacterStreamReadingMessageSource.stdin();
    }

    @Bean
    @Transformer(inputChannel = "inputChannel", outputChannel = "httpChannel")
    public ObjectToMapTransformer toMapTransformer() {
        return new ObjectToMapTransformer();
    }

    @Bean
    @ServiceActivator(inputChannel = "httpChannel")
    public MessageHandler httpHandler() {
        HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://foo/service");
        handler.setExpectedResponseType(String.class);
        handler.setOutputChannelName("outputChannel");
        return handler;
    }

    @Bean
    @ServiceActivator(inputChannel = "outputChannel")
    public LoggingHandler loggingHandler() {
        return new LoggingHandler("info");
    }

}

我可以使用哪种bean定义名称来访问端点? 通过组件使用配置时,在文档中提供了信息:

  

这些注释的处理创建相同的bean(AbstractEndpoints和MessageHandlers(或入站通道适配器的MessageSources - 见下文),与类似的xml组件一样。使用以下模式生成bean名称:[componentName]。[methodName] 。[AbstractapndizedClassShortName]用于AbstractEndpoint,同名,带有一个额外的.handler(.source)后缀用于MessageHandler(MessageSource)bean。MessageHandlers(MessageSources)也有资格被第8.2节“消息历史记录”跟踪。 / p>

但是如何在这里使用它?

1 个答案:

答案 0 :(得分:4)

如果我理解正确,您希望注入其中一些端点到您的服务中。不确定&#34;为什么?&#34;,但可以这样做(例如httpHandler):

@Autowire
@Qualifier("myFlowConfiguration.httpHandler.serviceActivator")
private AbstractEndpoint httpEndpoint;

根据上述规则:

  • myFlowConfiguration - 包含@ServiceActivator方法的类的bean名称。在您的情况下,这是您的@Configuration

  • httpHandler方法名称为@ServiceActivator

  • serviceActivator - @ServiceActivator的资本化名称。

这是清楚的吗?

<强>更新

  

我没有使用xml上下文,只使用基于java的配置,所以答案是@Import

好,谢谢。这是一个答案。任何@Import @Configuration都带有包含完整限定类名的bean名称,包括package(来自ConfigurationClassPostProcessor):

/* using fully qualified class names as default bean names */
 private BeanNameGenerator importBeanNameGenerator = new   AnnotationBeanNameGenerator() {
    @Override
    protected String buildDefaultBeanName(BeanDefinition definition) {
        return definition.getBeanClassName();
    }
};

因此,如果我们要使用那些unnamed类的端点引用,我们必须记住这一点。

当然,为了简化您的生活,您只需向name添加MyFlowConfiguration

@Configuration("myFlowConfiguration")
@EnableIntegration
public class MyFlowConfiguration {