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对象序列化的机制实现分布式计算,实现远程类对象的实例化和调用的方法。
图例:
(图片来源:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)
RMI的开发步骤:
- 创建远程接口及声明远程方法,实现双方通讯的接口,需要继承Remote
- 开发一个类来实现远程接口及远程方法,实现类需要继承UnicastRemoteObject
- 注册服务,启动远程对象
- 客户端查找远程对象,调用远程方法
注册服务:
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/