320 likes | 479 Views
EJB 3.0. 兰倩. 主要内容. EJB 概述 EJB 2.X 组成 编程模型 缺陷 EJB 3.0 组成 编程模型 测试. EJB 概述. Enterprise Java Bean 基于 Java 的服务器端组件框架技术 用于构建企业级、分布式组件应用. EJB 概述. EJB 的优势. 降低开发远程分布式应用程序的难度 使开发人员专注于业务逻辑的开发 提供组件级安全性 快速、轻松构建服务器端组件 便携性 可重用性 持久性 良好的伸缩性 ( 适应不同硬件资源 ). EJB 2.x. EJB 2.x.
E N D
EJB 3.0 兰倩
主要内容 • EJB概述 • EJB2.X • 组成 • 编程模型 • 缺陷 • EJB3.0 • 组成 • 编程模型 • 测试
EJB概述 • EnterpriseJavaBean • 基于Java的服务器端组件框架技术 • 用于构建企业级、分布式组件应用
EJB的优势 • 降低开发远程分布式应用程序的难度 • 使开发人员专注于业务逻辑的开发 • 提供组件级安全性 • 快速、轻松构建服务器端组件 • 便携性 • 可重用性 • 持久性 • 良好的伸缩性(适应不同硬件资源)
EJB 2.x • Bean 类:组件主要业务逻辑实现 • EJB对象:拦截调用请求,隐式中间件服务,提供客户视图 • 远程/本地接口:暴露给远程/本地用户 • Home接口:EJB对象生命周期接口(创建销毁) • 部署描述符:XML文档,声明中间件服务需求 • 容器厂商专有文件:EJB服务器提供的专有特性 • EJB-Jar:包含构成EJB组件的所有内容
EJB 2.x编程模型 • 开发构成EJB组件的Java源文件:远程和本地接口、企业Bean类、Home接口 • 手工完成部署描述符 • 通过具体EJB容器的部署建议完成EJB-Jar的部署 • 配置EJB服务器 • 测试代码
1.创建EJB对象 本地客户 8. 调用隐式中间件API 9. 返回调用结果 隐式中间件服务 本地接口 5. 调用隐式中间件API 6. 调用Bean类方法 EJB Home 3. 返回EJB对象引用 2. 获得EJB对象 EJBBean类 4. 通过本地接口调用方法 EJB对象 7. 返回结果
EJB 2.x的缺陷 一. 开发复杂性 • 强制要求每个会话Bean在Home接口中提供create()方法 • 开发者需要分别实现本地接口和远程接口 • 开发者需要在SessionBean接口实现挂起和激活Bean实例的容器回调方法 • 开发者需要直接同JNDI(Java命名和目录接口)API交互
EJB 2.x的缺陷 二. 部署复杂性 • XML文档不利于开发者编辑 • 破坏EJB组件在EJB容器之间的可移植性 三. 测试复杂性 • 在容器中测试,需要将测试脚本部署到JavaEE容器中 • 在容器外测试,要求EJB组件已经实现远程接口
Bean类 无状态会话Bean 1. 会话Bean 有状态会话Bean 2. 消息驱动Bean(MDB) 3 .实体Bean
会话Bean • 含有业务逻辑的可重用组件,用于业务过程 • 存活短暂的内存对象,其存活期由客户会话的持续期决定 • 不是持久化对象,不保存到永久化存储源 • 不能够在多客户之间共享,不表示数据库中的数据
无状态会话Bean • 服务的业务过程只需单个业务方法即可完成,EJB组件不需维护方法调用期间的状态变更信息 • EJB容器维护Bean实例池 • 所有的实例对于客户而言都是等效的,是可重用的
无状态会话Bean生命周期 1. 实例化新的实例 Bean实例不存在 Bean实例池 (所有实例全部等效) 5. 执行PreDestroy回调(可选) 2. 根据部署描述符注入实例上下文依赖(可选) 3. 执行PostConstruct回调,进行初始化(可选) 4. 客户调用业务方法
有状态会话Bean(1) • 服务的业务过程能够延伸到多个方法请求或事务中的Bean,需要为单个客户保存状态信息 • 具体实现: 不是为一个会话一直保留一个Bean实例,而是在实例池中维护若干个处于不同状态的Bean实例,并在必要时挂起或激活某个会话的状态
有状态会话Bean(2) • 以购物网站为例,顾客需要把商品添加到购物篮中,每次往购物篮中添加新商品,都会触发新的请求操作,Bean必须保留用户的状态 • 但是,如果客户长时间没有进行下一步动作,EJB容器为了节省资源,将调用Bean实例的回调方法,释放该实例占有的资源,将状态序列化,然后挂起到永久存储源上。需要时再反序列化并激活状态
有状态会话Bean生命周期 Bean实例不存在 超时 • 实例化新的实例 • 注入上下文(可选) • 初始化(可选) 达到实例池上限或客户要求 调用PrePassivate(可选) 挂起 客户调用业务方法 调用PostActivate(可选) 就绪态
消息驱动Bean(1) • 实现某种类型的消息监听接口 • 不存在远程或本地业务接口,客户不能直接与其交互,只能借助消息提供者(例如JMS=Java Message Service)的API • 无状态 • 单线程,单个实例仅能处理单个消息 • 支持异步消息通信和持久化订阅(即使发布消息时订阅者不处于运行态,也能够收到消息)
消息驱动Bean(2) • 用户调用基于JMS的消息驱动Bean EJB服务器 发送消息 消息驱动Bean实例池 JMS 目的地 客户 Bean实例
消息驱动Bean生命周期 1. 实例化新的实例 Bean实例不存在 就绪态 5. 执行PreDestroy回调(可选) 2. 根据部署描述符注入实例上下文依赖(可选) 3. 执行PostConstruct回调,进行初始化(可选) 容器调用onMessage()
实体Bean • 用于建模业务数据,是缓存数据库信息的Java对象 • 实体Bean包含用于访问数据的代码,容器自动生成数据访问调用 • 持久化对象,即使应用程序结束依然存在 • 允许多客户端同时访问,需结合事务处理使用 • 可重用性高
实体Bean生命周期 不存在 setEntiryContext() unsetEntityContext() 实例池 ejbAcivate() ejbPassivate() Remove() 就绪态
远程/本地业务接口 • Bean提供给客户的调用接口,使得客户可以针对接口编程 • 会话Bean必须提供,实体Bean可选,消息驱动Bean不能直接同客户交互 • 可以单独实现或者根据注释自动生成。如果自动生成,Bean所有的公共方法都将包含在内 • 彻底消除了Home接口、对象接口和组件接口,简化开发
标准部署描述符 • 请求容器厂商所提供的标准容器服务(隐式中间件服务,如事务、安全性、并发等)的XML文档 • 1.0和2.x中必不可少,3.0定义了部署元数据(注释)来替代部署描述符,部署工作可以用Java元数据来完成 • 但是,EJB3.0仍然保留部署描述符,当部署描述符和元数据冲突的时候,部署描述符会覆盖元数据的配置信息
容器厂商专有文件 • 请求EJB容器厂商所提供的增值服务(如负载均衡、群集等)的部署描述符或元数据 • 部署描述符或元数据的格式、命名都依赖于容器厂商
EJB 3.0编程模型 • 编写业务接口代码、Bean类 • 提供部署描述符 • 创建EJB-Jar文件并部署到容器中 • 测试代码
本地客户 隐式中间件服务 3. 调用业务逻辑前调用中间件服务 6. 从方法调用中返回 1. 调用方法 本地客户视图 EJB容器生成的包裹类 4. 调用Bean类中对应的业务方法 5. 调用业务逻辑后调用中间件服务 业务接口 EJBBean类 2. 调用包裹类中相应的方法
测试EJB • 代码测试:测试特定代码,确保代码行为同预想一致。可通过单元测试实现。 • 回归测试:修改旧的代码后,重新测试确保没有引入新的错误或导致其他代码出错 • 功能测试:即黑盒测试,测试软件功能 • 负载测试:测试数据在超负荷环境下运行,程序是否能够承担
EJB常用单元测试框架 • JUnit框架 扩展JUnit提供的基类来完成测试代码 • Mock对象框架 Mock对象模拟真实对象的外在行为来替代接口或类,通过观察其他对象同Mock对象的交互,来比较调用结果和预期结果。