一个新手问题:无论如何,我可以根据我在属性文件中设置的条件注入不同的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
.
希望这更清楚.