为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守候你守候我 2021-10-13 10:17:57
我知道我可以将所有与接口匹配的 bean 作为实例注入,然后以编程方式在它们之间进行选择:@Inject @Any Instance<PaymentProcessor> paymentProcessorSource;这意味着我必须将选择逻辑放入客户端。作为替代方案,我可以使用带有 lambda 表达式的词法范围来缓存 ejb 的值吗?在这种情况下,容器是否能够正确管理 ejb 的生命周期,还是要避免这种做法?例如,将 PaymentProcessorImpl1 e PaymentProcessorImpl2 作为 PaymentProcessor 的两个策略,如下所示:public class PaymentProcessorProducer {@Injectprivate PaymentProcessorImpl1 paymentProcessorImpl1;@Injectprivate PaymentProcessorImpl2 paymentProcessorImpl2;@Producesprivate 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);        }    };}}然后进入客户端进行类似的操作:@InjectFunction<String, PaymentProcessor> paymentProcessor;...paymentProcessor.apply("strategy1")
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

作为替代方案,我可以使用带有 lambda 表达式的词法范围来缓存 ejb 的值吗?

理论上,你可以这样做。它是否有效很容易我们自己尝试。

在这种情况下,容器是否能够正确管理 ejb 的生命周期,还是要避免这种做法?

这里的 EJB 究竟是什么?的实施PaymentProcessor?请注意,EJB bean 与 CDI bean 不同。由于在 CDI 容器中不控制 EJB bean 的生命周期,它“仅提供一个包装器供您像使用 CDI bean 一样使用它们”。

话虽如此,生命周期仍然相同 - 在您的情况下,生产者正在创建@Dependentbean,这意味着每次注入时Function<String, PaymentProcessor>,生产者都会被调用。

造成某些问题的是,您对在任何给定时间处于活动状态的两个或多个上下文创建假设。当您决定实际使用apply()该功能时,您的实现存在的范围可能处于活动状态,也可能未处于活动状态。如果他们都是ApplicationScoped例如,你应该没问题。但是,如果它们是SessionScoped并且您碰巧在应用函数之前超时/无效会话,那么您将进入一个非常奇怪的状态。

这可能就是为什么我宁愿避免这种方法并使用限定符的原因。或者,您可以引入一个新的 bean,该 bean 中包含两种策略,并具有一个带有参数的方法,该参数决定使用哪种策略。


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信