处理复杂和不熟悉 Java 代码的技术
级别:中级
Abhijit Belapurkar(abhijit_belapurkar@infosys.com)
高级技术架构师,Infosys Technologies Limited
2004 年 3 月
假如您曾经接管并且必须维护某个基于 Java 的应用程序,那么本文就是为您预备的。作者 Abhijit Belapurkar 将向您展示如何使用面向方面编程(ASPect-oriented programming,AOP)来对即使最不透明的遗留应用程序获得前所未有的见解。
软件系统通常从一组有限的得到良好理解的需求开始。然而,随着大多数成功系统的演进,它们承担起越来越多的需求,体现在无数的功能和非功能性方面。在一个企业环境中,您最终很轻易向这个混乱的模块组合添加许多第三方库和框架,它们全都彼此交互,并在系统日常工作的表面之下相互配合。实际上,用不了多少年,最初具有很简单、可治理的需求集的系统就会变成庞然大物:难于控制和笨拙的代码。
于是步入这种环境的 Java 开发人员就有了一个日常维护和改进的新任务。假如您就是这个开发人员,那么您的第一个任务就是深刻理解该系统的结构。理解结构将是增强系统和诊断不可避免会发生的问题的要害。当然,第一次探究任何未知的系统都是说起来轻易做起来难。在某些情况下,您能够咨询原先的开发人员,而在其他情况下却不能。但是即使能够找到原先的开发团队,有些系统也会因为太过庞大,而无法在没有机械帮助下熟悉和理解它。
虽然有许多可用的工具能够帮助您理解复杂的程序(请参阅 参考资料),但是大多数工具都很昂贵、学习起来很耗时间,并且功能范围有限(也就是说,假如该工具无法满足需要,您将求助无门)。在本文中,我将建议一种替代的方法。面向方面编程是成熟的编程范型,它可以应用于广泛的编程场景,包括遗留应用程序的理解和维护。
请注重,本文假设您大致熟悉 ASPectJ 之下的 AOP,非凡是 ASPectJ 的静态和动态横切技术。虽然我将在下一节提供关于 AOP 横切的简要概述,但是您应该参考 参考资料,获取更多信息。
总体概述
基于 Java 的 AOP 使用了灵活而丰富的表达语言,您可以使用它以近乎无限种方式来分解复杂的应用程序。基于 Java 的 AOP 的语法类似于 Java 语言,您应该很轻易就会把握它。一旦把握,AOP 就是一种具有许多应用的编程技术。除了理解遗留系统内部细节外,您还可以使用 AOP 来非强制性地重构和增强这样的系统。虽然本文将完全使用 ASPectJ,不过这里讨论的大多数技术都可移植到其他流行的基于 Java 的 AOP 实现,比如 ASPectWerkz 和 JBossAOP(请参阅 参考资料)。
关于横切
任何应用程序都由多个功能性和系统性关注点(concern)组成。功能性 关注点与应用程序的日常使用相关,而 系统性 关注点则与系统的整体健康和维护相关。例如,一个银行应用程序的功能性关注点包括账户维护和答应借/贷操作,它的系统性关注点包括安全、事务、性能和审计日志记录。即使使用最好的编程方法学来开发应用程序,您最终也会发现它的功能性和系统性关注点会以跨越多个应用程序模块的形式相互混杂在一起。
横切 是一种 AOP 技术,用于确保独立的关注点保持模块化,同时仍然足够灵活地在整个应用程序中的不同点应用。横切包括静态和动态两种类别。动态横切 体现为通过在感爱好的特定点织入(weave in)新的行为来改变对象的执行行为。静态横切 答应我们通过注入(inject in)附加的方法和/或属性来直接改变对象的结构。
静态横切的语法与动态横切很不相同。以下术语适用于动态横切:
连接点(join point)是 Java 程序中的某个特定执行点,比如某个类中的一个方法。
切入点(pointcut)是特定于语言的结构,它表示或捕捉某个特定的连接点。
通知(advice)是在到达某个特定的切入点时要执行的一段代码(通常是一个横切功能)。
方面(ASPect)是定义切入点和通知以及它们之间的映射的一个结构。方面由 AOP 编译器用来在现有对象中的特定执行点织入附加功能。
本文中的所有代码演示都将利用动态横切。请参阅 参考资料,获得关于静态横切的更多信息。
ASPectJ 之下的 AOP
为了学习本文中的例子,您应该熟悉以下特定于 ASPectJ 之下的 AOP 的特性。
ASPectJ 提供一个名为 ajc 的编译器/字节代码织入器,它编译 ASPectJ 和 Java 语言文件。ajc 根据需要将方面交织在一起,以产生与任何 Java 虚拟机(1.1 或更高版本)相容的 .class 文件。
ASPectJ 支持如下这样的方面,即这些方面规定某个特定的连接点应该永远不会到达。假如 ajc 进程判定出情况不是这样,它将发出一个编译时警告或错误(具体取决于该方面)。
应用程序和系统分析
在下面几节中,您将学习两种使用 AOP 的不同的应用程序和系统分析机制。第一种机制我称之为 静态分析,它要求您做以下事情: