对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

从版本 4.0 开始,所有消息传递注释都可以配置为元注释,并且所有用户定义的消息传递注释都可以定义相同的属性以覆盖其默认值。 此外,元注释可以分层配置,如以下示例所示:Spring中文文档

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ServiceActivator(inputChannel = "annInput", outputChannel = "annOutput")
public @interface MyServiceActivator {

    String[] adviceChain = { "annAdvice" };
}

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@MyServiceActivator
public @interface MyServiceActivator1 {

    String inputChannel();

    String outputChannel();
}
...

@MyServiceActivator1(inputChannel = "inputChannel", outputChannel = "outputChannel")
public Object service(Object payload) {
   ...
}

分层配置元注释允许用户为各种属性设置默认值,并启用框架 Java 依赖项与用户注释的隔离,从而避免在用户类中使用它们。 如果框架找到具有具有框架元注释的用户注释的方法,则将其视为直接使用框架注释对方法进行注释。Spring中文文档

方法注释@Bean

从 V4.0 开始,您可以对类中的方法定义配置消息注释,以基于 Bean 而不是方法生成消息端点。 当定义是“现成的”实例(、 等)、实例(、 等)和实例(、 等)和实例(、 等)时,它很有用。 以下示例演示如何将消息传递批注与批注一起使用:@Bean@Configuration@BeanMessageHandlerAggregatingMessageHandlerDefaultMessageSplitterTransformerJsonToObjectTransformerClaimCheckOutTransformerMessageSourceFileReadingMessageSourceRedisStoreMessageSource@BeanSpring中文文档

@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 HttpRequestExecutingMessageHandler httpHandler() {
    HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("https://foo/service");
        handler.setExpectedResponseType(String.class);
        handler.setOutputChannelName("outputChannel");
        return handler;
    }

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

}

版本 5.0 引入了对 annotated with that returns 的支持,它可以生成 POJO 或 . 以下示例演示如何使用该组合:@Bean@InboundChannelAdapterjava.util.function.SupplierMessageSpring中文文档

@Configuration
@EnableIntegration
public class MyFlowConfiguration {

    @Bean
    @InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
    public Supplier<String> pojoSupplier() {
        return () -> "foo";
    }

    @Bean
    @InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
    public Supplier<Message<String>> messageSupplier() {
        return () -> new GenericMessage<>("foo");
    }
}

元注释规则也适用于方法(前面描述的注释可以应用于定义)。@Bean@MyServiceActivator@BeanSpring中文文档

在使用者定义上使用这些注释时,如果 Bean 定义返回适当的(取决于注释类型),则必须在定义本身上设置属性(如 、 、 等)。 仅使用以下批注属性:、 、 、 和 。 所有其他属性都用于处理程序。@BeanMessageHandleroutputChannelrequiresReplyorderMessageHandler@BeanadviceChainautoStartupinputChannelphasepoller
Bean 名称是使用以下算法生成的:
  • () 从 上的方法名称或属性获取自己的标准名称。 这就像方法上没有消息注释一样。MessageHandlerMessageSource@Beanname@Bean@BeanSpring中文文档

  • Bean 名称按以下模式生成:. 例如,前面所示定义的端点获取 Bean 名称 。 与 POJO 方法不同,Bean 方法名称不包含在端点 Bean 名称中。 另请参阅端点 Bean 名称AbstractEndpoint[@Bean name].[decapitalizedAnnotationClassShortName]SourcePollingChannelAdapterconsoleSource()consoleSource.inboundChannelAdapterSpring中文文档

  • 如果不能直接在目标端点中使用(不是 的实例 或 ),则注册相应的 来委托给此 。 此包装器的 Bean 名称按以下模式生成:。@BeanMessageSourceAbstractReplyProducingMessageHandlerAbstractMessageRouterAbstractStandardMessageHandlerFactoryBean@Bean[@Bean name].[decapitalizedAnnotationClassShortName].[handler (or source)]Spring中文文档

在定义上使用这些注释时,必须引用声明的 Bean。 如果应用程序上下文中尚不存在通道,则会自动声明通道。@BeaninputChannel

使用 Java 配置时,您可以使用方法级别的任何(例如)定义来跳过 Bean 注册,以出于某种条件原因。 以下示例演示如何执行此操作:@Conditional@Profile@BeanSpring中文文档

@Bean
@ServiceActivator(inputChannel = "skippedChannel")
@Profile("thing")
public MessageHandler skipped() {
    return System.out::println;
}

与现有的 Spring 容器逻辑一起,消息传递端点 bean(基于注释)也不会注册。@ServiceActivatorSpring中文文档

在使用者定义上使用这些注释时,如果 Bean 定义返回适当的(取决于注释类型),则必须在定义本身上设置属性(如 、 、 等)。 仅使用以下批注属性:、 、 、 和 。 所有其他属性都用于处理程序。@BeanMessageHandleroutputChannelrequiresReplyorderMessageHandler@BeanadviceChainautoStartupinputChannelphasepoller
Bean 名称是使用以下算法生成的:
在定义上使用这些注释时,必须引用声明的 Bean。 如果应用程序上下文中尚不存在通道,则会自动声明通道。@BeaninputChannel

使用 Java 配置时,您可以使用方法级别的任何(例如)定义来跳过 Bean 注册,以出于某种条件原因。 以下示例演示如何执行此操作:@Conditional@Profile@BeanSpring中文文档

@Bean
@ServiceActivator(inputChannel = "skippedChannel")
@Profile("thing")
public MessageHandler skipped() {
    return System.out::println;
}

与现有的 Spring 容器逻辑一起,消息传递端点 bean(基于注释)也不会注册。@ServiceActivatorSpring中文文档

使用注释创建桥梁

从 V4.0 开始,Java 配置提供了 and 方法注释来标记类中的 bean。 这些确实是为了完整性而存在的,它提供了一种方便的机制来声明一个及其消息端点配置:@BridgeFrom@BridgeTo@BeanMessageChannel@ConfigurationBridgeHandlerSpring中文文档

@Bean
public PollableChannel bridgeFromInput() {
    return new QueueChannel();
}

@Bean
@BridgeFrom(value = "bridgeFromInput", poller = @Poller(fixedDelay = "1000"))
public MessageChannel bridgeFromOutput() {
    return new DirectChannel();
}
@Bean
public QueueChannel bridgeToOutput() {
    return new QueueChannel();
}

@Bean
@BridgeTo("bridgeToOutput")
public MessageChannel bridgeToInput() {
    return new DirectChannel();
}

您也可以将这些注释用作元注释。Spring中文文档

建议带注释的端点