DSL 與端點配置

所有 `IntegrationFlowBuilder` 的 EIP 方法都有一個變體,該變體應用 lambda 引數為 `AbstractEndpoint` 例項提供選項:`SmartLifecycle`、`PollerMetadata`、`request-handler-advice-chain` 等等。它們每個都有通用引數,因此它允許您在上下文中配置端點甚至其 `MessageHandler`,如下例所示

@Bean
public IntegrationFlow flow2() {
    return IntegrationFlow.from(this.inputChannel)
                .transformWith(t -> t
                              .transformer(new PayloadSerializingTransformer())
                              .autoStartup(false)
                              .id("payloadSerializingTransformer"))
                .transformWith(t -> t
                              .transformer((Integer p) -> p * 2)
                              .advice(expressionAdvice()))
                .get();
}

此外,`EndpointSpec` 提供了一個 `id()` 方法,允許您使用給定的 Bean 名稱註冊一個端點 Bean,而不是生成的名稱。

如果 `MessageHandler` 被引用為一個 Bean,那麼如果 DSL 定義中存在 `.advice()` 方法,任何現有的 `adviceChain` 配置都將被覆蓋。

@Bean
public TcpOutboundGateway tcpOut() {
    TcpOutboundGateway gateway = new TcpOutboundGateway();
    gateway.setConnectionFactory(cf());
    gateway.setAdviceChain(Collections.singletonList(fooAdvice()));
    return gateway;
}

@Bean
public IntegrationFlow clientTcpFlow() {
    return f -> f
        .handle(tcpOut(), e -> e.advice(testAdvice()))
        .transform(Transformers.objectToString());
}

它們不會合並,在這種情況下僅使用 `testAdvice()` Bean。