一个新手问题:无论如何,我可以根据我在属性文件中设置的条件注入不同的bean。这就是我想要实现的目标:
我在属性文件中设置了一些值。如果这是真的,那么我想
public class MyClass{
@EJB
private MyBean bean;
}
如果它是假的,那么
public class MyClass{
@EJB
private MyBean2 bean2;
}
这可行吗?
答案 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")
,而context
是InitialContext
的实例,而不是以所呈现的方式执行此操作。
希望这更清楚。
答案 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;
}
取决于您要注入的实现。