Dependency injection 实现相同接口的多个ejb注入
我对ejb这个东西很陌生。有没有可能在一个文件中,我可以根据一些标准进行多次注射 例如Dependency injection 实现相同接口的多个ejb注入,dependency-injection,ejb,Dependency Injection,Ejb,我对ejb这个东西很陌生。有没有可能在一个文件中,我可以根据一些标准进行多次注射 例如 public interface common(){ public void sayhello(); } beanA implements common() beanB implements common() 两者都是无状态bean 现在我有一个客户端,它需要根据一些条件触发hello方法。例如,假设基于控制台输入,若字符串包含,则应注入beanA,否则为b
public interface common(){
public void sayhello();
}
beanA
implements common()
beanB
implements common()
两者都是无状态bean
现在我有一个客户端,它需要根据一些条件触发hello方法。例如,假设基于控制台输入,若字符串包含,则应注入beanA,否则为beanB。
有可能吗?我的下一个问题是,我可以说这个动态注入不是由容器管理的吗?如果是这样,我如何让容器控制?我需要一个样本代码或至少任何教程参考
提前谢谢 不,这是不可能的。您可能能够接近使用线程本地或会话属性的自定义CDI作用域,但我不推荐这样做。相反,只需向两个EJB注入一个引用,并根据需要选择要使用的引用:
@EJB(beanName="BeanA")
Common beanA;
@EJB(beanName="BeanB")
Common beanB;
private Common getCommon(String input) {
return isBeanAInput(input) ? beanA : beanB;
}
你可以这样做:
public interfaces ICommon {
public void sayhello();
}
@Stateless
@LocalHome
public class BeanA implements ICommon {
public void sayhello() {
// say hallo
}
}
@Stateless
@LocalHome
public class BeanB implements ICommon {
public void sayhello() {
// say hallo
}
}
这里是使用EJB服务的CDI客户机
@Model
public void MyJSFControllerBean {
@Inject
private BeanA beanA;
@Inject
private BeanB beanB;
public String sayhello(final String input) {
if("a".equals(input)) {
beanA.sayhello();
} else {
beanB.sayhello();
}
return "success";
}
}
或者,另一种解决方案是创建一个CDI生产者来创建这个。但是你混合了两个不同的概念。但我认为这取决于你的具体用例
动态注入不存在!通过@product和@Qualifier,您可以控制要注入的所需CDIBean的创建。但这只适用于CDI,不适用于EJB
这里是CDI生产者示例:
public void ICommonProducer {
@EJB
private BeanA beanA;
@EJB
private BeanB beanB;
@Produces
public ICommon produce() {
final String input = "?????";
// but here you have the problem that must get the input from elsewhere....
if("a".equals(input)) {
beanA.sayhello();
} else {
beanB.sayhello();
}
}
}
@Model
public void MyJSFControllerBean {
@Inject
private ICommon common;
public String sayhello(final String input) {
common.sayhello();
return "success";
}
}
我没有测试过这段代码…只是为了理解您的用例,如果两个bean都是无状态的并且实现了一个公共接口,那么使用哪一个又有什么关系呢?它们只是有一个不同的实现,客户端将公开一个接口…感谢bkail…因此在这种情况下,将创建冗余对象,在这种情况下,容器是否可能删除该对象?将创建一个冗余的代理对象,但实际的无状态实例将不会分配和注入,以及后构造等,直到在代理上调用一个方法。感谢Stefan,我尝试了无生产者,但不是使用inject,而是@EJB。我希望这也能奏效。然而,在部署时,我的所有bean都已部署,但在调用函数时,我收到了noEJB接收器错误。我不明白为什么:-下面是我的代码@如何在这方面产生帮助?我的意思是,当以任何方式创建use@EJB代理对象时,只有在对该对象调用方法时,容器才会像您所说的那样创建一个无状态实例。我在common.sayhello方法上以完全相同的方式编写代码,在我的示例中,我正在从我的主方法执行Jndi查找。我在没有EJB接收器时出错,不知道为什么!!