从版本 4.0 开始,所有消息传递注释都可以配置为元注释,并且所有用户定义的消息传递注释都可以定义相同的属性来覆盖其默认值。 此外,可以按层次结构配置元注释,如下例所示:spring-doc.cn

@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-doc.cn

方法上的注释@Bean

从版本 4.0 开始,您可以在类中的方法定义上配置消息传递注释,以基于 Bean 而不是方法生成消息端点。 当定义是“开箱即用”实例(、 、 和其他实例)、实例( 、 和其他实例)和实例( 、 和其他实例)时,它非常有用。 以下示例显示如何将消息收发注释与注释一起使用:@Bean@Configuration@BeanMessageHandlerAggregatingMessageHandlerDefaultMessageSplitterTransformerJsonToObjectTransformerClaimCheckOutTransformerMessageSourceFileReadingMessageSourceRedisStoreMessageSource@Beanspring-doc.cn

@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-doc.cn

@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-doc.cn

在消费者定义上使用这些注释时,如果 Bean 定义返回适当的(取决于注释类型),则必须在定义本身上设置属性(例如、和其他)。 仅使用以下注释属性:、 、 、 和 。 所有其他属性都用于处理程序。@BeanMessageHandleroutputChannelrequiresReplyorderMessageHandler@BeanadviceChainautoStartupinputChannelphasepoller
Bean 名称是使用以下算法生成的:
  • () 从 . 这就像方法上没有消息注释一样。MessageHandlerMessageSource@Beanname@Bean@Beanspring-doc.cn

  • Bean 名称使用以下模式生成: . 例如,前面显示的定义的端点的 bean 名称为 . 与 POJO 方法不同,端点 Bean 名称中不包含 Bean 方法名称。 另请参见端点 Bean 名称AbstractEndpoint[@Bean name].[decapitalizedAnnotationClassShortName]SourcePollingChannelAdapterconsoleSource()consoleSource.inboundChannelAdapterspring-doc.cn

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

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

使用 Java 配置,您可以在方法级别上使用任何(例如)定义来出于某些条件原因跳过 bean 注册。 以下示例显示了如何执行此操作:@Conditional@Profile@Beanspring-doc.cn

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

与现有的 Spring 容器逻辑一起,消息传递端点 Bean(基于 Comments)也没有注册。@ServiceActivatorspring-doc.cn

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

使用 Java 配置,您可以在方法级别上使用任何(例如)定义来出于某些条件原因跳过 bean 注册。 以下示例显示了如何执行此操作:@Conditional@Profile@Beanspring-doc.cn

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

与现有的 Spring 容器逻辑一起,消息传递端点 Bean(基于 Comments)也没有注册。@ServiceActivatorspring-doc.cn

创建带有注释的桥接

从版本 4.0 开始,Java 配置提供了 and 方法注释来标记类中的 bean。 这些确实是为了完整性而存在的,提供了一种方便的机制来声明 a 及其消息端点配置:@BridgeFrom@BridgeTo@BeanMessageChannel@ConfigurationBridgeHandlerspring-doc.cn

@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-doc.cn

建议带注释的终端节点