Aspect-oriented programming with AspectJ

2020-11-05 17:49:16 浏览数 (1)

这篇文章主要是介绍一个完整的AOP系统的基本概念。 研究了AspectJ语言的规范和实现,并且展示了一个常见的横切问题来说明AspectJ的语法,并将它与Java进行了比较。

Introduction

  • AOP系统包含的基本概念: joinPoint(连接点):目标对象,所有可以增强的方法。 PointCut(切入点):目标对象,将要和已经增强的方法。 Advice(通知/增强):增强代码。 Static crosscutting(静态横切):用于改变系统静态结构的构造 Aspect(切面):切入点 通知。

AspectJ as an AOP system

  • AspectJ实现由以下部分组成 1.编译器(agc) (通常称为编织器。这个名称的起源是因为它的主要作用是将AspectJ扩展编织到Java代码中,也就是将切面编织到类中并生成最终的可执行代码) 2.调试器(ajdb) 3.文档生成器(ajdoc) 4.程序结构浏览器(ajbrowser) 5.与Eclipse、Sun-ONE/Netbeans、GNU Emacs/XEmacs、JBuilder和Ant的集成。
  • AOP三种织入切面的方式: 1.编译期织入。这要求使用特殊的Java编译器,AspectJ是其中的代表者; 2.类装载期织入。而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者; 3.动态代理织入。在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。

AOP with AspectJ

这一节通过具体代码的举例,来说明AOP能够解决一些传统设计模式解决不了的问题。(代码实现见论文)

  • 例1:利用AOP实现缓存 缓存是一个典型的横切关注点。在传统的面向对象编程中,缓存关注点与主要关注点不能完全隔离开。虽然可以利用设计模式(如代理和装饰器)来在一定程度上解决这个问题,但不能完全消除它。AOP为这类问题提供了一个完整而优雅的解决方案。 如果用传统的面向对象编程,缓存逻辑将分散在文件系统实现的所有方法中。如果需要更改实现,缓存代码也必须在新的实现中出现。即使使用了装饰器设计模式,仍然需要进行一些更改。而如果使用面向切面的方法,缓存逻辑仅驻留在切面中,这本质上意味着文件系统缓存是一个完全独立的模块,对文件系统实现和/或缓存的修改可以独立完成。因此,文件系统和缓存的代码变得更简单,更容易维护。
  • 例2:利用AOP实现程序跟踪,使得跟踪与系统完全分离,并且切面本身可重用。 跟踪是一种获取程序中执行的所有记录的技术。传统上,跟踪是通过在方法开头和结尾添加日志来完成,把对日志记录器的调用添加到系统中的每个方法中,极大地增加了代码的分散,使得代码维护困难。 利用AspectJ之后,跟踪方面中的切入点获得系统中每个公共方法的执行,并在每次执行之前和之后编织对日志程序的调用。在每个通知中都可以访问thisJoinPointStaticPart引用。它引用当前连接点的静态部分,可用于访问诸如连接点签名之类的有用信息。

AspectJ tooling support

  • Eclipse 的 AspectJ Development Tools (AJDT)
  • Ant AspectJ编译器与Ant集成在一起,可以在任何Ant构建项目中运行。

Conclusion

讲了下AspectJ的发展前景很好(2012年)。一个很好的例子是Spring框架,它特别允许AOP和AspectJ代码与框架无缝集成和使用。在学术领域,AspectJ也经常用于软件设计的优化。

0 人点赞