当您有多个实现时,有没有办法确定在运行时使用哪个EJB实现?我不能使用注释或部署描述符,因为直到运行时才知道逻辑。
假设我有以下EJB实现:
MyEJBFoo
MyEJBBar
,都实现了MyEJB
业务接口。如果要使用的实现直到运行时才知道该EJB的依赖注入,让我们说一个名为DEV_MODE
= TRUE / FALSE的标志存储在资源包中,如果它是真的,它必须使用{{1如果它是假的,那么MyEJBFoo
。
我在考虑工厂模式,但我不确定这是否是最佳方式。
答案 0 :(得分:2)
使用委派MyEJB
:
public class MyEJBDelegatingImpl implements MyEJB {
// Inject: can't remember exact annotation
private MyEJB myEJBFoo;
// Inject: can't remember exact annotation
private MyEJB myEJBBar;
private getDelegate() {
if (condition for myEJBFoo) {
return myEJBFoo;
} else {
return myEJBBar;
}
}
...
//Now implement MyEJB delegating to getDelegate()
}
唯一需要注意的是,无论环境条件如何,两个实例(myEJBFoo和myEJBBar)都必须是可实例化的,因为您在委派MyEJB
中无条件地注入这两个实例。
答案 1 :(得分:2)
在为两个实现使用一个接口时,请注意相应地解析注入点(描述为here)。
此外,如果您有可能使用CDI,请查看producer methods,因为他们可以做到这一点。