有没有办法使用接口在代码中注入依赖?

时间:2015-02-20 12:33:51

标签: java java-ee ejb ejb-3.0

我希望在代码中引用一些无状态bean。问题是我只知道它正在实现的接口(我不知道名称,类名或任何其他)。

通常对于任何其他EJB,我会将@EJB注释与接口

一起使用
private @EJB MyInt myInt;

有人知道是否可以通过代码获取它,例如ex:

MyInt myInt = new InitialContext().lookuup(MyInt.class);

2 个答案:

答案 0 :(得分:1)

不幸的是,如果您有相同接口的多个实现,则需要指定所需的实现。因此,您将需要实现的映射名称,否则您将需要JNDI名称以便查找它。您的Application Server管理员应该能够为您提供JNDI名称。

如果您想要在运行时交换实现,那么就不能使用注入。您将不得不进行JNDI查找。 我们通过从数据库中的配置表中获取JNDI名称来构建一个小工厂来查找无状态会话bean。这使您可以通过更改数据库表中的JNDI名称来交换实现。 以下是我们的bean查找方法的示例:

public static Object getBean(String jndiName) throws NamingException {
    Object bean = null;
    Context ctx = new InitialContext();
    bean = ctx.lookup(jndiName);
    return bean;
}   

我希望这会有所帮助。 :)

答案 1 :(得分:1)

我假设您要查找远程EJB,因为您不知道具体的类名。远程EJB在RMI注册表中注册(考虑map <JndiName, RemoteObject>)。即使服务提供者没有为远程服务指定JNDI名称,应用程序服务器也会根据服务接口名称创建JNDI名称并在RMI注册表中注册。

因此客户端需要知道JNDI名称才能查找服务。