Spring boot 和 jdk 动态代理 以及Aop实现细节
2023-08-23 11:21 作者:MicroShuai | 我要投稿
1.Mapper生成代理对象


2.代理对象一定是基于接口实现的吗? 答案是:不是
Jdk 生成的代理对象 是 基于 接口 实现的
CGLIB 是 基于 接口 或者 实现类 实现 的
那么基于CGLIB 实现类 代理对象 能实现AOP吗?它的功能能否增强?
答案是:都是可以的,例如我一下开启一个事务嵌套:



当我想删除部门,和当前部门下所有的员工,这时删除成功的!并且我的数据库里面是有记录的,证明 当 注入 实现类 是可以实现功能增强(aop)的
3.切换 jdk 和 SpringBoot 代理
在SpringBoot的配置文件中设置: false 为 jdk ture 为 cglib
4.区别
CGLIB:

jdk代理:

5.Spring CGLIB 是用于生成代理对象的工具
Spring CGLIB 是用于生成代理对象的工具,而不是代理对象本身。当使用 CGLIB 创建代理时,!!!!!代理对象会是目标类的一个子类!!!!!!,而且会重写目标类中的所有非 final
方法。这样,当你调用代理对象上的方法时,可以执行一些自定义逻辑,然后调用真实目标对象上的相应方法。
6.是否一定要使用Aop 切面注解@Aspect 才能实现功能增强?
答案:不是
用@Service去注入一个实现类,
如果服务类不涉及事务、安全检查或性能分析 其他需要拦截方法调用的特性,那么通常注入的就是代理对象。
如果服务类不涉及这些特性,那么注入的是 普通类
7.jdk 不能注入 实现类对象,只能注入 接口的代理对象,不然会报错

可以强制使用@FnableAsync @EnableCaching