ejb开发手册内容摘要:

定 Entity Bean 是否被其他 Entity Bean 所关联,例如,表示账户的 Entity Bean 与表示在账户上发生的历史操作之间,账户知道自己发生的所有历史纪录,可以从账户定位相关的历史纪录的集合,可以称为表示历史纪录的 Bean 被表示账户的 Bean 所关联,因此,表示账户历史纪录的 Bean 必须提供可本地访问的接口类型,即提供本地接口与 本地 Home 接口。 如账户与账户历史纪录之间存在双向的关系,即可从表示历史纪录的 Bean 定位到表示账户的 Bean,则表示账户的 Bean 也必须提供可本地访问的接口类型。 因为本地访问的关系,参与同一个容器管理关系的 Entity Bean,必须被打包到同一个 EJB JAR 文件中。 本地访问的最大好处是效率上的提高,因为,通常本地访问要快于远程访问。 . 方法参数和返回值 组件接口类型影响组件方法被客户端调用时的参数传递方式。 远程调用中的参数是按值传递的,传递的是对象的拷贝,但本地调用中参数的传递则是 按引用传递的,与 Java 编程语言中的正常的方法调用相同。 远程调用中,客户端与组件相对比较独立。 因为客户端与组件操作不同的参数对象拷贝,任何一方对数据的修改,不会影响另一方的数据。 在本地调用中,客户端和组件修改的是同一个对象。 在编写 Enterprise Bean 时,应避免使用由这种传递方式带来的副作用,因为,当应用规模增长,客户端被分布到不同的物理服务器,参数的传递方式亦随之改变。 . 远程还是本地 决定一个组件应该提供远程访问还是本地访问,一般有以下一些因素。  容器管理关系 如果某 Entity Bean被其他 Entity Bean 所关联,则此 Entity Bean必须提供本地访问接口。  相关 Bean 之间的耦合程度 耦合程度高的 Bean 之间存在互相依存的关系。 因此,这一类 Bean一般需要提供本地访问接口,以形成一个逻辑上的单元,同时提供整个单元内交互的效率。  客户端类型 如 Bean 将被 Java EE 应用客户端所访问,则应该提供远程访问接口。 如果客户端是 Web 组件或其他 Bean,提供何种类型的访问接口决定于这些组件的分布状况。  组件分布 Java EE 应用可以分布在多个计算机,为提供这种分布上 的可伸缩性,将被分布到不同位置的组件所访问的 Bean,应该提供远程访问接口。 尽管一般 Bean 只提供一种类型的客户访问接口,但事实上,有一些 Bean 仍需要同时提供两种类型的接口。 . 执行效率与组件接口类型 因为网络延迟等因素,本地访问通常要快于远程访问;另一方面,在不同的服务器上分布应用,可以提高应用的整体运行效率。 而且,不同的操作环境中,执行效率也会有不同。 因此,设计应用时应考虑执行效率的影响。 . Enterprise Bean 的内容 一个合法的金蝶 Apusic 应用服务器 的 EJB,应包含如下几个部分:  部署描述:定义 Bean 部署信息,如包含持久类型、事务属性等信息的 XML 文件。 通常通过使用图形化的部署工具生成。 对于 Apusic 应用服务器,部署描述文件包括一个 EJB规范中规定的 文件和一个 Apusic规定的。 在 , 中的部署描述信息可通过注解在源代码中进行标记。  组件接口:在 提供远程客户访问能力的 Bean 必须提供远程接口文件和远程 Home 接口文件;提供本地客户访问能力的 Bean 必须提供本地接口文件和本地 Home 接口文件(不包含 Messagedriven Bean)。  组件类:组件接口中定义的方法,在此类文件中提供实现。 将以上文件打包成为 EJB JAR 文件之后,形成一个 EJB 模块,可连同其他模块装配到不同的表示 Java EE 应用的 EAR 文件中。 . EJB 组件模型的灵活性 EJB 组件模型的灵活性表现在 :  EJB 可作为表示无状态服务的对象;  EJB 可作为表示无状态服务的对象,可通过向指定的消息队列或主题发送 JMS 消息,以实现对此对象的异步调用;  EJB 可作 为表示与特定客户的会话对象。 此类对象在客户进行跨越方法的调用时,自动维持会话状态;  EJB 可作为表示业务对象的实体对象,在多个客户间共享;  EJB 可作为一个细粒度的持久对象,包含在一个粗粒度业务对象的持久状态中。 通常,被远程访问的组件往往是粗粒度的业务对象,如订单、雇员纪录;细粒度的业务对象往往不会采用可远程访问的 EJB 组件模型,如订单中的采购项、雇员纪录中的地址,而是采用可本地访问的 EJB 组件模型或是作为 EJB 的附属类出现。 . 何时使用 EJB 组件 下面是在使用 EJB组件模型构建企业应用 时,一些判断 EJB 组件模型是否适用的标准。  EJB 组件是构建分布式企业应用的组件模型技术; EJB 组件规范是针对分布式企业应用制定的,是基于分布式对象技术的 Java 组件; EJB 组件不涉及表示层的内容,因此,必须与其他表示层技术一起使用;应用服务器提供了可以解决安全性、资源共享、持续运行、并行处理、事务完整性等复杂问题的服务,从而简化了商业应用系统。  应用客户端类型的考虑; 一般,企业应用开发都会有多种类型的客户端的需求,访问相同的数据或业务逻辑。 如使用 Web 客户提供对应用的基于 Inter 的访问,使用应用客户端提应用基于 Intra 的访问。 EJB组件模型将业务逻辑与数据封装到 EJB 组件中,提供对多种客户端的支持。  应用数据与业务逻辑的并发访问控制的考虑; 企业应用通常需要提供数据或业务逻辑的并发访问能力,以此保证数据的完整性,由于 EJB 组件控制对后台数据的访问,并管理当前事务和数据库的内部锁定。 节省了编写数据库控制逻辑的工作量,同时也保证了数据的一致性与正确性,从而降低了总编程量。  全局事务控制的考虑; 企业应用通常需要对不同的资源进行事务性的操作,如某个操作需要对数据库进行访问,同时可能需 要通过 JMS 消息服务发送消息,或者,需要访问两个位于不同物理位置的异种数据库,这些操作必须在相同的事务环境中完成。 Apusic 应用服务器提供了全局事务控制,使得对数据库的操作和对消息服务的操作可以加入到一个事务环境中,而这个特性对开发者而言是透明的,由应用服务器内部的事务管理器对事务环境中的操作进行管理。  基于访问控制的考虑; 企业应用中往往需要对某些资源进行访问控制,如需要针对不同用户对组件方法调用设置访问控制策略,对访问特定 Web 资源的用户设置访问控制策略等, Apusic 应用服务器提供了基于用户和组 的身份鉴定和授权机制,可以通过部署描述和图形工具实现对 Web 资源的访问控制和对 EJB组件的方法级别的访问控制。  基于伸缩性的考虑; 企业应用的用户规模往往成为影响企业应用开发难度的主要因素,随着企业经营规模的扩大,用户规模也会随之增长, Apusic 应用服务器提供了负载均衡与实效恢复的能力,可以在降低开发难度的情况下,通过增加服务器节点即可适应应用规模的快速增长。  基于重用性的考虑; 企业应用往往涉及很多重复的业务逻辑和数据模型,使用 EJB 组件模型,可以通过修改部署描述文件在不同的应用中方便地重用这些组件。 . 会话 Bean 摘要 本节将描述 Session Bean 的基本原理;开发过程中涉及的普遍过程;组件模型组成部分的开发规则及注意事项。 . 会话 Bean . 容器与会话 Bean 容器是为 EJB 组件提供运行时环境的系统。 同一容器中可以部署多个 EJB 组件。 容器提供客户端通过 JNDI对已部署组件进行依赖注入( )或访问 Home 接口( )的能力,即客户端可请求容器注入会话 Bean 远程接口或通过 JNDI 查找指定 EJB 组件的 Home 接口。 客户端不能直接访问 EJB 组 件的实例,只能通过 JNDI 查找指定组件的 Remote接口,通过 Remote 接口取得对组件接口的引用。 客户端对组件接口的方法调用,通过组件接口传播到容器中对应的 EJB 组件实例。 下图表示 EJB 组件及其接口与容器、客户端间的关系: EJB 组件及其接口与容器、客户端间的关系 . 会话 Bean 的会话状态 容器为会话 Bean 提供运行时环境,并对会话 Bean 实例进行管理,因此,会话Bean 实例的状态也由容器进行维护。 根据状态管理模式,可以将会话 Bean 划分为有状态( Stateful)会话 Bean 和无状 态( Stateless)会话 Bean,有状态会话 Bean的状态由容器负责维护,而无状态会话 Bean 则不需要容器进行状态管理。 . 有状态 Session Bean 实例的钝化与激活 对于当前容器中存在的有状态会话 Bean 实例,为提供更有效的管理,容器需要将某些空闲的实例状态从内存临时转移到存储机制中。 这种转移称为实例的钝化( Passivation),相反地,将实例状态从存储机制恢复,则称为激活。 ( Activation)。 当实例被包含于某个事务中时,容器不能对实例进行钝化操作。 . 会话状态 有状态会话 Bean 的会话状态指会话 Bean 实例中的域值,连同实例中的域通过Java 对象引用指向的对象的传递闭包( transitive closure)。 注意 对象的传递闭包按照 Java 编程语言中的串行化协议定义,即是通过串行化对象实例,对实例的域进行保存。 参考 Sun 的 对象串行化文档。 某些情况下,会 话对象的会话状态可能会包含打开的资源,如网络端口和数据库连接等。 当会话对象被钝化时,容器不能钝化这些资源,因此,需要开发者在容器对实例发出钝化事件通知时(容器调用实例中注解为 PrePassivate 的方法 ()或ejbPassivate 方法),对上述资源进行关闭;在容器对实例发出激活事件通知时(容器调用实例中注解为 PostActivate 的方法或 ejbActivate 方法),重新打开上述资源。 因此在编写有状态的 Session Bean时,开发者必须注意,保证实例的非 transient域是下列类型 之一,使容器可以在钝化实例时,可以完整保存对象的会话状态:  可串行化的对象;  null 值;  EJB 的业务接口引用;  EJB 的远程接口引用,即使 stub class 为非序列化亦可  EJB 的远程 Home 接口引用,即使 stub class 为非序列化亦可;  Entity Bean 的本地接口引用,即使其为非序列化亦可;  EJB 的本地 Home 接口引用,即使其为非序列化亦可;  对 SessionContext 对象的引用,即使其为非序列化亦可;  环境命名上下文(指 “java:p/env”JNDI上下文)及其任何子上下文 ;  UserTransaction 的引用;  Resource manager 连接工厂的引用;  对容器管理的 EntityManager 对象的引用,即使其为非序列化亦可;  通过依赖注入或 JNDI 查找获得的 EntityManagerFactory 引用,即使其为非序列化亦可;  对 对象的引用  不可直接串行化的对象,但是通过在串行化对象期间,将对象的引用更改为对象的业务接口, Home 接口和组件接口的引用、对象对SessionContext 对象的引用、对象对 “java:p/env”JNDI 上下文及其子上下文的引用、对象对 UserTransaction 接口的引用、对象对EntityManager 与 EntityManagerFactory 的引用进行串行化,可将对象视为可串行化的对象。 . 事务操作与状态域 会话 Bean的会话状态是非事务性的。 如对象在参与的事务中改变了状态,之后事务回滚,对象是不能自动回到参加事务前的状态的。 因此,在不能保证会话 Bean的会话状态与事务状态不一致的情况下,可以通过实现 SessionSynchronization 接口,在 afterCompletion 方法发出的通知中,根据事务提交的情况,决定是否重新设置对象的会话状态。 . 组件模型单元 对于会话 Bean,其组件模型包含以下几部分:  Home 接口,定义客户端创建、清除 EJB 实例的方法; (注:在 组件模型中并不需要此接口)  组件接口( ponent interface),定义客户端可访问的组件的业务方法,在 组件模型中称为业务接口 (business interface);  组件类,提供对定义在组件接口中的方法的实现;  部署描述,包含此 EJB 的部署信息,如事务属性等, 在 中可使用注解来描述部署信息。 下面分别对开发这些单元时,涉及的普遍过程、规则及注意事项进行描述。 . Home 接口 规范通过 Home 接口定义客户端创建、清除 EJB对象的方法。 Home 接口有两种类型,本地 Home 接口和远程 Home 接口,分别提供给本地和远程客户端使用。 在 中,可通过依赖注入, JNDI 查找,可选的生命周期回调。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。