关于JNDI and EJB
JNDI (The Java Naming and Directory Interface,Java 命名和目录接口) 是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、网络、对象服务等。
命名服务:就像DNS一样,通过命名服务器提供服务,大部分的J2EE 服务器都含有命名服务器。
目录服务:一种简化的RDBMS 系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY 等。
JNDI 的好处:
(1)包含大量命名和目录服务,可以使用相同API 调用访问任何命名或目录服务。
(2)可以同时连接多个命名和目录服务。
(3)允许把名称同JAVA 对象或资源关联起来,不必知道对象或资源的物理ID。
(4)使用通用接口访问不同种类的目录服务
(5)使得开发人员能够集中使用和实现一种类型的命名或目录服务客户API 上。
上下文:由0 或多个绑定构成。比如java/MySql,java 为上下文(context),MySql 为命名
子上下文(subConext):上下文下的上下文。比如MyJNDITree/ejb/helloBean,ejb 为子上下文。
因为JNDI 是一组接口,所以我们只需根据接口规范编程就可以。要通过JNDI 进行资源访问,我们必须设置初始化上下文的参数,主要是设置JNDI 驱动的类名(java.naming.factory.initial) 和提供命名服务的URL (java.naming.provider.url)。
因为Jndi 的实现产品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务器的不同而不同,java.naming.provider.url 的值包括提供命名服务的主机地址和端口号。
访问Jboss 服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
访问Sun 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.provider.url", "localhost:3700");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");
访问Weblogic10 应用服务器的例子代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
props.setProperty("java.naming.provider.url", "t3://localhost:7001");
InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean#com.foshanshop.ejb3.HelloWorld");
JBOSS 环境下JNDI 树的命名约定:
(1)java:copm 这个上下文环境和其子上下文环境仅能被与之相关的特定应用组件访问和使用
(2)java: 子上下文环境和绑定的对象只能被Jboss 服务器虚拟机内的应用访问
(3)其他上下文环境 只要实现序列化就可以被远程用户调用。
当你把EJB发布到JBOSS后,你就可以在jboss 的管理平台查看她们的JNDI 名,输入下面URL http://localhost:8080/jmx-console/,点击“service=JNDIView” link,在出现的page里找到“List of MBean operations:”栏的“list()”方法,click “Invoke”button,就会看到下面的界面
在上图中可以看见HelloWorld 会话Bean 的JNDI路径,JNDI 路径名的组成规则是“上层名称/下层名称,每层之间以”/”分隔。HelloWorld 会话Bean 的JNDI路径名是:HelloWorldBean/remote
下面要重点说明一下Jboss EJB JNDI 名称默认的命名规则,命名规则如下:
1> 如果EJB 打包进后缀为*.ear 的J2EE 发布文件,默认的JNDI 路径名称是
访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
例:EJB HelloWorld 打包进名为 HelloWorld.ear 的J2EE 应用,访问她远程接口的JNDI 名是:HelloWorld/HelloWorldBean/remote
2> 如果EJB 应用打包成后缀为*.jar 的发布文件, 默认的JNDI 路径名称是
访问本地接口:EJB-CLASS-NAME/local
访问远程接口:EJB-CLASS-NAME/remote
例: HelloWorld 应用打包成HelloWorld.jar 文件,访问她远程接口的JNDI 名称是:HelloWorldBean/remote
注意:EJB-CLASS-NAME 是不带包名的,如com.foshanshop.ejb3.impl.HelloWorldBean 只需取HelloWorldBean。
目前网上很多教材获取JNDI 路径名的方式不适用在jboss 下,如:
HelloWorld helloworld = (HelloWorld) ctx.lookup(HelloWorld.class.getName());
这种方式适用于Sun Application Server 及glassfish
自定义JNDI 命名
默认的JNDI 命名规则上面已经介绍过,但有些情况下需要自定义名称。在Jboss 中要自定义JNDI 名称,可以使用@LocalBinding 和@RemoteBinding 注释
关键代码(只需要在bean interface前加binding注释):
import org.jboss.annotation.ejb.RemoteBinding;
...
@Remote
@RemoteBinding (jndiBinding="testbinding/myAccount")
publicinterface MyAccount extends Serializable {
publicint Add(int a, int b);
publicint getResult() ;
}
那么在client端调用上面的EJB的代码为:
InitialContext ctx = new InitialContext(props);
MyAccount bean1 = (MyAccount) ctx.lookup("testbinding/myAccount");
分享到:
相关推荐
在EJB环境中,JNDI主要用来查找和访问EJB组件。 首先,我们要理解JNDI的工作原理。JNDI提供了一个统一的接口,无论底层是简单的名称服务还是复杂的目录服务。它允许开发者通过名称查找资源,如EJB、数据源、邮件...
这个名为“EJB中JNDI的使用源码例子.rar”的压缩包,很显然是一个包含了具体示例代码的资源,可以帮助我们理解如何在EJB环境中运用JNDI。 首先,让我们来深入了解一下JNDI。JNDI提供了一种统一的方式来查找和管理...
在EJB上下文中,JNDI主要用来查找EJB的引用,这些引用可以是远程接口或者本地接口,它们对应着实际运行在应用服务器上的EJB组件。 2. EJB与JNDI的结合 在EJB应用中,客户端通常不直接与EJB组件交互,而是通过EJB的...
在EJB中,JNDI主要用于查找EJB的引用。客户端首先通过JNDI查找EJB的Home接口,然后通过Home接口创建远程或本地的Session Bean实例。EJB的JNDI名称通常由服务器配置,包括企业bean的名称、模块名称以及服务器提供的...
- 查找EJB:在客户端代码中,使用`InitialContext`类的`lookup`方法,传入JNDI名称来查找EJB引用。 - 链接EJB:找到EJB引用后,可以调用其`create`或`lookup`方法来获取EJB实例。 2. 示例代码分析: - `...
这个压缩包"基于java的EJB中JNDI的使用源码例子.zip"包含了使用JNDI进行EJB查找的代码示例,下面将详细介绍JNDI在Java EE中的应用以及EJB的相关知识点。 1. JNDI简介: JNDI提供了一种统一的方式来管理和查找资源...
2. **JNDI查找**:在Java EE应用中,通过JNDI查找可以获取到EJB的引用。首先,我们需要创建一个NamingContext对象,然后调用其lookup()方法,传入EJB的JNDI名称。这个名称通常由两部分组成:全局上下文名(如"java:...
JNDI是一个服务接口,用于查找和绑定分布式环境中的对象,如EJB的引用。在EJB应用中,JNDI常用来查找并调用远程EJB Bean。 **EJB 3.0** 版本是EJB的一个重要里程碑,它引入了许多改进,使得EJB更易于使用,减少了...
### POJO、JavaBean、EJB与JNDI的理解及区别 ...- **JNDI**是用于查找和引用分布式环境中命名资源的接口,增加了应用程序的灵活性和可配置性。 理解这些概念及其区别对于构建高效、可维护的Java应用程序至关重要。
1. **配置EJB3**:在部署描述符(如ejb-jar.xml或web.xml)中,为每个EJB3组件指定一个全局唯一的名字,这将作为JNDI名称。 2. **发布EJB3**:当EJB3应用部署到应用服务器时,服务器会自动将其注册到JNDI上下文中,...
EntityManager通常由JPA提供者管理,开发者可以通过@PersistenceContext注解在类中声明一个EntityManager的引用,或者通过JNDI查找来获取EntityManagerFactory,然后从中创建EntityManager实例。 #### Entity的生命...
**JNDI**(Java Naming and Directory Interface)是Java平台中的一个API,用于访问命名和目录服务,这些服务可以存储对象引用及其名称。JNDI的主要作用在于提供了一种在分布式环境中查找和访问远程对象的标准方法。...
3. **开发客户端**:创建Java项目,添加对EJB项目的引用,导入必要的JBoss客户端库,并配置JNDI(Java Naming and Directory Interface)查找EJB。 EJB的JNDI名称通常是Bean类名,可以通过注解`@Stateless(name=...
例如,如果你想自定义JNDI名称,可以在`jboss-ejb3.xml`中这样设置: ```xml <ejb> <ejb-name>MyBean</ejb-name> <jndi-name>java:/MyBean</jndi-name> </ejb> ``` 这两个文件通常放在EJB模块的`META-INF`目录下...
在J2EE环境中,EJB对象由EJB容器(如JBoss)管理,开发者不能直接实例化EJB,而是通过JNDI查找机制获取EJB的引用。JNDI允许应用通过名字来查找和绑定对象,简化了对象的查找和访问。 【EJB的分类】 EJB主要有三种...
- **EJB引用**:EJB可以通过JNDI查找和调用其他EJB组件。 - **JMS队列和主题**:JNDI用于查找消息传递系统的队列和主题,以便发送和接收消息。 - **邮件服务**:应用可以通过JNDI查找邮件服务器,进行邮件发送。 **...
JNDI使得客户端可以通过名称而非硬编码引用来找到并调用EJB。 6. **容器服务**:EJB容器提供的服务包括但不限于事务管理(Transaction Management)、安全性(Security)、资源注入(Dependency Injection)、并发...
其中`name`是EJB的引用名,`beanInterface`指定bean的类型,用于将这个bean资源绑定到对应的JNDI服务器上。 #### 二、依赖注入 依赖注入(Dependency Injection, DI)是一种设计模式,目的是减少代码间的耦合度,...