`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 專案中以函式自動配置的形式實現。