Spring AOP
1. Spring AOP
Spring AOP(Aspect-Oriented Programming) 即面向切面编程,是一种编程范式,旨在提高代码模块化,使得开发者可以将横切关注点(如日志记录、事务管理、安全性等)与业务逻辑分离,进而在不修改业务代码的前提下增加或修改这些关注点。
Spring AOP是Spring框架中的一个重要部分,利用动态代理实现,支持基于代理的AOP。
2. 核心概念
-
Aspect(切面): 一个关注点的模块化,这个关注点可能会横切多个对象。切面可以包含任意的通知(也就是下文所说的Advice)和一个或多个切点(下文的Pointcuts)。
-
Join point(连接点): 在程序执行过程中某个特定点,例如方法调用或异常抛出的时刻。在Spring AOP中,一个连接点总是代表一个方法的执行。
-
Advice(通知): 在切面的某个特定的连接点上采取的行动。通知类型包括前置通知(Before)、后置通知(After returning)、异常通知(After throwing)、最终通知(After),以及环绕通知(Around)。
-
Pointcut(切点): 匹配连接点(Join points)的谓语或表达式。通常使用简洁的表达式语言来指定切点以匹配多个连接点。
-
Target object(目标对象): 被一或多个切面所通知的对象。它通常是一个代理对象,是AOP框架生成的一个被通知对象的代理实例。
-
AOP proxy(AOP代理): AOP框架创建的对象,用以实现切面契约(例如方法执行前后进行某些处理)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
-
Weaving(编织): 连接应用类型或对象与切面来创建通知的过程。这个过程可以在编译时、类加载时或运行时发生。
3. 实现AOP的方式
-
使用Spring AOP XML配置: 通过在Spring的配置文件中定义切面和通知器等。
-
使用@AspectJ注解: Spring AOP也支持@AspectJ的注解方法,这种方式使用注解定义切点和通知,通常更为直观和集中。
4. 示例
以下是一个使用Spring AOP的@AspectJ注解方式的示例:
@Aspect
@Component
public class LoggingAspect {
// 定义切点,匹配所有的save方法。
@Pointcut("execution(* com.example.service.*.save(..))")
public void savePointcut