J2EE学习记录,EJB,JNDI,RMI

Java EE  

  是java平台企业版(Java Platform Enterprise Edition)缩写,是Sum公司为企业级应用推出的标准平台。

  随着Java技术的发展,J2EE平台得到了迅速的发展,成为Java语言中最活跃的体系之一。现如今,J2EE不仅仅是指一种标准平台,它更多的表达着一种软件架构和设计思想。

  java EE 是由一系列的技术标准组成的平台。

  主要有熟悉且比较常用的:

    EJB - 企业级JavaBean(Enterprise Java Beans)

    JDBC - Java数据库联接(Java Database Connectivity)

    JSP - Java服务器页面(Java Server Pages)

    JNDI - Java名称与目录接口(Java Naming and Directory Interface)

EJB:

  企业级JavaBean(Enterprise Java Beans),EJB是运行在服务器上的组件,实现业务逻辑,并通过RMI进行访问

  RMI(Remote Method Invocation) 远程方法调用,是利用java对象序列化的机制实现分布式计算,实现远程类对象的实例化和调用的方法。

  图例:

  

(图片来源:

RMI的开发步骤:

  1. 创建远程接口及声明远程方法,实现双方通讯的接口,需要继承Remote
  2. 开发一个类来实现远程接口及远程方法,实现类需要继承UnicastRemoteObject
  3. 注册服务,启动远程对象
  4. 客户端查找远程对象,调用远程方法

注册服务:

PersonService personService=new PersonServiceImpl();
//注册通讯端口
LocateRegistry.createRegistry(6600);
//注册通讯路径
Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);

客户端调用:

/调用远程对象,注意RMI路径与接口必须与服务器配置一致
PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");
List<PersonEntity> personList=personService.GetList();

原文参考:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html

 

JNDI - Java名称与目录接口(Java Naming and Directory Interface)

   J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。

   JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。

例如JDBC数据源的调用

配置 JNDI 引用

为了让 JNDI 解析 java:comp/env/jdbc/mydatasource 引用,部署人员必须把 <resource-ref> 标签插入 web.xml 文件(Web 应用程序的部署描述符)。 <resource-ref> 标签的意思就是“这个组件依赖于外部资源”。清单 3 显示了一个示例:

清单 3. resource-ref 入口
<resource-ref>
  <description>Dollys DataSource</description>
  <res-ref-name>jdbc/mydatasource</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>

<resource-ref> 入口告诉 servlet 容器,部署人员要在 组件命名上下文(component naming context) 中设置一个叫做jdbc/mydatasource 的资源。
组件命名上下文由前缀 java:comp/env/ 表示,所以完全限定的本地资源名称是:java:comp/env/jdbc/mydatasource.

  这只定义了到外部资源的本地引用,还没有创建引用指向的实际资源。(在 Java 语言中,类似的情况可能是: <resource-ref> 声明了一个引用,比如 Object foo,但是没有把 foo 设置成实际引用任何 Object。)

  部署人员的工作就是创建 DataSource(或者是创建一个 Object 对象,让 foo 指向它,在我们的 Java 语言示例中就是这样)。每个容器都有自己设置数据源的机制。例如,在 JBoss 中,是利用服务来定义数据源(请参阅 $JBOSS/server/default/deploy/hsqldb-ds.xml,把它作为示例),它指定自己是 DataSource 的全局 JNDI 名称(默认情况下是 DefaultDS)。在创建资源之后,第三步仍然很关键:把资源连接或者绑定到应用程序组件使用的本地名称。在使用 Web 应用程序的情况下,是使用特定于供应商的部署描述符扩展来指定这个绑定,清单 4 中显示了一个这样的例子。(JBoss 用称为 jboss-Web.xml 的文件作为特定于供应商的 Web 应用程序部署描述符。)

清单 4. 用特定于供应商的部署描述符将资源绑定到 JDI 名称
<resource-ref>
   <res-ref-name>jdbc/mydatasource</res-ref-name>
   <jndi-name>java:DefaultDS</jndi-name>
</resource-ref>

这表明应该将本地资源引用名称( jdbc/mydatasource)映射到名为 java:DefaultDS 的全局资源。如果全局资源名称出于某种原因发生了变化,而应用程序的代码无需变化,那么只需修改这个映射即可。在这里,有两个级别的间接寻址:一个定义并命名资源(java:DefaultDS),另一个把特定于本地组件的名称( jdbc/mydatasource)绑定到命名的资源。(实际上,当您在 EAR 级别上映射资源时,可能还存在第三级别的间接寻址。)

在Spring中,我们通常如下方式调用服务器配置的JNDI数据源,OracleDS配置的数据源jndi名

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="jdbc/OracleDS" />
  <property name="resourceRef" value="false" />
</bean>

在java代码中,可以使用@Autowired将这个bean注入使用

参考文档:https://www.ibm.com/developerworks/cn/java/j-jndi/

   

posted @ 2016-10-19 16:37  hyiam  阅读(790)  评论(0编辑  收藏  举报