消息传递元注释
从版本 4.0 开始,所有消息传递注释都可以配置为元注释,并且所有用户定义的消息传递注释都可以定义相同的属性来覆盖其默认值。 此外,可以按层次结构配置元注释,如下例所示:
@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 依赖项隔离到用户注释,从而避免在用户类中使用它们。 如果框架找到具有具有框架元注释的用户注释的方法,则会将其视为该方法直接使用框架注释进行注释。
注释@Bean方法
从版本 4.0 开始,您可以在@Bean方法定义@Configuration类来生成基于 Bean 而不是方法的消息端点。
它在以下情况下很有用@Bean定义是 “开箱即用” 的MessageHandler实例 (AggregatingMessageHandler,DefaultMessageSplitter等)、Transformer实例 (JsonToObjectTransformer,ClaimCheckOutTransformer等)、和MessageSource实例 (FileReadingMessageSource,RedisStoreMessageSource等)。
以下示例演示如何将消息收发注释与@Bean附注:
@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 或Message.
下面的示例演示如何使用该组合:
@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定义)。
| 当您在 consumer 上使用这些注解时 @Bean定义,如果 Bean 定义返回适当的MessageHandler(取决于注解类型),您必须设置属性(例如outputChannel,requiresReply,order等)、在MessageHandler@Bean定义本身。
仅使用以下注释属性:adviceChain,autoStartup,inputChannel,phase和poller.
所有其他属性都用于处理程序。 | 
| Bean 名称是使用以下算法生成的: | 
- 
这 MessageHandler(MessageSource)@Bean从方法名称中获取自己的标准名称,或者name属性@Bean. 这就像@Bean方法。
- 
这 AbstractEndpointbean 名称使用以下模式生成:[@Bean name].[decapitalizedAnnotationClassShortName]. 例如,SourcePollingChannelAdapterendpoint 的consoleSource()前面显示的定义得到一个 bean 名称consoleSource.inboundChannelAdapter. 与 POJO 方法不同,端点 Bean 名称中不包含 Bean 方法名称。 另请参见端点 Bean 名称。
- 
如果 @Bean不能直接在目标终端节点中使用(不是MessageSource,AbstractReplyProducingMessageHandler或AbstractMessageRouter)、相应的AbstractStandardMessageHandlerFactoryBean已注册以委托给此@Bean. 此包装器的 bean 名称是使用以下模式生成的:[@Bean name].[decapitalizedAnnotationClassShortName].[handler (or source)].
| 在 @Bean定义、inputChannel必须引用已声明的 Bean。
如果应用程序上下文中尚不存在 channels,则会自动声明 channel。 | 
| 通过 Java 配置,您可以使用任何 与现有的 Spring 容器逻辑一起,消息传递端点 Bean(基于 | 
创建带有注释的桥接
从版本 4.0 开始,Java 配置提供了@BridgeFrom和@BridgeTo @Bean要标记的方法注释MessageChannel豆子@Configuration类。
这些确实是为了完整性而存在的,提供了一种方便的机制来声明BridgeHandler及其消息终端节点配置:
@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();
}您也可以将这些注释用作元注释。
建议带注释的终端节点
请参阅使用注释通知终端节点。