AOP(Aspect-Oriented Programming 面向切面编程)可以说是对OOP(面向对象编程)的补充和完善。OOP引入继承、封装和多态等概念来建立一种对象层次结构,来模拟公共行为的一个集合,定义从上到下的关系。当需要为分散的对象添加公共行为的时候(自左到右的横切性问题,比如日志功能),OOP显得无能为力。因为这些横切问题和我们的主业务功能毫无关系,而且往往水平地散布在代码的各个地方(这类散布在各处的无关代码被称为横切代码),在OOP中会导致大量代码重复,不利于重用,难以维护。

AOP的编程思想就是把业务逻辑和横切问题进行分离,从而达到解耦的目的。他利用一种称为横切的技术,剖解开封装的对象内部,将影响多个类的公共行为封装到一个可复用模块(Aspect),减少系统的重复代码,降低模块间的耦合度,便于操作和维护。

核心关注点和横切关注点

使用横切技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而且各处都基本相似,比如权限认证、日志、事务处理。AOP的作用在于分离系统中的核心关注点和横切关注点。

Spring AOP 实现方式

动态代理。默认使用标准的JDK动态代理(实现了接口的类),否则使用CGLib代理(没有实现接口)。也可以通过配置的形式,强制使用CGLib代理方式。

在运行期间,生产字节码,加载到虚拟机中。

AOP术语

  • 通知 advice : 具体想要的功能,比如事务,日志,权限等。需要先定义好,然后在想用的地方使用就可以了。
  • 连接点 Join point : Spring只支持方法连接点,基本上每个方法都可以是连接点。
  • 切入点 Point cut : 在连接点的基础上,定义切入点。比如你在某个类的其中几个方法之前、之后或者抛出异常后干点什么(通知),那么就用切入点定义这几个方法。由切入点表达式匹配连接点,Spring默认使用AspectJ切入点表达式语言。
  • 切面 Aspect :切面是通知和切入点的结合。(交给Spring管理,@Configuration,@Bean等)
  • 引入 introducition : 向现有类添加新的方法属性。
  • 织入 Weaving : 把切面应用到目标对象来创建代理对象的过程。

Spring中有哪些不同的通知类型

通知advice是程序中横切关注点的实现,主要有以下5种类型:

  • 前置通知(Before Advice)
    • 在连接点之前执行Advice,使用 @Before 注解使用这个Advice。抛出异常,会中断执行流。
  • 返回后通知(After Returning Advice)
    • 连接点正常结束之后执行的Advice,使用@AfterReturning 来使用。
  • 抛出后执行通知(After Throwing Advice)
    • 如果某个方法抛出异常退出的话,这个Advice会被执行,通过AfterThrowing来执行。
  • 后置通知(After Advice)
    • 连接点退出后,这个Advice会被执行,通过@After注解使用。
  • 围绕通知(Around Advice)
    • 围绕连接点执行的Advice,通过@Around注解使用