如果我根据条件只知道在运行时使用哪一个,那么如何注入EJB 3的实现呢?

时间:2012-01-25 23:32:38

标签: java java-ee ejb-3.1

当您有多个实现时,有没有办法确定在运行时使用哪个EJB实现?我不能使用注释或部署描述符,因为直到运行时才知道逻辑。

假设我有以下EJB实现: MyEJBFoo MyEJBBar,都实现了MyEJB业务接口。如果要使用的实现直到运行时才知道该EJB的依赖注入,让我们说一个名为DEV_MODE = TRUE / FALSE的标志存储在资源包中,如果它是真的,它必须使用{{1如果它是假的,那么MyEJBFoo

我在考虑工厂模式,但我不确定这是否是最佳方式。

2 个答案:

答案 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,因为他们可以做到这一点。