我知道我可以将所有与接口匹配的 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 一样使用它们”。
话虽如此,生命周期仍然相同 - 在您的情况下,生产者正在创建@Dependent
bean,这意味着每次注入时Function<String, PaymentProcessor>
,生产者都会被调用。
造成某些问题的是,您对在任何给定时间处于活动状态的两个或多个上下文创建假设。当您决定实际使用apply()
该功能时,您的实现存在的范围可能处于活动状态,也可能未处于活动状态。如果他们都是ApplicationScoped
例如,你应该没问题。但是,如果它们是SessionScoped
并且您碰巧在应用函数之前超时/无效会话,那么您将进入一个非常奇怪的状态。
这可能就是为什么我宁愿避免这种方法并使用限定符的原因。或者,您可以引入一个新的 bean,该 bean 中包含两种策略,并具有一个带有参数的方法,该参数决定使用哪种策略。
添加回答
举报
0/150
提交
取消