有没有办法使用接口在代码中注入依赖项?
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 名称才能查找服务。
我想在我的代码中获取对某个无状态 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 名称才能查找服务。