根据条件注入@EJB bean

时间:2011-10-27 17:48:50

标签: java-ee ejb

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

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

  public class MyClass{
    @EJB
    private MyBean bean;
  }

如果它是假的,那么

public class MyClass{
  @EJB
  private MyBean2 bean2;
 }

这可行吗?

2 个答案:

答案 0 :(得分:20)

正如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;
        }
    }
}

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

@Inject
MyBean myBean;

将根据您的情况为您注入适当的bean。

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

编辑:我添加了@EJB带注释的bean,以显示'myBean1'和'myBean2'实例的来源。

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

您可以将return myBean1更改为return context.lookup("JNDI_NAMESPACE_COORDINATES"),而contextInitialContext的实例,而不是以所呈现的方式执行此操作。

希望这更清楚。

答案 1 :(得分:2)

我认为你不能修改被注入的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;

}

public MyClass {

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

}

取决于您要注入的实现。