首页 > 其他分享 >springboot2 默认cglib的原因 spring5默认还是jdk代理

springboot2 默认cglib的原因 spring5默认还是jdk代理

时间:2024-09-26 11:50:18浏览次数:1  
标签:jdk JDK 代理 默认 springboot2 CGLIB 动态 SpringBoot

https://www.163.com/dy/article/J8871AJ5055616YO.html

假设,我们有一个UserServiceImpl和UserService,此时需要在UserContoller中使用UserService。在 Spring 中通常都习惯这样写代码:

@Autowired UserService userService;

在这种情况下,无论是使用 JDK 动态代理,还是 CGLIB 都不会出现问题。

但是,如果你的代码是这样的呢:

@Autowired UserServiceImpl userService;

这个时候,如果我们是使用 JDK 动态代理,那在启动时就会报错:

启动报错

因为 JDK 动态代理是基于接口的,代理生成的对象只能赋值给接口变量。

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

SpringBoot 正是出于这种考虑,于是在 2.x 版本中,将 AOP 默认实现改为了 CGLIB。

更多的细节信息,读者可以自己查阅上述 issue。

总结

 

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

标签:jdk,JDK,代理,默认,springboot2,CGLIB,动态,SpringBoot
From: https://www.cnblogs.com/zqlmianshi/p/18433175

相关文章

  • IDEA调试的时候怎么确认一个代理对象是cglib动态代理实现的还是jdk动态代理实现的
    在调试过程中,判断一个代理对象是通过CGLIB实现的还是通过JDK动态代理实现的,可以从以下几个方面入手:###1.检查代理对象的实际类型在IntelliJIDEA中,你可以使用调试工具查看对象的实际类型。JDK动态代理和CGLIB动态代理在对象类型上有显著区别:-**JDK动态代理**:代理对......
  • 使用dockerfile来构建一个包含Jdk17的centos7镜像
    文章目录1、dockerfile简介2、入门案例2.1、创建目录/opt/dockerfilejdk172.2、上传jdk-17_linux-x64_bin.tar.gz到/opt/dockerfilejdk172.3、在/opt/dockerfilejdk17目录下创建dockerfile文件2.4、执行命令构建镜像:不要忘了后面的那个.2.5、查看镜像是否建立完成2......
  • 类和对象(2)(六个默认成员函数)
     个人主页:Jason_from_China-CSDN博客所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客类的默认成员函数概念概述默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个......
  • 要实现在Vue 2中点击按钮后在新浏览器标签页中预览PDF文件 ,pdf文件默认放大125% 禁止P
    要在Vue2中实现点击按钮后在新浏览器标签页中预览PDF文件,并设置PDF文件默认放大125%以及禁止PDF的工具栏下载功能,你可以使用window.open方法,并在其中设置合适的URL参数来控制PDF查看器的行为。以下是一个实现的示例:创建Vue组件:在Vue组件中,添加一个按钮用于触发PDF预览......
  • JDK的下载和环境变量的配置
    JDK(JavaDevelopmentKit)是Java开发工具包,是开发和编译Java应用程序所需的软件包。JDK由Java编译器、Java运行时环境(JRE)和Java开发工具组成。JDK提供了开发Java应用程序所需的工具和资源,包括Java编译器(javac)、Java虚拟机(JVM)、调试器(jdb)、应用程序打包工具(jar)等。它还包含了Jav......
  • Jupyter Notebook 修改默认路径
    第一次安装好 JupyterNotebook打开的目录好乱,是乱七八的,要修改JupyterNotebook的默认路径,您可以按照以下步骤操作:在Windows上打开命令提示符:按 Win+R 打开运行对话框。输入 cmd 并按回车。生成配置文件(如果还没有配置文件): jupyternotebook--generat......
  • replace jdk
    #!/bin/bashjava_processes=$(ps-ef|grepjava|grep-vgrep)running_jdk_paths=$(echo"$java_processes"|grep-oP'/.*?/bin/java'|sort-u)jdk_installations=$(find/path/to/jdk-name'jdk*')idle_jdk_paths=()for......
  • jdk
    ----name:ReplaceIdleJDKhosts:allgather_facts:falsevars:jdk_download_url:""tasks:-name:CheckrunningJavaprocessescommand:ps-ef|grepjava|grep-vgrepregister:java_processeschanged......
  • OSPF 默认路由的发布原则 | 类型详解
    默认路由默认路由是指目的地址和掩码都是0的路由。当设备无精确匹配的路由时,就可以通过默认路由进行报文转发。一般多用于网络边界路由器访问互联网所需要的一条路由。同时,企业内,在精确的内部路由基础上,边界路由器通告一条默认路由,使所有访问未知目的地的数据报文都送至......
  • aop动态代理可以用两种技术jdk动态代理和cglib动态代理
    SpringAOP(面向切面编程)在实现动态代理时,实际上可以使用两种不同的技术:JDK动态代理和CGLIB动态代理。具体使用哪一种技术取决于具体的情况。1.**JDK动态代理**:-JDK动态代理只能代理实现了接口的类。-如果目标类实现了一个或多个接口,SpringAOP默认会使用JDK动态代理。......