1. AOP概述
- AOP的概念
AOP(Aspect-Oriented Programming),即面向切面编程。
AOP采取横向抽取机制,即将分散在各个方法中的重复代码提取出来,然后在程序编译或运行阶段,将这些抽取出来的代码应用到需要执行的地方。
AOP把程序分为核心业务逻辑和非核心的公共服务,AOP的关注点是非核心的公共服务,主要处理日志记录、性能统计、安全控制、事务处理、异常处理等功能。
- AOP面向切面编程的优势
由学生信息管理系统可知,新增学生信息、更新学生信息和删除学生信息的方法体中都包含日志记录的业务逻辑,这就带来了一定数量的重复代码并使程序的维护成本增加。
基于AOP的面向切面编程,可以为此类问题提供解决方案,AOP可以将日志记录的业务逻辑从这三个方法体中抽取到一个可重用的模块,进而降低横向业务逻辑之间的耦合,减少重复代码。
AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务,而不用过多的关注非核心的公共服务。这样对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。
- AOP与OOP关系
AOP与OOP相辅相成,AOP提供了与 OOP 不同的抽象软件结构的视角,在OOP中以类作为程序的基本单元,而AOP中的基本单元是Aspect(切面)。
2. AOP术语
AOP常见术语有切面、连接点、切入点、通知(增强)等。
术语名称 |
说明 |
切面 |
切面是指关注点形成的类(关注点是指类中重复的代码),通常是指封装的、用于横向插入系统的功能类(如事务管理、日志记录等)。 |
连接点 |
连接点是程序执行过程中某个特定的节点,例如,某方法调用时或处理异常时。在Spring AOP中,一个连接点通常是一个方法的执行。 |
切入点 |
当某个连接点满足预先指定的条件时,AOP就能够定位到这个连接点,在连接点处插入切面,该连接点也就变成了切入点(实际被真正增强的方法)。 |
通知(增强) |
通知/增强处理就是插入的切面程序代码。可以将通知/增强处理理解为切面中的方法,它是切面的具体实现。 |
切面、连接点和切入点的关系如下图所示。
3. AspectJ概述
AspectJ是独立的AOP框架,Spring框架可基于AspectJ实现AOP操作。
- 通知类型
通知类型 |
说明 |
前置通知 |
前置通知是在目标方法执行前实施增强。 |
后置返回通知 |
后置返回通知是在目标方法成功执行后实施增强。 |
环绕通知 |
环绕通知是在目标方法执行前和执行后实施增强。 |
异常通知 |
异常通知是在目标方法抛出异常后实施增强。 |
后置(最终)通知 |
后置(最终)通知是在目标方法执行后实施增强,与后置返回通知不同的是,不管是否发生异常都要执行该通知。 |
- AspectJ注解
注解名称 |
注解说明 |
@Aspect |
用于定义一个切面,注解在切面类上。 |
@Pointcut |
用于定义切入点表达式。 |
@Before |
用于定义前置通知。 |
@AfterReturning |
用于定义后置返回通知。 |
@Around |
用于定义环绕通知。 |
@AfterThrowing |
用于定义异常通知。 |
@After |
用于定义后置(最终)通知。 |
- 切入点表达式
4. OOP方式实现日志记录案例
采用OOP的面向对象编程方式,对学生信息管理系统中的新增学生信息、更新学生信息和删除学生信息3个方法实现日志记录业务。
案例实现详见链接:案例07 OOP方式实现日志记录案例
5. AOP方式实现日志记录案例
采用AOP的面向切面编程方式,对学生信息管理系统中的新增学生信息、更新学生信息和删除学生信息3个方法实现日志记录业务。
案例实现详见链接:案例08 AOP方式实现日志记录案例