根据条件注入@EJB bean

neo*_*neo 14 ejb java-ee

一个新手问题:无论如何,我可以根据我在属性文件中设置的条件注入不同的bean.这就是我想要实现的目标:

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

  public class MyClass{
    @EJB
    private MyBean bean;
  }
Run Code Online (Sandbox Code Playgroud)

如果它是假的,那么

public class MyClass{
  @EJB
  private MyBean2 bean2;
 }
Run Code Online (Sandbox Code Playgroud)

这可行吗?

Pio*_*cki 23

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

而且,我认为使用CDI的@Produces方法可以实现更优雅; 即在这些线之间:

@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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中你可以使用:

@Inject
MyBean myBean;
Run Code Online (Sandbox Code Playgroud)

将根据您的情况为您注入适当的豆类.

如果您不需要类级别的字段,则可以使用旧方法并在JNDI中找到EJB - 这样您就可以控制应该定位和使用的bean类型和bean.

编辑:我添加了带@EJB注释的bean来显示'myBean1'和'myBean2'实例可能来自哪里.

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

您可以将其更改return myBean1为类似于return context.lookup("JNDI_NAMESPACE_COORDINATES")何处context的实例,而不是以所呈现的方式执行此操作InitialContext.

希望这更清楚.