Dependency injection 实现相同接口的多个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

我对ejb这个东西很陌生。有没有可能在一个文件中,我可以根据一些标准进行多次注射

例如

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接收器时出错,不知道为什么!!