关于Spring AOP的基本理解

文章目录

  • 应用场景
  • AOP基本概念
  • Spring AOP实现与步骤
  • Spring AOP的工作过程
  • Spring AOP代理方式

面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源码的情况下,给程序动态统一添加功能的一种技术。

AOP的编程思想就是把很多类对象的横切问题点,从业务中分离出来,从而达到解耦的目的,增加代码的重用性。

应用场景

日志记录、权限验证、事务处理、效率检查、异常处理、缓存处理、数据持久化、内容分发

AOP基本概念

切面(Aspect):一般用在类上,用于声明一个AOP逻辑

切入点(Pointcut):添加在AOP逻辑中,一般为一个表达式,用来标记AOP的目标方法

通知(Advice):表示在AOP所标记的目标方法前后执行的AOP增强逻辑

  • @Before:目标方法执行前可以执行(无论方法是否异常都执行)
  • @After:目标方法执行后执行(方法如有异常则不执行)
  • @Around:目标方法前或者后执行(可控制目标方法执行顺序)
  • @AfterReturning:在目标方法返回执行(无论方法是否异常都执行)
  • @AfterThrowing:在目标方法异常时执行

连接点(JointPoint):AOP将目标方法抽象为链接点的概念,提供给增强方法去处理

目标对象(Target):由一个或者多个切面代理的对象,由springAop运行时代理实现的

AOP代理(AOP Proxy):由AOP框架创建的对象,AOP代理对象有两种,AOP动态代理(基于接口的代理)和cglib代理(非接口代理)

织入(Weaving):指把增强应用到目标对象来创建对象的过程,Spring AOP在运行时织入

Spring AOP实现与步骤

  1. Springboot中引入Starter-aop的依赖

  2. 定义一个切面类Aspect,即声明的类,增加@Component和@Aspect两个注解

  3. 定义切点Pointcut,并定义切点在哪些地方执行,采用@Pointcut注解完成

    @Pointcut(public * com.xxx.xxx.*.*(..))
    
    • public:修饰符(可不写,不可写*)
    • 第一个*:返回类型
    • 第二个*:类名
    • 第三个*:方法名
    • (…):表示参数不限
  4. 定义Advice通知,利用通知的类型注解,来完成在某些切点的增强动作

Spring AOP的工作过程

  1. Spring创建IOC容器,spring扫描包中Component修饰的类,创建对象后放入IOC容器中
  2. 寻找切面类,Spring在创建完对象后,开始寻找由@Aspect修饰的切面类并获取切面类中的所有方法
  3. 寻找切面类中带有表达式的部分,接下来spring找到所有由合法表达式修饰的方法
  4. spring检查它所扫描到的所有类,并将上一步中找到的方法与所有类进行对照,找出有这些方法的类(这个类是被代理类)
  5. 最后,spring根据上一步找到的被代理类以及切面类创建动态类的动态对象并放入IOC容器中

Spring AOP代理方式

  1. JDK动态代理

    基于接口,也就是被代理的类一定要实现了某个接口,否则无法被代理

  2. CGLIB

    Spring中,如果被代理的类没有实现接口(直接对类生成代理),那么就用CGLIB来完成动态代理,通过继承的方式来实现代理类(final修饰的类不能使用CGLIB)

注意:

  1. spring 5.x中AOP默认依旧使用jdk动态代理
  2. springboot 2.x开始,为了解决jdk代理可能导致的类型转换异常而默认使用cglib
  3. 在springboot 2.x中,如果需要修改默认使用jdk动态代理可以通过配置项spring.aop.proxy-target-class = false来进行修改,proxyTargetClass配置已无效

性能对比:

jdk6下,运行次数少的情况下,jdk动态代理和cglib不明显,次数多后cglib稍快;

jdk7下,jdk动态代理快;

jkd8表现和jdk7一致。

你可能感兴趣的:(Spring,spring,java)