一、EJB发展历史
IBM、SUN公司力推EJB前景,大公司开始采用EJB部署系统。主要价值:对分布式应用进行事务管理
出现问题:
①EJB的API难度大
②规范要求必须抛出特定异常的接口并将Bean类作为抽象类实现(不正常不直观)
③对象关系映射和食物管理有天然复杂性
④用EJB封装业务逻辑会带来性能下降
【早期EJB规范至允许客户端通过特定协议例如CORBA进行远程方法调用来调用,直到EJB2.0引入本地接口。】
轻量级技术代替EJB:Hibermate【数据持久化和对象关系映射】、Spring框架【封装业务逻辑】
改变: EJB3.0出现
1. EJB 1.0
EJB1.0发布于1998年3月24日,规范中包含有状态的的服务器对象、无状态的服务器对象和可选的持久化领域对象 。
EJB1.0提供了良好的分布式支持功能,允许通过远程接口来远程调用EJB中的业务方法。
EJB1.0强制客户机组件以远程访问的方式调用EJB方法。
2. EJB 1.1
EJB1.1发布于1999年12月17日。
EJB1.1开始支持实体Bean,必须在应用中实现。实体Bean是可以存储在持久存储介质上的持久对象,用来表示永久性数据并提供操作这些数据的方法。一般情况下一个实体Bean对应数据库中的一张表,而一个实体类的实例对应着这张表的一个记录。
EJB1.1引入了XML格式的部署描述文件,用来以声明的方式管理EJB的部署信息。
EJB1.1的安全机制由角色驱动,而非方法。
3. EJB 2.0
EJB2.0发布于2001年8月22日。
EJB2.0取消了强制客户机组件以远程访问的方式调用EJB方法。【减少不必要的系统开销 避免性能下降】
EJB2.0引入本地接口,允许开发者选择是否让EJB组件支持远程访问。
EJB2.0增强了实体Bean功能,为容器管理持久化的EJB提供容器管理关系的支持,开发者可以通过配置文件来管理EJB之间的关系
EJB2.0引入了EJB-QL作为查询语言,为实体Bean提供查询支持。
EJB2.0引入了消息驱动Bean,消息驱动Bean是用来专门处理消息请求的组件,属于无状态的会话Bean,异步处理用户请求。消息驱动Bean没有远程接口,不能被客户机调用。可以通过向消息目的地发消息触发消息驱动Bean的onMessage方法。
4. EJB 2.1
EJB2.1发布于2003年11月24日。
EJB2.1可以提供Web Service支持,利于异构系统的整合。可将无状态会话bean暴露为Web服务;EJB可通过引用访问Web服务。
EJB2.1增加定时器服务,提供一种新的基于定时器的事件驱动方式。可供消息驱动bean作为消息源使用。
EJB2.1增加了EJB-QL的功能,改进EJB-QL的查询功能。支持ORDER BY, AVG, MIN, MAX, SUM, COUNT和MOD。
EJB2.1使用XML schema代替DTD以定义部署描述符。
5. EJB 3.0
EJB3.0发布于2006年5月2日。
EJB3.0抛弃了EJB2实体的设计,仅保留了会话Bean和消息驱动Bean。
EJB3.0引入了全新的JPA规范作为持久化解决方案。JPA是一种Java应用程序接口规范,描述Java应用中关系数据的管理,充当面向对象领域模型和关系数据库系统的桥梁。
EJB3.0简化了EJB2中会话Bean的开发,不再需要Home接口。
EJB3.0只要求提供远程或本地的业务接口即可。
EJB3.0不推荐实用XML文件作为部署描述文件,改为使用Annotation设置部署描述信息。
EJB3.0使用传统简单Java对象(POJO),实际是普通JavaBeans,有一些属性及属性的getter、setter方法,没有业务逻辑,有时可以作为值对象和数据传输对象使用。可以有简单的运算属性,不允许有业务方法,不能带有connection之类的方法。主要用协助业务逻辑。
EJB3.0支持依赖注入来简化全异系统的集成与配置。
EJB3.0规范大幅采用Java注释来代替部署描述符对代码进行元数据修饰,从而消减此前EJB编程的冗杂性。
EJB3.0把2.X版的实体Bean改为由JPA支持。【JPA是Java持久层接口,是JDK5.0注释和XML描述对象关系表的映射关系,运行期的实体对象持久化到数据库中。】
6. EJB 3.1
EJB3.1允许企业Bean只提供一个Bean类,无须提供业务接口。
EJB3.1允许通过异步的方式调用会话Bean的业务方法。
EJB3.1取消了类文件必须打包到JAR文件的限制,允许直接将EJB类放到WAR文件中。
二、EJB核心模型
EJB定义了三种企业Bean,分别是会话Bean、实体Bean和消息驱动Bean。
会话Bean描述了与客户端的一个短暂的会话。当客户端的执行完成后,会话Bean和它的数据都将消失;
实体Bean描述了存储在数据库表中的一行持久稳固的数据,如果客户端终止或者服务结束,底层的服务会负责实体Bean 数据的存储。
数据驱动Bean结合了会话Bean 和 Java信息服务(JMS)信息监听者的功能,它允许一个商业组件异步地接受 JMS消息。
1. 会话Bean
会话Bean用于实现业务逻辑,分为有状态的会话Bean和无状态的会话Bean。
每当客户端发出EJB调用请求时,容器就会选择一个会话Bean为客户端服务。
会话Bean可以直接访问数据库,更多时候由实体Bean实现数据访问。
2. 实体Bean
实体Bean代表真实物体的数据。
EJB3.0中实体Bean仅作为普通Java对象使用。
实体Bean负责与数据库表进行对象关系映射。
3. 消息驱动Bean
消息驱动Bean用来专门处理基于消息请求的组件。
消息驱动Bean可以收发异步JMS消息,能够与其他EJB交互。
【JMS是Java消息服务应用程序接口 支持两个程序之间或分布式系统中发送消息,进行异步通信】
适用于一个业务执行时间很长,执行结果无须实时向用户反馈的场合。
三、开发支撑
1. EJB容器
EJB需要运行在EJB容器,EJB容器截取客户和组建之间的通信,并根据配置信息添加基础设施代码,EJB容器用于提供EJB组件的开发、部署和运行环境。
目前支持EJB3.0的应用服务器有JBoss(4.2.X以上版本)、Classfish、WebLogic(10以上版本)、Sun Application Server(9.0以上版本)、Oracle Application Server(10g以上版本)和Apusic应用服务器。【JBoss是使用者最多的开源应用服务器,WebLogic是时长占有率最高的商业应用服务器】
2. JNDI
JNDI为各种现有的命名和目录服务提供通用接口:DNS、LDAP、活动目录、RMI注册器、COS注册器、NIS及文件系统。
JNDI有客户API和服务提供商接口SPI组成,应用程序通过客户API访问命名和目录服务。服务提供商接口用于供厂商创建命名和目录服务的JNDI实现。
EJB开发者只需要知道客户API如何访问命名和目录服务,不需要知道JNDI SPI的使用。
命名服务用于将名称和对象联系起来,从而可以用名称访问对象。【例如:输入URL ------DNS-------》IP地址】
目录服务是命名服务的扩展,目录服务的对象不仅有名称,还有属性。目录服务中对象可以有属性,命名服务中对象没有属性。
四、开发平台
可以在Eclipse上完成基于EJB的二次开发。
五、二次开发基本步骤
1. 开发环境配置
①配置JDK和JBoss环境,在Eclipse里新建EJB项目
②打包JAR文件到JBoss安装目录是server/default/deploy/目录下,JBoss会对JAR文件进行热部署。打包WAR文件到JBoss安装目录是server/default/deploy/目录下。浏览器访问应用程序。