SpringAop使用的到底是JDK动态代理还是Cglib?

1. 从源码分析

之前在看spring面试题的时候,不知道正确答案,网上搜了一阵子,感觉也都说得不明不白的,于是决定自己来分析一波

先给个结论:SpringAop默认使用Jdk动态代理的方式,满足某些条件可以变为Cglib

废话不多说,直接贴源码来分析
在这里插入图片描述

从上面源码中,其实已经可以看出来了,AOP的作者也在上面写了注释,只要满足下列三个点任意之一,那么就采用Cglib代理
在这里插入图片描述

① optimize标志已设置(也就是为true)

从源码可以看出optimize默认是false
在这里插入图片描述
这里我也不清楚在什么地方去设置其为true,应该一般情况不会更改,也就是一直为false,如果有大佬知道还请评论区指点一下。

② 设置proxyTargetClass(目标代理类)标志

在这里插入图片描述

更改proxyTargetClass(目标代理类)标志的方法

给Config配置类上的@EnableAspectJAutoProxy注解附值

更改之后,就会采用Cglib的方式
在这里插入图片描述
在注解源码里面可以看到有proxyTargetClass这个标签,且默认为false
在这里插入图片描述

③ 没有指定代理接口

在这里插入图片描述
这里的没有指定代理接口是什么意思呢,也就是在Config配置类中,没有实现SpringProxy相关的接口

如果直接继承SpringProxy相关接口,重写里面的方法,那么就会采用默认自己写的代理方法,而不会使用SpringAop提供的方法

下面两个接口都可以代替默认的jdk动态代理的方法
在这里插入图片描述

2. 错误的推论

至此,很明显可以得出结论,SpringAop默认是使用Jdk动态代理的方式实现Aop,如果满足上列任意一个条件,则使用Cglib的方式

那么这样的推论是否正确,实质是错误的,因为在源码中,还有一个判断的条件
在这里插入图片描述
也就是下列两种情况,还是会采用Jdk动态代理的方式

① 要代理的类是接口
在这里插入图片描述
② 要代理的类是代理类
在这里插入图片描述
在这里插入图片描述

3. 最终的推论

SpringAop默认使用JDK的方式实现Aop代理

什么时候使用Cglib代理的方式呢?

(1) 满足下列3个条件之一

① optimize标志已设置(也就是为true)
② 设置proxyTargetClass(目标代理类)标志
③ 没有指定代理接口

上述三点在标题一中有详解

(2) 同时满足下列两个条件

① 要代理的目标类不是接口
② 要代理的目标类不是代理类

自己才疏学浅,如果有错误还请大佬评论区指正

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值