EJB>EJB 概念

Enterprise JavaBean(EJB)定义了三种企业Bean,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。

实体Bean 

实体bean 除了担负起存放数据的角色,还要负责跟数据库表进行对象与关系映射(O/R Mapping),

消息驱动Bean(MDB):

是设计用来专门处理基于消息请求的组件。它能够收发异步JMS 消息,并能够轻易地与其他EJB 交互。它特别适合用于当一个业务执行的时间很长,而执行结果无需实时向用户反馈的这样一个场合。

会话Bean

用于实现业务逻辑,它分为有状态bean 和无状态bean。每当客户端发出EJB 调用请求时,容器就会选择一个Session Bean 来为客户端服务。会话Bean 可以直接访问数据库,但更多时候,它是通过实体Bean 实现数据访问。

有状态bean和无状态bean

有状态bean 可以维护会话状态,无状态bean 不维护会话状态。要维护会话状态,意味着EJB 容器要为每个用户创建一个bean实例,并通过该实例保存着与用户的会话状态。不维护会话状态,意味着一个bean 实例不需要保存与某个用户的会话状态,这时一个bean 实例可以为多个用户服务。

有状态会话Bean和无状态会话Bean的区别:

从编写方面来说:接口没有区别,Bean类使用StatelessStatefull
从客户端来说:没有任何区别。
从容器方面来说:对于无状态会话Bean来说,当有客户端发送请求的时候,不一定创建实例,所以多个客户端可能共享实例,实例的成员变量保存的信息不是专门为某个客户保存的,这些信息是所有客户端共享的,有点类似于Java的静态成员。客户端不能期望服务器端为你保存信息。处理过程需要的信息通过方法的参数传递。如果是有状态会话Bean,服务器会为每个客户端创建独立实例(要保存信息),每个客户端的信息由相应的实例来保存,客户端的多次方法调用(initializeaddbookremovebook)之间可以共享信息,每次方法调用只需要传递额外的信息。

 远程(remote)和本地(local)接口

远程接口(remote interface):定义了session bean 的业务方法,这些方法可以被来自EJB 容器之外的应用访问到。

本地接口(local interface):同样定义了session bean 的业务方法,这些方法可以被同处于EJB 容器内的其它应用使用。因为local 接口允许bean 之间直接通过内存交互,没有分布式对象协议的开销,从而改善了性能。

要开发一个Session Bean,我们需要定义接口和Bean class。其中接口分为远程(remote)和本地(local)接口。在EJB3.0中,不要求你同时实现remote 和local 接口,但实现两者是比较好的做法。使用@Remote 注释指明实现的接口是远程接口,后者使用@Local 注释指明实现的接口是本地接口。当@Local 和@Remote 注释都不存在时,会话Bean 实现的接口默认为Local 接口。如果在本机调用EJB(确保客户端与EJB 容器运行在同一个JVM),采用Local 接口访问EJB 优于Remote 接口,因为Remote接口访问EJB 需要经过远程方法调用(RPCs)环节,而Local 接口访问EJB 直接从JVM 中返回EJB 的引用。

 JNDI(The Java Naming and Directory Interface,Java 命名和目录接口)

是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、网络、对象服务等。

它为各种现有的命名和目录服务提供了通用接口:DNS、LDAP、活动目录(Active Directory)、RMI 注册器、COS 注册器、NIS 及文件系统。在结构上,JNDI 由两部分组成:客户API 和服务提供商接口(Service ProviderIntergace,SPI),应用程序通过客户API 访问命名和目录服务;服务提供商接口用于供厂商创建命名和目录服务的JNDI实现。JNDI 的结构图:

对于EJB 开发者来说,我们只需要知道使用客户API 如何访问命名和目录服务即可,而不需要知道JNDI SPI 的使用,因为我们不需要使用JNDI SPI 开发JNDI 实现产品,这就好比通过JDBC 访问数据库,我们只需要知道使用JDBC API 如何访问数据库,而不需要知道数据库的JDBC 驱动如何实现。使用客户API 访问EJB3.0,我们需要编写的JNDI 代码不过几句,所以大家不要被吓倒了。

命名服务

用于将名称和对象联系起来,使得我们可以用名称访问对象。例如,当你在web 浏览器输入URL:http://www.foshanshop.net 时,DNS(Domain Name System,域名系统)将这个域名转换成IP 地址。

目录服务是命名服务的自然扩展,在这种服务里,对象不但有名称,还有属性。与命名服务的关键差别是:目录服务中对象可以有属性(例如,用户有email 地址),而命名服务中对象没有属性。

InitialContext = new InitialContext(props);
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
原文地址:https://www.cnblogs.com/xqzt/p/5637415.html