根据条件注入@EJB bean



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

我在属性文件中设置了一些值。如果它为真,那么我想
  public class MyClass{
    @EJB
    private MyBean bean;
  }

如果为假,则

public class MyClass{
  @EJB
  private MyBean2 bean2;
 }

这可行吗?

正如Gonzalo所说,如果您希望将bean声明为类字段并使用它的不同实现,则首先需要指定该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;

将根据你的情况为你注射合适的豆子。

如果您不需要类级别的字段,您可以使用旧的方法并在JNDI中定位EJB -通过这种方式,您可以控制应该定位和使用什么类型和什么bean。

EDIT:我已经添加了@EJB注释bean,以显示'myBean1'和'myBean2'实例可能来自何处。

这个例子显示了您可以有一个单独的地方,在那里您定义了对不同EJB实现和其他组件的所有依赖。在一个示例中,这可以作为具有@EJB字段、@PersistenceContext字段等的单例EJB来实现。

您可以将return myBean1更改为return context.lookup("JNDI_NAMESPACE_COORDINATES"),其中contextInitialContext的一个实例。

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

最新更新