跳到主要内容
版本:7.0.2

java.util.function 接口支持

DeepSeek V3 中英对照 java.util.function Interfaces Support 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"/>

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

@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集成通道适配器和模式在Spring Functions Catalog项目中以函数自动配置的形式实现。