对于最新稳定版本,请使用 Spring Integration 7.0.0spring-doc.cadn.net.cn

消息元注释

从4.0版本开始,所有消息注释都可以配置为元注释,所有用户自定义消息注释都可以定义相同的属性来覆盖其默认值。此外,元注释还可以层次配置,如下示例所示:spring-doc.cadn.net.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.cadn.net.cn

注释@Bean方法

从4.0版本开始,你可以在@Bean方法定义@Configuration类,用于基于豆子而非方法生成消息端点。它在@Bean定义是“跳出框架”的消息处理器实例(聚合消息处理器,默认消息分裂器,以及其他),转换器实例(JsonToObjectTransformer,ClaimCheckOutTransformer,以及其他),消息源实例(文件阅读消息源,RedisStoreMessageSource, 以及其他)。以下示例展示了如何使用消息注释@Bean附注:spring-doc.cadn.net.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 版本引入了对@Bean注释为@InboundChannelAdapter回归java.util.function.Supplier,可以产生POJO或消息. 以下示例展示了如何使用该组合:spring-doc.cadn.net.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前面描述的注释可以应用于@Bean定义)。spring-doc.cadn.net.cn

当你在消费者身上使用这些注释时@Bean如果豆子定义返回了适当的消息处理器(根据注释类型),你必须设置属性(例如输出通道,需要回复,次序以及其他方面)。消息处理器 @Bean定义本身。仅使用以下注释属性:建议链,自动启动,输入通道,阶段轮询者. 其他属性都是给作者用的。
Beans名称通过以下算法生成:
  • 消息处理器 (消息源) @Bean其标准名称来自方法名称或名称属性@Bean. 这就像没有消息注释一样@Bean方法。spring-doc.cadn.net.cn

  • 摘要终点豆名的生成模式如下:[@Bean名]。[去大写的AnnotationClassShortName]. 例如,SourcePollingChannelAdapter端点控制台来源()前面所示的定义 得到豆子名consoleSource.inboundChannelAdapter. 与 POJO 方法不同,豆子方法名称不包含在端点豆名中。另见端点豆名称spring-doc.cadn.net.cn

  • 如果@Bean不能直接在目标端点中使用(非消息源,摘要回复制作消息处理器摘要消息路由器),分别摘要标准消息处理器工厂豆注册以委托此事@Bean. 这种包裹物的豆子名称由以下模式生成:[@Bean名]。[去大写AnnotationClassShortName]。[handler(或源)].spring-doc.cadn.net.cn

在使用这些注释时@Bean定义,输入通道必须引用已声明的 bean。如果应用上下文中尚未出现,通道会自动声明。

在 Java 配置中,你可以使用任何一个配置@Conditional(例如,@Profile) 定义@Bean方法层级因某些条件原因跳过豆注册。以下示例展示了如何实现:spring-doc.cadn.net.cn

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

结合现有的 Spring 容器逻辑,消息端点 bean(基于@ServiceActivator注释),也未被注册。spring-doc.cadn.net.cn

创建带有注释的桥梁

从4.0版本开始,Java配置提供了@BridgeFrom@BridgeTo @Bean方法注释以标记消息频道豆子@Configuration类。 这些功能实际上是为了完整性,提供了一种方便的机制来声明桥接处理者以及其消息端点配置:spring-doc.cadn.net.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.cadn.net.cn

注释端点的建议