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

Is there a way to inject dependency in code using interface?

我想在我的代码中获取对某个无状态 bean 的引用。问题是我只知道它正在实现的接口(我不知道名称、类名或任何其他名称)。

通常对于任何其他 EJB,我会使用带有接口的 @EJB 注释

private @EJB MyInt myInt;

有谁知道是否可以通过像 ex 这样的代码获得它:

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

?

遗憾的是,如果同一接口有多个实现,则需要指定所需的实现。因此,您将需要实现的映射名称或者您将需要 JNDI 名称以便像那样查找它。您的应用程序服务器管理员应该能够为您提供 JNDI 名称。

如果您想在运行时换出实现,则不能使用注入。您将必须执行 JNDI 查找。 我们构建了一个小工厂,通过从数据库中的配置 table 获取 JNDI 名称来查找无状态会话 bean。这使您能够通过更改数据库中的 JNDI 名称来换出实现 table。 下面是我们的 bean 查找方法的示例:

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

希望对您有所帮助。 :)

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

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