跳到主要内容

Spring AOP

简介

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在将应用程序中的各种功能分离出来,以提高代码的可重用性和可维护性。AOP 通过将交叉业务逻辑封装到切面中,可以在不修改原有代码的情况下对其进行扩展和维护。

AOP 的存在价值

在传统 OOP 编程里以对象为核心,整个软件系统由系列相互依赖的对象所组成,而这些对象将被抽象成一个一个的类,并允许使用类继承来管理类与类之间一般到特殊的关系。随着软件规模的增大,应用的逐渐升级,慢慢出现了一些 OOP 很难解决的问题。

  • 代码复用性差:由于面向对象的设计思想,导致代码复用性差。比如,在两个类中,有很多相似的代码,如果使用 OOP 思想,需要将相似的代码复制到两个类中,这会导致代码的重复性很高。
  • 代码可维护性差:由于 OOP 思想将代码封装到类中,导致代码的可维护性差。如果需要修改某个功能,需要修改整个类的代码,这会导致代码的维护性很低。
  • 代码可扩展性差:由于 OOP 思想将代码封装到类中,导致代码的可扩展性差。如果需要添加一个新的功能,需要修改整个类的代码,这会导致代码的扩展性很低。

AOP 就是为了解决这些问题而出现的。AOP 可以将交叉业务逻辑封装到切面中,在运行时将切面与业务逻辑编织在一起,从而实现代码的复用、可维护性和可扩展性。

AOP 的分类

AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表;而动态代理则以 Spring AOP 为代表。

其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

Spring AOP 既支持静态代理也支持动态代理。

总结

AOP 广泛应用于处理一些具有横切性质的系统级服务,AOP 的出现是对 OOP 的良好补充,它使得开发者能用更优雅的方式处理具有横切性质的服务。不管是那种 AOP 实现,不论是 AspectJ、还是 Spring AOP,它们都需要动态地生成一个 AOP 代理类,区别只是生成 AOP 代理类的时机不同:AspectJ 采用编译时生成 AOP 代理类,因此具有更好的性能,但需要使用特定的编译器进行处理;而 Spring AOP 则采用运行时生成 AOP 代理类,因此无需使用特定编译器进行处理。由于 Spring AOP 需要在每次运行时生成 AOP 代理,因此性能略差一些。