当前位置: 首页 > news >正文

SpringBoot和Spring AOP默认动态代理方式

SpringBoot和Spring AOP默认动态代理方式

目录

  • SpringBoot和Spring AOP默认动态代理方式
  • 1. springboot 2.x 及以上版本
  • 2. Springboot 1.x
  • 3.SpringBoot 2.x 为何默认使用 Cglib

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

1. springboot 2.x 及以上版本

在 SpringBoot 2.x AOP中会默认使用Cglib来实现,但是Spring5中默认还是使用jdk动态代理。Spring AOP 默认使用 JDK 动态代理,如果对象没有实现接口,则使用 CGLIB 代理。当然,也可以强制使用 CGLIB 代理。

在 SpringBoot 中,通过AopAutoConfiguration来自动装配AOP.
在这里插入图片描述

2. Springboot 1.x

Springboot 1.x AOP默认还是使用 JDK 动态代理的
在这里插入图片描述

3.SpringBoot 2.x 为何默认使用 Cglib

因为JDK 动态代理是基于接口的,代理生成的对象只能赋值给接口变量。JDK动态代理使用Proxy.newProxyInstance()创建代理实现类,然而第二个参数就需要接口类型,如果没有接口类型就会报错。

Proxy.newProxyInstance(iCustomerInstance.getClass().getClassLoader(), iCustomerInstance.getClass().getInterfaces(), this);

而 CGLIB 就不存在这个问题。因为 CGLIB 是通过生成子类来实现的,代理对象无论是赋值给接口还是实现类,这两者都是代理对象的父类。

所以在2.x版本以上,将 AOP 默认实现改为了 CGLIB代理。

新建一个接口

public interface ICustomService {
 
    void printf();
}

新建一个ICustomService的实现类

@Service
public class CustomServiceImpl implements ICustomService {
 
    public void printf() {
 
    }
}

再增加一个类不实现任何接口
然后启动,可以debug看到ICustomService和CustomNoImpl看出AOP的代理使用的是CGLIB的动态代理
在这里插入图片描述
然后我们通过application.properties配置将代理默认设置为JDK代理。

spring.aop.proxy-target-class=false

然后启动调试发现,CustomNoImpl因为没有实现接口,所以使用的是CGLIB生成的代理,而customService有接口实现,所以使用JDK的动态代理

在这里插入图片描述

相关文章:

  • 华为OD机试 - 插队(Java JS Python)
  • OpenAI 发布GPT-4——全网抢先体验
  • 开源超级终端工具——WindTerm
  • 低代码开发平台是什么意思?低代码开发平台优势!
  • JS中sort()方法返回值?
  • C/C++每日一练(20230314)
  • RK3568平台开发系列讲解(Linux系统篇)消息队列
  • 2023携程面试题
  • 机器学习入门——线性回归
  • 【拳打蓝桥杯】最基础的数组你真的掌握了吗?
  • π-Day快乐:Python可视化π
  • 【GPT-4】GPT-4 相关内容总结
  • 【计算机组成原理 - 第一章】计算机系统概论(完结)
  • MySQL:JDBC
  • 初入了解——什么是VUE
  • [nginx文档翻译系列] 控制nginx
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 5、React组件事件详解
  • Angular2开发踩坑系列-生产环境编译
  • ES6核心特性
  • HTTP中的ETag在移动客户端的应用
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript异步流程控制的前世今生
  • Java知识点总结(JavaIO-打印流)
  • leetcode46 Permutation 排列组合
  • miaov-React 最佳入门
  • Redis字符串类型内部编码剖析
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SQLServer之索引简介
  • XML已死 ?
  • 产品三维模型在线预览
  • 数组的操作
  • 《码出高效》学习笔记与书中错误记录
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • # .NET Framework中使用命名管道进行进程间通信
  • # 飞书APP集成平台-数字化落地
  • #、%和$符号在OGNL表达式中经常出现
  • (C语言)fread与fwrite详解
  • (二)springcloud实战之config配置中心
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (未解决)macOS matplotlib 中文是方框
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)jQuery 基础
  • (转)Oracle存储过程编写经验和优化措施
  • (转)项目管理杂谈-我所期望的新人
  • ***监测系统的构建(chkrootkit )
  • .Mobi域名介绍
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Micro Framework初体验
  • .Net Remoting常用部署结构
  • .NET程序员迈向卓越的必由之路
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析