主题
企业架构
Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成
页面: 1, 2, 3, 4
现在,让我们来看看这两个系统之间的协作。
为了比较和对照 Java EE 和 Spring 开发方法的差别,我们使用 Spring 2.0 Framework 重新编写了 MedRec 示例程序,充分利用了 Spring 2.0 的许多创新特性。在下一节,我们将简要介绍 MedRec 的总体体系结构,然后依次了解它的 Java EE 形式和 Spring 形式。
Avitek Medical Records(或 MedRec)是一个 WebLogic Server 示例程序套件,简明演示了 Java EE 平台的各个方面。MedRec 旨在作为各层次 Java EE 开发人员的一个培训工具。它显示了每个 Java EE 组件的使用方法,阐明了适于组件交互和客户端开发的设计模式。MedRec 还阐释了使用 WebLogic Server 开发和部署应用程序的最佳实践。
MedRec 背后的真实概念是一个框架,其中患者、医生、管理人员使用各种不同的客户端管理患者数据。对于患者,MedRec 提供基于 Web 的应用程序,供他们查看自己的医疗记录和维护档案文件。MedRec 为管理人员提供基于 Web 的应用程序,用于管理入院登记、医疗记录上载和常规应用程序监视。MedRec 还提供与独立医疗机构接合的资源。为了演示这个通信系统,MedRec 包括一个医生应用程序,用于向 MedRec 系统请求和提供数据。
Java EE 和 WebLogic Server 版的 MedRec 的设计和实现采用传统的三层体系结构模型,分为相互独立的客户端、服务器和数据存储三个部分:
表示层:该层负责所有用户交互;有时也称作客户端层。
服务层:该层是封装了应用程序业务逻辑的中间层。服务层处理来自异构客户端的请求,同时与各种后端系统进行交互,包括数据存储。该层有时也称作服务器层。
企业信息系统 (EIS) 层:该层表示那些提供和/或存储原有应用程序和数据库之类数据的系统。EIS 层有时也称作数据存储。
我们为 MedRec 的患者和管理部门程序开发了 Web 应用程序 (webapp) 以公开针对各自用户的服务。webapp 遵循模型-视图-控制器模式,Java Server Pages 将视图呈现给用户,模型封装要呈现给用户和从用户处捕获的数据,而控制器机制则管理除与服务层交互之外的组件交互。MedRec 采用 Jakarta Struts 实现该模式。
服务层为发出请求的客户端提供服务,并管理与后端应用程序和资源的交互。 MedRec 的服务层采用会话外观模式封装业务逻辑和业务数据。会话外观通过提供一个到分布式服务的接口,简化了应用程序的复杂性。在 MedRec 中,会话外观的首要责任是提供数据吞吐量。在 MedRec 的 Java EE 和 WebLogic Server 版本中,会话外观被开发为无状态的会话企业 JavaBeans,而数据则由实体企业 JavaBeans 管理。
为了与外部实体接合,MedRec 通过 Web 服务公开应用程序功能,从而允许在不同系统之间使用一系列开放标准进行动态交互。通过 Web 服务公开服务,MedRec 可以为独立的各方提供数据或接收来自各方的数据,这样就实现了集中式医疗记录管理的主要目标。
图 1 阐释了 Java EE 和 WebLogic 版 MedRec 的高级体系结构图。
图 1:J2EE 版 MedRec 的体系结构图
为了使 Spring 能够利用 WebLogic Server 的企业特性,对 MedRec 的体系结构进行了重新设计,用相应的 Spring 组件替换了核心的 Java EE 组件。我们用基于 Spring 的 MedRec 版本 (MedRec-Spring) 复制了与原版 MedRec 相同的功能。
控制反转
MedRec-Spring 最显著的变化是引入了 Spring IoC。IoC 方法功能强大,通过一个容器将相关性注入到配置好的组件中而应用。 IoC 将应用程序代码与其配置相分离。例如,对象与其相关性无关,因此可以专注于其职责。在 MedRec-Spring 案例中,诸如数据源、JMS 服务、MBean 连接和对等服务等企业资源在运行时被提供给 MedRec-Spring 的对象。另外,通过迁移资源配置和在已编译代码外进行引用,应用程序从特定于开发的资源向中间的生产资源和环境的转移更加易于管理。
我们发现,要正确使用 IoC,应用程序代码需要遵循更严格的 Java 编程规则 — 特别是在编写接口的代码时。接口比其他东西更能促进更好的协作,因为可以减轻依赖性,而且实现的变化被隔离开来。 从 IoC 的角度看,接口支持相关性注入的可插入本性。为了利用 IoC,我们对 MedRec-Spring 进行了重构,这样就可以基于接口对业务对象进行编码。
POJO
在 MedRec-Spring 中,传统 Java 对象 (POJO) 代替了无状态会话 EJB。无状态会话 EJB 的强大在于它们的远程控制和事务管理功能。 因为 MedRec-Spring 通过 Spring 的 HTTP Invoker 体系结构公开了服务 bean,所以它能够满足远程控制的要求。 事务管理是由 Spring 的事务抽象层提供的。MedRec-Spring 的事务管理精确地镜像了 MedRec 的事务管理,因为 Spring 事务管理器配置为将责任委托给 WebLogic Server 的 JTA 事务管理器。
消息处理
MedRec-Spring 包含原始 MedRec 的大多数消息处理功能。我们采用 Spring 的 JMS 程序包简化了一些一般性任务,如连接工厂和目标查找。Spring 提供了一个代表消息目标的对象,而不是通过程序获取队列句柄。与所有 Spring bean 一样,这些对象表示(JNDI 名称、连接工厂关联等)是在已编译代码的外部配置的。 我们还在三个领域使用了 Spring 2.0 的消息驱动的 POJO (MDP) 作为 JMS 消息的目标:
AOP
MedRec-Spring 使用 Spring AOP 主要有两个目的:
JPA
MedRec-Spring 现在使用 JPA 访问和写入患者记录。有关更多详细信息,请参见“结合使用 JAVA 持久性 API 和 SPRING 2.0”。
应用程序管理
MedRec-Spring 包含应用程序管理特性。这些特性与 WebLogic Server 的域配置以及运行时域交互。MedRec-Spring 必须按照 WebLogic Server 的 MBean Server 形式,Spring 提供了连接管理,简化了 MBean Server 的可访问性。
Web 服务
最后,MedRec-Spring 使用 Web 服务导出它的服务。 Spring 提供一个 JAX-RPC 工厂用于生成 Web 服务的代理。与其他 Spring bean 类似,工厂 bean 也是在已编译的代码外部配置的,使得应用程序更加灵活。
图 2 显示基于 Spring 的 MedRec 版本的高级体系结构图。
图 2:基于 Spring 的 MedRec 版本的高级体系结构图
比较了 Java EE 和 Spring 环境上的 MedRec 体系结构之后,现在我们来介绍在实现 MedRec-Spring 应用程序过程中发现的一些宝贵经验:
使用延迟初始化。为了实现 IoC 容器,Spring 加载一个 应用程序上下文 文件,创建并缓存每个已配置的 bean 实例。Spring bean 引用的每个资源都必须可以实例化或查找,了解这一点很重要。例如,Spring 的 JMX 支持提供到 WebLogic Server 的 MBean 服务器的连接。部署期间,并非所有 MBean 服务器都是激活的,因此在部署资源时,用户应该一启动即使用 Spring 延迟初始化和查找服务。
基于功能分离出 Spring 配置。 这允许应用程序组件仅加载那些与自身工作职责相关的上下文。该实践还允许测试人员用一个特定于测试环境的上下文替换一个应用程序上下文(例如,数据源配置),从而改变其行为。
通过 JndiObjectFactoryBean 封装 JDBC 数据源连接池 。则那些要求数据库交互的 bean 可以引用该 bean,以利用 WebLogic Server 的数据源连接池功能。
将 Spring 的 org.springframework.ejb.support 用于会话和消息驱动的企业 JavaBeans 。Spring 的 org.springframework.ejb.support 提供企业 JavaBeans (EJB) 可以扩展的抽象类。这些抽象的 EJB 类通过包含 EJB 生命周期方法的标准实现来辅助开发。更重要的是,这些类提供了加载 Spring 应用程序上下文的机制,包括跨多个 EJB 和客户端共享上下文,因此在 EJB 初始化时减少了重复和开销。
利用热部署和 WebLogic Server 的拆分开发目录环境。 这极大地提升了集成测试期间的 Spring 开发体验。热部署允许应用程序重新加载,而无需重新启动服务器。拆分开发目录环境减少了不必要的文件复制,加快了开发和部署。拆分开发目录 Ant 任务帮助您快速地重新编译和重新部署应用程序,无需先生成一个可部署的存档文件或展开的存档目录。
将 Spring 库打包为应用程序库、可选的扩展或服务器扩展。这允许几个 Spring 应用程序共享 Spring Framework,减少了应用程序所占空间。不仅减少了内存占用,而且还提高了部署次数。
为帮助您从部署在 WebLogic Server 上的 Spring 应用程序得到最大收获,我们已经发布了一个经过认证的 BEA 发行版,包括 Spring 2.0、MedRec on Spring 应用程序和其他一些不错的工具。可以从 BEA 的发行版 Web 站点上免费下载此工具包。