1. 本篇文章就聊一聊SpringAop的具体写法。AOPAspect Oriented Programming 面向切面编程,是OOP(面向对象编程)的一种补充,OOP关注点是对象。AOP关注的是相同的一类行为。比如:每个Controller方法的日志打印。<br />SpringAOP支持使用XML和注解两种方式对切面进行配置。

1.AOP的术语

  • 连接点:就是一个普通的类中的可以被代理的方法(就是类中方法)
  • 切入点:真正被代理的方法,可以通过切入点表达式进行指定
  • 通知:在原有方法代码上,增强的代码。分为5种
  • 切面:个人理解,就是一个关注点的具体实现,包含通知、切入点定义

    2.依赖准备

    想要使用SpringAop需要引入AspectJ的jar包。
    image.png
    如果想使用Cglib动态代理,自然需要引入,Cglib的jar包。但是在Spring的官方文档中已经说明,cglib已经被打包到spring-core中了。所以没有必要再手动引入。

    image.png

3.默认使用JDK or CGLIB?

小伙伴们是不是有这么个问题?Spring默认使用的是哪种代理呢?这个问题其实在官方文档中已经给出了答案。

image.png

  • 优先使用JDK动态代理
  • 但是如果被代理类真的没有实现接口,那么会使用CGLIB作为没有实现接口的这些类的动态代理

如果你希望无论类实现了接口或没实现接口,都统一使用CGLIB做动态代理的话,只需要在XML或配置类上启动切面的注解或标签中做如下修改:

image.png

  1. - <aop:aspectj-autoproxyproxy-target-class="true"/> or @EnableAspectJAutoProxy(proxyTargetClass = true)
  2. - <aop:configproxy-target-class="true">

4.5大通知的执行顺序

这里我就借用网上的3张经典的图了
image.png
image.png
image.png

5.具体的配置方法

基于XML配置: https://gitee.com/gao_xi/spring-demo1/tree/aop-xml/
基于注解配置:https://gitee.com/gao_xi/spring-demo1/tree/aspect-xml-config/