有时,路由逻辑可能很简单,为它编写一个单独的类并将其配置为 bean 似乎有点矫枉过正。 从Spring Integration 2.0开始,我们提供了一种替代方案,允许您使用SpEL来实现以前需要自定义POJO路由器的简单计算。Spring中文文档

有关 Spring 表达式语言的更多信息,请参阅 Spring Framework 参考指南中的相关章节
有关 Spring 表达式语言的更多信息,请参阅 Spring Framework 参考指南中的相关章节

通常,对 SpEL 表达式进行计算,并将其结果映射到通道,如以下示例所示:Spring中文文档

<int:router input-channel="inChannel" expression="payload.paymentType">
    <int:mapping value="CASH" channel="cashPaymentChannel"/>
    <int:mapping value="CREDIT" channel="authorizePaymentChannel"/>
    <int:mapping value="DEBIT" channel="authorizePaymentChannel"/>
</int:router>

以下示例显示了在 Java 中配置的等效路由器:Spring中文文档

@Router(inputChannel = "routingChannel")
@Bean
public ExpressionEvaluatingRouter router() {
    ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter("payload.paymentType");
    router.setChannelMapping("CASH", "cashPaymentChannel");
    router.setChannelMapping("CREDIT", "authorizePaymentChannel");
    router.setChannelMapping("DEBIT", "authorizePaymentChannel");
    return router;
}

以下示例显示了在 Java DSL 中配置的等效路由器:Spring中文文档

@Bean
public IntegrationFlow routerFlow() {
    return IntegrationFlow.from("routingChannel")
        .route("payload.paymentType", r -> r
            .channelMapping("CASH", "cashPaymentChannel")
            .channelMapping("CREDIT", "authorizePaymentChannel")
            .channelMapping("DEBIT", "authorizePaymentChannel"))
        .get();
}

为了进一步简化操作,SpEL 表达式的计算结果可以计算为通道名称,如以下表达式所示:Spring中文文档

<int:router input-channel="inChannel" expression="payload + 'Channel'"/>

在前面的配置中,结果通道由 SpEL 表达式计算,该表达式将 的值与文本 'Channel' 连接起来。payloadStringSpring中文文档

SpEL配置路由器的另一个优点是表达式可以返回一个,有效地使每个A接收者列表路由器。 每当表达式返回多个通道值时,消息都会转发到每个通道。 下面的示例演示了这样的表达式:Collection<router>Spring中文文档

<int:router input-channel="inChannel" expression="headers.channels"/>

在上述配置中,如果消息包含名称为“channels”的标头,并且该标头的值为通道名称,则消息将发送到列表中的每个通道。 当您需要选择多个通道时,您可能还会发现集合投影和集合选择表达式非常有用。 有关详细信息,请参阅:ListSpring中文文档