Spring AOP总结

1.Spring AOP是什么?

Spring AOP(Aspect-oriented Programming面向切面编程)提供了一种将横切关注点(如日志、事务管理等)与业务逻辑分离的编程方式。通过这种分离,开发者可以更加关注于业务逻辑的实现,同时增强了代码的可维护性和可重用性。在 AOP 的术语中,最核心的几个概念包括切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和目标对象(Target Object)。

  • 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。例如,事务管理就是一个横切关注点,因为事务代码可能会散布在多个对象之间。
  • 连接点(Join Point):在程序执行过程中插入切面的点。在 Spring AOP 中,这些点通常是方法的调用。
  • 通知(Advice):切面在特定连接点执行的动作。(就是在处理的行为的哪个位置进行处理,如在处理位置之前,之后,或者前后都处理),Spring 支持五种类型的通知:
    • 前置通知(Before advice):在目标方法执行前执行的通知。
    • 后置通知(After returning advice):在目标方法成功执行之后执行的通知。
    • 异常通知(After throwing advice):在目标方法抛出异常后执行的通知。
    • 最终通知(After (finally) advice):在目标方法执行之后执行的通知,无论方法执行是否成功。
    • 环绕通知(Around advice):在被通知方法执行前后执行的通知,它将决定是否继续执行连接点或直接返回自己的返回值或抛出异常来结束执行。
  • 切入点(Pointcut):匹配连接点的表达式。简单来说,就是对哪个地方的哪些行为进行处理(常见比如对哪些请求进行处理)。
  • 目标对象(Target Object):被一个或多个切面所通知的对象。

2.Spring AOP的实现方式是什么?

Spring AOP 通过运行时代理实现,这意味着 AOP 框架在运行时动态地创建目标对象的代理对象。根据目标对象是基于接口还是类,Spring AOP 可以分别使用 JDK 动态代理或者 CGLIB 代理来创建代理对象。

遵循以下原则:

使用 JDK 动态代理

当目标对象实现了至少一个接口时,Spring AOP 默认使用 JDK 动态代理。JDK 动态代理通过反射机制动态创建代理对象,代理对象会实现目标对象的接口。在这种方式下,所有的调用都会被转发到实现了 InvocationHandler 接口的调用处理器。

优点:使用 JDK 原生支持的代理机制,无需额外引入库。

局限性:仅能代理实现了接口的类。

使用 CGLIB 代理

当目标对象没有实现任何接口时,Spring AOP 将使用 CGLIB 库生成代理。CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它可以在运行时扩展 Java 类与实现 Java 接口。CGLIB 代理会继承目标类,因此它没有JDK 动态代理的接口限制。

优点:可以代理没有实现接口的类。

局限性:无法代理声明为 final 的类或方法。

3.Spring AOP常用的场景是什么?

Spring AOP 通常用于以下几种场景:

  • 声明式事务管理:通过 @Transactional 注解使得事务管理代码的维护更加容易。
  • 日志记录:自动记录方法调用的入口和退出信息,方便调试和监控。
  • 权限控制:在方法执行前进行权限处理。
  • 异常处理:为方法调用提供统一的异常处理逻辑。
  • 性能监控:监控方法执行时间,用于性能调优。

4.Spring AOP常用注解?

        

1. @Aspect

  • 用途:标记一个类为切面类。用于定义切面,包括切入点和通知。

2. @Pointcut

  • 用途:定义切入点,即指定哪些方法会被拦截。在切面类中声明一个空方法作为模板,通过 @Pointcut 注解表达式来指定匹配的连接点。

3. @Before

  • 用途:定义一个前置通知,它在方法执行之前运行。在目标方法执行前进行检查或准备工作,如日志记录、权限检查等。

4. @AfterReturning

  • 用途:定义一个后置通知,它在目标方法成功执行之后运行。在方法成功执行后进行一些清理工作,如处理返回值、修改返回值等。

5. @AfterThrowing

  • 用途:定义一个异常通知,它在目标方法抛出异常时运行。用于处理方法执行中抛出的异常,如记录日志、事务回滚等。

6. @After

  • 用途:定义一个最终通知,不管方法执行是否成功,它都会在方法执行后运行。用于释放资源,执行清理工作,类似于 finally 块的作用。

7. @Around

  • 用途:定义一个环绕通知,它可以在方法执行前后自定义行为,甚至阻止方法的执行。最为强大的通知类型,可以用于几乎任何事情,比如性能监控、事务管理等。因为它直接包围了被通知的方法,所以可以在方法调用前后执行需要的逻辑,并直接影响到方法的调用。

示例:

/**

使用这些注解需要在 Spring 配置中启用注解驱动的 AOP 支持,
可以通过在配置类上添加 @EnableAspectJAutoProxy 注解来实现。
*/
@Aspect  //标记这是一个切面类
@Component
public class MyAspect {

    @Pointcut("execution(* com.example.service.*.*(..))") 
    //@Pointcut 定义了一个切入点,所有 com.example.service 包下的类的方法执行都会被匹配。
    public void serviceLayer() {
    }


    @Before("serviceLayer()")  
    //@Before 表示在匹配的方法执行前,执行 logBefore 方法里的逻辑。
    public void logBefore(JoinPoint joinPoint) {
        // 方法执行前的逻辑
    }
}

5.总结

通过使用 Spring AOP,开发者可以将这些横切关注点从业务逻辑代码中分离出来,放在独立的模块中,实现业务逻辑与系统服务的解耦。这不仅提高了代码的可维护性和重用性,还使得系统更加灵活。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One day️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值