Spring 框架简介Spring AOP 和 IOC 容器入门 |
2005 年 8 月 18 日 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级的、强壮的 J2EE 应用程序。developerWorks 的定期投稿人 Naveen Balani 通过介绍 Spring 框架开始了他由三部分组成的 Spring 系列,其中还将介绍 Spring 面向方面的编程(AOP)和控制反转(IOC)容器。 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 在这篇由三部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的角度描述该框架的功能,然后将讨论两个最有趣的模块:Spring 面向方面编程(AOP)和控制反转 (IOC) 容器。接着将使用几个示例演示 IOC 容器在典型应用程序用例场景中的应用情况。这些示例还将成为本系列后面部分进行的展开式讨论的基础,在本文的后面部分,将介绍 Spring 框架通过 Spring AOP 实现 AOP 构造的方式。 请参阅 下载,下载 Spring 框架和 Apache Ant,运行本系列的示例应用程序需要它们。 Spring 框架 Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。 图 1. Spring 框架的 7 个模块 组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。 IOC 和 AOP 控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。 在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。
Spring 框架的 IOC 容器采用类型 2 和类型3 实现。 面向方面的编程 面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。 AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。 AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。 IOC 容器 Spring 设计的核心是
bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。 BeanFactory 接口 因为 清单 1. XmlBeanFactory
在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 清单 2. getBean()
每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 IOC 示例 理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:
三个接口 对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。 清单 3. CreditRatingInterface
清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 清单 4. CreditLinkingInterface
信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 清单 5. EmailInterface
Spring 使其保持松散 这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在 清单 6 中可以看到信用卡帐户用例的实现。 注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系 (也就是三个接口)都可以由 Spring 框架用这些 bean 注入。 运行应用程序 要运行示例应用程序,首先必须 下载 Spring 框架 及其所有依赖文件。接下来,将框架释放到(比如说)磁盘 c:/,这会创建 C:/spring-framework-1.2-rc2 (适用于当前发行版本) 这样的文件夹。在继续后面的操作之前,还必须下载和释放 Apache Ant。 接下来,将源代码释放到文件夹,例如 c:/ 盘,然后创建 SpringProject。将 Spring 库(即 C:/spring-framework-1.2-rc2/dist 下的 spring.jar 和 C:/spring-framework-1.2-rc2/lib/jakarta-commons 下的 commons-logging.jar)复制到 SpringProject/lib 文件夹中。完成这些工作之后,就有了必需的构建依赖关系集。 打开命令提示符,将当前目录切换到 SpringProject,在命令提示符中输入以下命令: 这会构建并运行 清单 8. 装入 Spring 配置文件
|
当 Hibernate 遇上 SpringHibernate 事务天生适合 Spring AOP |
级别: 中级
2005 年 9 月 26 日 Naveen Balani 继续他的 Spring 系列,介绍把 Hibernate 事务与 Spring 面向方面编程(AOP)集成的知识。结果是一个可以依靠的持久性框架。 在这个系列的 前一期中,我介绍了 Spring 框架的 7 个模块,包括 Spring AOP 和控制反转(IOC)容器。然后我用一个简单的示例演示了 IOC 模式(由 Spring IOC 容器实现)如何用松散耦合的方式集成分散的系统。 现在,我从我上次结束的地方开始,采用与上次类似的示例,演示 Spring AOP 和 Spring Hibernate 持久性支持的声明性事务处理,所以我首先从对这两项技术的深入研究开始。 下载这篇文章的源代码。请参阅 参考资料 访问 Spring 框架和 Apache Ant,运行这篇文章的示例应用程序需要它们。 Spring AOP 软件系统通常由多个组件构成,每个组件负责一个特定的功能领域。但是,这些组件也经常承担它们的核心功能之外的额外责任。系统服务(例如日志、事务管理和安全性)经常发现自己跑到了别的组件的领域里,而这些组件的核心职责是其他事情。结果就是所谓的“代码纠缠”,或者更简单点儿说“一团糟”。面向方面编程是一种试图解决这个问题的编程技术,它把关注点的隔离提升为核心的编程概念。 使用 AOP 时,仍然是在一个地方定义系统的公共功能,但是可以声明性地定义 如何 和 在哪里 应用这个功能。如果对横切关注点(例如日志和事务管理)进行了模块化,那么不用修改每个单独的类,就可以向代码中添加新特性。这类模块化的关注点称作 方面。 以一个企业应用程序为例。这类应用程序通常要求类似于安全性和事务支持的服务。显然,可以把这些服务的支持直接编写到要求服务的每个类当中,但是更希望能够不必为大量事务性上下文编写同样的事务处理代码。如果使用 Spring AOP 进行事务处理,那么可以声明性地安排适当的方法调用,而不必逐个安排。 Spring AOP 提供了几个方面,可以为 JavaBean 声明事务。例如, Hibernate Spring 框架提供了对 Hibernate、JDO 和 iBATIS SQL Maps 的集成支持。Spring 对 Hibernate 的支持是第一级的,整合了许多 IOC 的方便特性,解决了许多典型的 Hibernate 集成问题。框架对 Hibernate 的支持符合 Spring 通用的事务和数据访问对象(DAO)异常层次结构。 Spring 为使用选择的 OR 映射层来创建数据访问应用程序提供了支持。因为所有东西都设计成一组可重用 JavaBean,所以不管选择什么技术,都能以库的格式访问大多数 Spring 的 OR 映射支持。 Hibernate 是 Java 平台上一个功能全面的、开源的 OR 映射框架。Hibernate 支持开发符合常规 Java 理念的持久性类 —— 包括关联、继承、多态、复合以及 Java 集合框架。Hibernate 查询语言(HQL)被设计成 SQL 的一个微型面向对象扩展,它是对象和关系世界之间的桥梁。Hibernate 也支持用原始 SQL 或基于 Java 的标准和示例查询表达查询。Hibernate 使用 XML(*.hbm.xml) 文件把 Java 类映射到表,把 JavaBean 属性映射到数据库表。 通过 JDBC 技术,支持所有的 SQL 数据库管理系统。Hibernate 与所有流行的 J2EE 应用程序服务器和 Web 容器都很好地集成。 实际示例 一个银行应用程序示例可以让您自己看到 Spring AOP 和 Hibernate 一起工作有多么好。银行帐户用例允许用户 ( 应用程序数据库(Cloudscape™)容纳所有客户和帐户信息。在这个例子中,假设在 由于用户必须可以在一个事务中申请多个帐户,所以首先要为数据库交互实现一个 DOA 模式。然后要设置 Spring AOP 的 Hibernate 实践 在 Spring 框架中,像 JDBC 清单 1. JDBC DataSource 和 HibernateSessionFactory 连接
清单 1 显示了如何为示例应用程序数据库(是 Cloudscape)配置数据源 bean ( 数据源和会话工厂设置好之后,下一步就是在 DAO 中连接,在 在 清单 2 的这个示例中, 应用程序的连接完成之后,现在来进一步查看源代码。 分析这个! 如果以前没这么做过,那么请 下载这篇文章的源代码。把源 zip 文件释放到计算机中的任何位置上,例如 c:/。会创建一个叫作 SpringProjectPart2 的文件夹。src/spring 文件夹包含示例应用程序的 Hibernate 映射文件和 Spring 配置文件。src/springexample/hibernate 文件包含应用程序的源代码。 在这里会发现两个类,即 清单 3. Customer 对象的 Hibernate 映射文件
清单 4. DAO 实现
所有这些都应当很容易掌握。现在来看代码的实际应用! 运行应用程序 要运行示例应用程序,必须首先 下载 Spring 框架 和它的全部依赖文件。接下来,释放框架到某一位置(比如 c:/ ),这会创建文件夹 C:/spring-framework-1.2-rc2(针对当前发行版)。在继续之前还必须下载和释放 Apache Ant 和 Cloudscape。下载 Cloudscape 之后,把它释放到 c:/ ,这会创建文件夹 C:/Cloudscape_10.0。 接下来,释放源代码到 c:/ ,这会创建 SpringProject2 文件夹。接下来修改 build.xml 文件的入口,用实际安装 Spring 的位置代替 C:/spring-framework-1.2-rc2,用实际安装 Cloudscape 的位置代替 C:/Program Files/IBM/Cloudscape_10.0。 打开命令行提示符,进入 SpringProject 目录,在命令行提示符下输入以下命令: 这会构建并运行 然后 结束语 在三部分的 Spring 系列 的第 2 部分中,我介绍了如何集成 Spring Hibernate 和 Spring AOP。结果是一个强健的持久性框架,支持声明性的实现事务。 在这个系列的下一篇,也是最后一篇文章中,我将介绍 Spring 的 MVC 模块,介绍如何用它来简化基于 Web 的应用程序的创建。 下载
参考资料 学习
获得产品和技术
讨论
|