Java ee 6/7 中模块和应用程序的 jndi 绑定有什么区别?

what is the difference between jndi binding of module and app in Java ee 6/7?

我们在开发环境中从 Jboss EAP 5 迁移到 EAP 6。

我现在在 JBOSS 日志中看到以下内容。我试图了解这种绑定是如何发生的。我在 JNDI namespace binding 上阅读了 JBOSS docs。我仍然不完全清楚它是如何工作的。这是我的日志。

java:global/customerCare/services/UserDaoImpl!com.example.services.UserDao
java:app/services/UserDaoImpl!com.example.services.UserDao
java:module/UserDaoImpl!com.services.UserDao
java:global/customerCare/services/UserDaoImpl
java:app/services/UserDaoImpl
java:module/UserDaoImpl

这是我的 EJBs

@Local
public interface UserDao {

    public static final String JNDI_NAME = "java:global/customCare/services/UserDaoImpl";

//interface methods here

}

@Stateless
public class UserDaoImpl implements UserDao {
// implement methods
}

我的疑惑是:

  1. 我在 UserDao 界面中明确将 JNDI binding 设为 java:global/customCare/services/UserDaoImpl。 那为什么我看到我绑定了其他人,比如 appmodule.

  2. appmodule有什么区别?什么时候需要绑定到这些组件?这里的一些例子会很有帮助

  3. 日志的最后三行显示绑定到 UserDaoImpl。它是 JBoss 没有我要求它绑定的东西吗? (我只为 JNDI 绑定设置了 UserDao 而不是 UserDaoImpl)。

我对JNDI Namespace绑定有点不了解。阅读文档对我有帮助,但程度不高。

谢谢

我可以回答疑惑2: 所有的名字都是一样的,但上下文不同。

全局名称是一个完整的 JNDI 上下文,用于全局绑定,即。来自客户端或来自另一个 EAR 文件

模块名称可用于在同一应用程序内绑定,即同一 EAR 内的不同 EJB

本地名称用于本地绑定,即在jar或war内。

使用较短的名称在本地绑定比每次都指定一个完整的全局名称稍微高效一些。

据我所知JBoss EAP 6 在部署期间总是会列出每个企业 bean 的三/六个名称。它旨在帮助开发人员识别 bean 的 JNDI 名称。