本文是全面解析面向切面编程的实践指南。通过深入讲解切面、连接点、通知等关键概念,以及通过XML配置实现Spring AOP的步骤。
本文分享自华为云社区《Spring高手之路18——从XML配置角度理解Spring AOP》,作者: 砖业洋__。
Spring AOP使用动态代理作为其主要机制来实现面向切面的编程。这种机制允许Spring在运行时动态地创建代理对象,这些代理对象包装了目标对象(即业务组件),以便在调用目标对象的方法前后插入额外的行为(如安全检查、事务管理、日志记录等)。
Spring AOP
使用动态代理作为其主要机制来实现面向切面的编程。这种机制允许
Spring
在运行时动态地创建代理对象,这些代理对象包装了目标对象(即业务组件),以便在调用目标对象的方法前后插入额外的行为(如安全检查、事务管理、日志记录等)。
JDK动态代理:当目标对象实现了一个或多个接口时,
Spring AOP
默认使用
JDK
的动态代理。
JDK
动态代理通过反射机制,为接口创建一个代理对象,这个代理对象会拦截对目标接口方法的所有调用。
CGLIB代理:如果目标对象没有实现任何接口,
Spring AOP
会退回到使用
CGLIB
库生成目标类的子类。
CGLIB
(
Code Generation Library
)是一个强大的高性能代码生成库,它在运行时扩展了
Java
类,并在子类中覆盖了方法来实现方法拦截。
无论使用哪种代理方式,目的都是在不改变原有业务逻辑代码的基础上,通过切面定义的通知在方法执行的不同阶段插入附加行为。
切面(Aspect):切面是面向切面编程的核心,它是将横跨多个类的关注点(如日志记录、事务管理等)模块化的构造。一个切面可以包含多种类型的通知(
Advice
)和一个或多个切点(
Pointcut
),用于定义在何处以及何时执行这些通知。
连接点(Join Point):连接点代表程序执行过程中的某个特定位置,
Spring AOP
限定这些位置为方法的调用。简而言之,连接点就是能够插入切面通知的点。
通知(Advice):通知定义了切面在连接点上要执行的动作。根据通知类型的不同,这些动作可以在方法调用之前、之后、返回结果后或抛出异常时执行。
Before advice
):在方法执行之前执行。
After advice
):在方法执行后执行,无论其结果如何。
After-returning advice
):在方法成功执行之后执行。
After-throwing advice
):在方法抛出异常后执行。
Around advice
):在方法执行之前和之后执行,提供对方法调用的全面控制。
切点(Pointcut):切点是一个表达式,切点表达式允许通过方法名称、访问修饰符等条件来匹配连接点,决定了通知应该在哪些方法执行时触发。
目标对象(Target Object):被一个或多个切面所通知的对象。也被称为被代理对象。
AOP代理(AOP Proxy):
AOP
框架创建的对象,用于实现切面契约(由通知和切点定义)。在
Spring AOP
中,
AOP
代理可以是
JDK
动态代理或
CGLIB
代理。
引入(Introduction):引入允许向现有的类添加新的方法或属性。这是通过定义一个或多个附加接口(
Introduction interfaces
)实现的,
AOP
框架会为目标对象创建一个代理,该代理实现这些接口。
如果还是觉得抽象,我们再举一个电影制作的例子来类比
切面(Aspect)
小编推荐阅读