【问题标题】:How to inject subclasses of EJB如何注入 EJB 的子类
【发布时间】:2012-09-19 19:29:17
【问题描述】:

我有抽象 EJB 和它的两个子类。在我的托管 bean 中,我希望有一个抽象类型的字段,并根据传递给页面的参数以及任一子类的实例对其进行初始化。我想没有办法使用注入来做到这一点,我应该使用良好的旧 JNDI 查找......或者也许有一种方法可以重新设计它以能够使用注入?

修订版 我想我不能定义 EJB 抽象,但这并没有改变这种情况。即使 AbstractEJB 不是抽象的,我也只想实例化它的子类。

@Stateless
public abstract class AbstractEJB {
    public abstract void method1();
}

@Stateless
public class Implementation1 extends AbstractEJB () {
    public void method1() { ... }
}

@Stateless
public class Implementation2 extends AbstractEJB () {
    public void method1() { ... }
}

@ManagedBean 
public class MyManagedBean {

    @EJB
    AbstractEJB myEJB; //has to be initialized with either Implementation1 or Implementation2 instance
}

【问题讨论】:

    标签: jakarta-ee dependency-injection ejb-3.0


    【解决方案1】:

    这不是 EJB 的预期用途。您不注入实现,而是注入接口。

    想出一个接口(你在 EJB 3.0 中需要它)和一个抽象类(你可以让你的 EJB 继承自一个抽象的非 EJB 类;抽象 EJB 没有意义,因为它们是由容器)。使用各个注解的“name”参数:

    public abstract class Abstract implements MyEJBIntf {
        public abstract void method1();
    }
    
    @Stateless(name="EJB1") // defaults to "EJB1" anyway
    public class EJB1 extends Abstract { ... }
    
    @Stateless
    public class EJB2 extends Abstract { ... }
    
    @ManagedBean 
    public class MyManagedBean {
        @EJB(name="EJB1") // or "EJB2"
        MyEJBIntf myEJB; 
    }
    

    【讨论】:

    • 这并不能完全解决我的问题 - 我需要确定要在运行时实例化的子类(取决于打开页面的参数)
    • 不,它没有,我忽略了这个假设。注入发生在应用程序启动时,只有 JNDI 查找是动态的。另一种选择是将两个 EJB 注入不同的字段,并通过“if”或更复杂的模式选择其中一个。
    • 另一种选择是将两个 EJB 注入不同的字段,并通过“if”或更精细的模式选择其中一个 - 这正是我目前遇到此问题的方式解决了。我想我只是想避免与注入不需要的实例相关的成本。
    • >你注入的不是实现,而是接口。 - 在 EJB 3.1 中,您可以注入实现,但它们必须是具体的非最终类。
    • 你应该考虑为每个子类创建不同的接口
    【解决方案2】:
    猜你喜欢
    • 2014-02-20
    • 1970-01-01
    • 2016-11-16
    • 2023-04-11
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多