java.util.function 接口支持
java.util.function Interfaces Support
从 5.1 版开始,Spring Integration 提供了对 java.util.function 包中接口的直接支持。所有消息端点(服务激活器、转换器、过滤器等)现在可以引用 Function(或 Consumer)bean。消息注解可以直接应用于这些 bean,类似于常规的 MessageHandler 定义。例如,如果你有以下 Function bean 定义:
@Configuration
public class FunctionConfiguration {
    @Bean
    public Function<String, String> functionAsService() {
        return String::toUpperCase;
    }
}
你可以将其作为 XML 配置文件中的简单引用:
<service-activator input-channel="processorViaFunctionChannel" ref="functionAsService"/>
当我们使用 Messaging Annotations 配置流时,代码非常 straightforward:
@Bean
@Transformer(inputChannel = "functionServiceChannel")
public Function<String, String> functionAsService() {
    return String::toUpperCase;
}
当函数返回一个数组、Collection(本质上,任何 Iterable)、Stream 或 Reactor Flux 时,可以在这样的 bean 上使用 @Splitter 来对结果内容进行迭代。
java.util.function.Consumer 接口可以用于 <int:outbound-channel-adapter>,或者与 @ServiceActivator 注解一起使用,以完成流的最后一步:
@Bean
@ServiceActivator(inputChannel = "messageConsumerServiceChannel")
public Consumer<Message<?>> messageConsumerAsService() {
    // Has to be an anonymous class for proper type inference
    return new Consumer<Message<?>>() {
        @Override
        public void accept(Message<?> e) {
            collector().add(e);
        }
    };
}
另外,注意上面代码片段中的注释:如果你希望在你的 Function / Consumer 中处理整个消息,则不能使用 lambda 定义。由于 Java 类型擦除,我们无法确定 apply()/accept() 方法调用的目标类型。
java.util.function.Supplier 接口可以与 @InboundChannelAdapter 注解一起使用,或者作为 <int:inbound-channel-adapter> 中的 ref:
@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000"))
public Supplier<String> pojoSupplier() {
    return () -> "foo";
}
使用 Java DSL 时,我们只需要在端点定义中使用对函数 Bean 的引用。同时,Supplier 接口的实现可以用作常规的 MessageSource 定义:
@Bean
public Function<String, String> toUpperCaseFunction() {
    return String::toUpperCase;
}
@Bean
public Supplier<String> stringSupplier() {
    return () -> "foo";
}
@Bean
public IntegrationFlow supplierFlow() {
    return IntegrationFlow.from(stringSupplier())
                .transform(toUpperCaseFunction())
                .channel("suppliedChannel")
                .get();
}
当与 Spring Cloud Function 框架一起使用时,此功能支持非常有用,在该框架中我们有一个函数目录,并且可以从集成流定义中引用其成员函数。
此外,许多 Spring Integration 通道适配器和模式在 Spring Functions Catalog 项目中作为函数自动配置实现。