首页 文章

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

提问于
浏览
4

当我使用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定义名称来到达 endpoints ?通过组件使用配置时,文档中提供了以下信息:

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

但是如何在这里使用它?

1 回答

  • 4

    如果我理解正确,您希望 inject 某些 endpoints 适用于您的服务 . 不确定"why?",但它可以这样做(例如为 httpHandler ):

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

    根据上述规则:

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

    • httpHandler 方法名称包含 @ServiceActivator

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

    明白了吗 ?

    UPDATE

    我不使用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 类的 endpoints 的引用,我们必须记住这一点 .

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

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

相关问题