Jakarta ee 基于条件注入@ejbbean

Jakarta ee 基于条件注入@ejbbean,jakarta-ee,ejb,Jakarta Ee,Ejb,一个新手问题:我是否可以根据在属性文件中设置的条件注入不同的bean。以下是我想要实现的目标: 我在属性文件中设置了一些值。如果这是真的,那么我想 public class MyClass{ @EJB private MyBean bean; } 如果是假的,那么 public class MyClass{ @EJB private MyBean2 bean2; } 这可行吗?我认为您无法修改正在注入的bean的类型。我认为这是一种Java限制,因为它是一种

一个新手问题:我是否可以根据在属性文件中设置的条件注入不同的bean。以下是我想要实现的目标:

我在属性文件中设置了一些值。如果这是真的,那么我想

  public class MyClass{
    @EJB
    private MyBean bean;
  }
如果是假的,那么

public class MyClass{
  @EJB
  private MyBean2 bean2;
 }

这可行吗?

我认为您无法修改正在注入的bean的类型。我认为这是一种Java限制,因为它是一种强类型语言:)

但是,您可以使用多个bean实现同一接口的场景,并且您希望注入该接口的特定实现,如下所示:

@Local
public interface MyBean {
}

@Stateless
public class MyBeanImpl1 implements MyBean {
}

@Stateless
public class MyBeanImpl2 implements MyBean {
}
然后你可以做:

public MyClass {

@EJB(beanName="MyBeanImpl1")
MyBean myBean;

}


根据要注入的实现。

正如Gonzalo所说,如果要将bean声明为类字段并使用不同的实现,首先需要指定bean的公共接口

此外,我认为使用CDI的@products方法可以实现更优雅的效果;i、 e.在这两条线之间:

@Singleton
@Startup
public class Configuration {

    private boolean someCondition;

    @PostConstruct
    private void init() {
        someCondition = ... // get a value from DB, JMS, XML, etc.
    } 

    @EJB(lookup="java:comp/env/myParticularBean")
    MyBean myBean1;

    @EJB(beanName="anotherTypeOfBeanInjectedByName")
    MyBean myBean2;

    @Produces
    public MyBean produceMyBean() {
        if (someCondition)
            return myBean1;
        } else {
            return myBean2;
        }
    }
}
然后在代码中,您可以只使用:

@Inject
MyBean myBean;
并根据您的情况为您注入合适的bean

如果您不需要类级别的字段,那么可以使用旧方法在JNDI中定位EJB——这样您就可以控制应该定位和使用什么类型和什么bean

编辑:我添加了带注释的
@EJB
bean,以显示“myBean1”和“myBean2”实例可能来自何处

这个示例显示,您可以在一个单独的位置定义对不同EJB实现和其他组件的所有依赖关系。在一个例子中,这可以实现为带有@EJB字段、@PersistenceContext字段等的单例EJB

您可以将
return myBean1
更改为类似
return context.lookup(“JNDI\u NAMESPACE\u COORDINATES”)
的内容,其中
context
InitialContext
的实例


希望这能让问题更清楚。

这不是一个很好的解决方案,因为如果您决定更改实现,您必须重新编译代码。实际上,@Neo要求基于条件的注入。不是人工选择的注射。谢谢你的建议。但是当返回类型为“MyBean”时,我不太明白如何返回“myBean1”或“myBean2”?你能告诉我更多的细节吗?myBean1和myBean2是实现MyBean的类的实例。我会更新这个问题来展示更多的代码谢谢PedroKowalski。那么哪个类应该有方法“public MyBean produceMyBean()”?@neo任何适合您的方法:-)如果您想使用
@EJB
,它可以是一个单例EJB,如示例所示。如果您喜欢手动使用JNDI查找,它可能是一个常规类。谢谢并查看示例-希望这次更清楚。执行JNDI查找将是一个可行的替代方案,产生相同的后条件,但在应用程序服务器之间迁移代码将很难,因为到EJB的默认JNDI路径不是标准化的。
@Inject
MyBean myBean;