`java.util.function` 接口支持

从 5.1 版本开始,Spring Integration 直接支持 `java.util.function` 包中的接口。现在所有消息端点(服务激活器、转换器、过滤器等)都可以引用 `Function`(或 `Consumer`)bean。与常规的 `MessageHandler` 定义类似,消息注解 可以直接应用于这些 bean。例如,如果你有这个 `Function` bean 定义

@Configuration
public class FunctionConfiguration {

    @Bean
    public Function<String, String> functionAsService() {
        return String::toUpperCase;
    }

}

你可以在 XML 配置文件中将其作为简单的引用使用

<service-activator input-channel="processorViaFunctionChannel" ref="functionAsService"/>

当我们使用消息注解配置流时,代码非常直观

@Bean
@Transformer(inputChannel = "functionServiceChannel")
public Function<String, String> functionAsService() {
    return String::toUpperCase;
}

当函数返回数组、`Collection`(本质上是任何 `Iterable`)、`Stream` 或 Reactor `Flux` 时,可以在此类 bean 上使用 `@Splitter` 对结果内容进行迭代。

`java.util.function.Consumer` 接口可用于 ``,或者与 `@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` 注解一起使用,或者在 `` 中用作 `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 项目中以函数自动配置的形式实现。