猿问

我可以使用lamba experssion通过CDI的策略模式动态获取ejb吗?

我知道我可以将所有与接口匹配的 bean 作为实例注入,然后以编程方式在它们之间进行选择:


@Inject @Any Instance<PaymentProcessor> paymentProcessorSource;

这意味着我必须将选择逻辑放入客户端。


作为替代方案,我可以使用带有 lambda 表达式的词法范围来缓存 ejb 的值吗?在这种情况下,容器是否能够正确管理 ejb 的生命周期,还是要避免这种做法?


例如,将 PaymentProcessorImpl1 e PaymentProcessorImpl2 作为 PaymentProcessor 的两个策略,如下所示:


public class PaymentProcessorProducer {


@Inject

private PaymentProcessorImpl1 paymentProcessorImpl1;


@Inject

private PaymentProcessorImpl2 paymentProcessorImpl2;


@Produces

private Function<String, PaymentProcessor> produce() {


    return (strategyValue) -> {


        if ("strategy1".equals(strategyValue)) {


            return paymentProcessorImpl1;


        } else if ("strategy2".equals(strategyValue)) {


            return paymentProcessorImpl2;


        } else {

            throw new IllegalStateException("Tipo non gestito: " 

                    + strategyValue);

        }


    };


}

}


然后进入客户端进行类似的操作:


@Inject

Function<String, PaymentProcessor> paymentProcessor;

...


paymentProcessor.apply("strategy1")


守候你守候我
浏览 99回答 1
1回答

不负相思意

作为替代方案,我可以使用带有 lambda 表达式的词法范围来缓存 ejb 的值吗?理论上,你可以这样做。它是否有效很容易我们自己尝试。在这种情况下,容器是否能够正确管理 ejb 的生命周期,还是要避免这种做法?这里的 EJB 究竟是什么?的实施PaymentProcessor?请注意,EJB bean 与 CDI bean 不同。由于在 CDI 容器中不控制 EJB bean 的生命周期,它“仅提供一个包装器供您像使用 CDI bean 一样使用它们”。话虽如此,生命周期仍然相同 - 在您的情况下,生产者正在创建@Dependentbean,这意味着每次注入时Function<String, PaymentProcessor>,生产者都会被调用。造成某些问题的是,您对在任何给定时间处于活动状态的两个或多个上下文创建假设。当您决定实际使用apply()该功能时,您的实现存在的范围可能处于活动状态,也可能未处于活动状态。如果他们都是ApplicationScoped例如,你应该没问题。但是,如果它们是SessionScoped并且您碰巧在应用函数之前超时/无效会话,那么您将进入一个非常奇怪的状态。这可能就是为什么我宁愿避免这种方法并使用限定符的原因。或者,您可以引入一个新的 bean,该 bean 中包含两种策略,并具有一个带有参数的方法,该参数决定使用哪种策略。
随时随地看视频慕课网APP

相关分类

Java
我要回答