返回顶部
首页 > 资讯 > 后端开发 > Python >springboot2.x默认使用的代理是cglib代理操作
  • 215
分享到

springboot2.x默认使用的代理是cglib代理操作

2024-04-02 19:04:59 215人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

背景 因为项目优化,打算写个日志的切面类,于是起了个SpringBoot 工程,在这里面测试。结果在springboot 里面测试正常,能正确打印日志,但是把代码复制到实际项目中,在

背景

因为项目优化,打算写个日志的切面类,于是起了个SpringBoot 工程,在这里面测试。结果在springboot 里面测试正常,能正确打印日志,但是把代码复制到实际项目中,在进入切面打印日志的时候总是报错,报空指针错误。

经调试发现每次都是在获取注解上的属性时报错。当时百思不得解。后来灵光一闪,想到可能是项目中获取到的是接口方法,而springboot是实现类的method ,所以可以拿到注解的属性。

但是仔细一想,Springboot里面也是接口,难道不应该走jdk动态代理吗?那拿到这个方法的应该也是接口的方法,带着这个疑问,我开始了我的探索之旅。

验证

springboot 项目

cglib动态代理

spring 项目

JDK动态代理

发现springBoot 竟然走的是cglib代理,起代理的是实现类,所以能拿到方法上注解的属性,而我的项目是个传统的spring 项目,service是接口,走的是JDK动态代理,通过切点拿到的是接口的方法,而接口上又没有注解,所以按照springboot的写法是拿不到注解的,拿不到注解也就拿不到注解属性,所以报错。

解决办法

springboot的写法


 private Method getMethod(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        //获取方法签名
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        return method;
    }
    
 private String getAnnotationDesc(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        Method method = getMethod(joinPoint);
        String value = method.getAnnotation(MyLog.class).value();
        return value;
    }

spring 的写法


private Method getMethod(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        //获取方法签名
        Class<?> targetClass = joinPoint.getTarget().getClass();
        String methodName = joinPoint.getSignature().getName();
        Class[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getParameterTypes();
        Method method = targetClass.getMethod(methodName, parameterTypes);
        return method;
    }
private String getAnnotationDesc(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        Method method = getMethod(joinPoint);
        String value = method.getAnnotation(MyLog.class).value();
        return value;
    }

可以看到spring项目的方法是先获取目标类,然后再通过目标类获取目标方法,然后再获取方法上的注解。

深度追踪

springboot 为什么将默认的代理改成了cglib,这会导致什么问题?如果我们想要事务走JDK动态代理,该如何做?

带着这些疑问,我翻阅了springboot的相关issue ,发现很多人提这个问题。

先关issue如下:

issue1

issue2

issue2

springboot团队之所以默认的代理模式设置成cglib代理,看看spring的官方团队是怎么解释的

This was changed in 1.4 (see 5423). We've generally found cglib proxies less likely to cause unexpected cast exceptions.

他们认为使用cglib更不容易出现转换错误。springboot 默认的配置文件的位置在

/org/springframework/boot/spring-boot-autoconfigure/2.1.7.RELEASE/spring-boot-autoconfigure-2.1.7.RELEASE.jar!/META-INF/spring-configuration-metadata.JSON


{
      "name": "spring.aop.proxy-target-class",
      "type": "java.lang.Boolean",
      "description": "Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false).",
      "defaultValue": true
    },

如果在事务中强制使用JDK动态代理,以往的知识告诉我们,我们需要将proxyTargetClass 设置成false,于是我们在springboot 中发现注解@EnableTransactionManagement 或者@EnableAspectJAutoProxy默认就为false,说明这里面的属性不起作用


@EnableAspectJAutoProxy(proxyTargetClass = false)
@EnableTransactionManagement(proxyTargetClass = false)

同理 @EnableCaching 上的proxyTargetClass 属性也是失效的。如果偏要springboot 走JDK动态代理,那么需要在application.properties里面配置


spring.aop.proxy-target-class=false

此时项目中走的就是JDK动态代理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: springboot2.x默认使用的代理是cglib代理操作

本文链接: https://lsjlt.com/news/132102.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springboot2.x默认使用的代理是cglib代理操作
    背景 因为项目优化,打算写个日志的切面类,于是起了个springboot 工程,在这里面测试。结果在springboot 里面测试正常,能正确打印日志,但是把代码复制到实际项目中,在...
    99+
    2024-04-02
  • springboot2.x中默认使用代理是cglib代理的操作示例
    小编给大家分享一下springboot2.x中默认使用代理是cglib代理的操作示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景因为项目优化,打算写个日志的...
    99+
    2023-06-20
  • java中Cglib代理的用法是什么
    本篇内容介绍了“java中Cglib代理的用法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明Cglib代理可以称为子类代理,是在内...
    99+
    2023-06-20
  • SpringBoot/Spring AOP默认动态代理方式是什么
    这篇文章主要介绍“SpringBoot/Spring AOP默认动态代理方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot/Spring AOP默认动态...
    99+
    2023-07-05
  • vue默认插槽的理解与实例代码
    目录什么是插槽默认插槽的理解代码片段总结什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符...
    99+
    2024-04-02
  • vue默认插槽的理解及实例代码是怎样的
    vue默认插槽的理解及实例代码是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是插槽插槽就是子组件中的提供给父组件使用的一个占位符,用<slot...
    99+
    2023-06-21
  • MySQL建表设置默认值/取值范围的操作代码
    目录mysql建表设置默认值/取值范围一、设置默认值二、设置取值范围MySQL创建表时字符串的默认值操作:结论:MySQL建表设置默认值/取值范围 一、设置默认值 设置默认值采用default,如代码所示: 二、设置取值...
    99+
    2022-11-30
    MySQL建表设置默认值 MySQL建表设置取值范围 MySQL字符串默认值
  • 代理服务器的正向代理的作用是什么
    这篇文章主要讲解了“代理服务器的正向代理的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“代理服务器的正向代理的作用是什么”吧!正面代理的角色:1、客户访问授权,进行互联网认证。以防...
    99+
    2023-06-25
  • 用jquery方法操作radio使其默认选项是否
    复制代码 代码如下: <tr> <th>是否映射:</th> <td> <input type="radio" name="sf...
    99+
    2022-11-15
    jquery操作radio 默认选项
  • node代理的作用是什么
    本篇内容主要讲解“node代理的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node代理的作用是什么”吧! 在node中...
    99+
    2024-04-02
  • HTTP代理的作用是什么
    HTTP代理的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、提高网络访问速度在我们的生活中,当我们访问一些受欢迎的网站和外国网站时,网络速度会很慢。HTTP代...
    99+
    2023-06-14
  • 使用代理服务器的作用是什么
    本篇内容介绍了“使用代理服务器的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!因特网的日常生活中,作为一名资深网民,大家应该对服务...
    99+
    2023-06-25
  • HTTPS代理的工作原理是什么
    这篇文章将为大家详细讲解有关HTTPS代理的工作原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。主要工作流程...
    99+
    2023-06-15
  • go pprof 的使用操作代码
    目录背景pprof 是什么gin 框架使用 pprof火焰图总结背景 最近合作开发一个项目,项目部署发现了才跑了没多久,就直接宕机了,查看服务器信息发现在某个时间端内存猛的暴涨了非常...
    99+
    2024-04-02
  • 解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题
    Spring JPA 使用@transaction注解时产生CGLIB代理冲突 在使用JPA进行数据库的删除操作时需要使用@Transactional注解来支持事物: @Mod...
    99+
    2024-04-02
  • 代理服务器的作用是什么
    代理服务器的作用是:1、可以突破自身IP访问限制,访问到国外站点;2、网络用户通过代理访问国外网站;3、可以访问一些单位或团体内部资源;4、可以突破IP封锁;5、通过代理服务器提高访问速度;6、可以隐藏真实的IP,避免受到攻击。主要的功能有...
    99+
    2024-04-02
  • 代理ip中pptp的作用是什么
    这篇文章主要介绍“代理ip中pptp的作用是什么”,在日常操作中,相信很多人在代理ip中pptp的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”代理ip中pptp的作用是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-20
  • 动态ip代理的作用是什么
    这篇文章主要为大家展示了“动态ip代理的作用是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“动态ip代理的作用是什么”这篇文章吧。1、增强浏览时IP限制:有些资源是你自己无法浏览的,必须在指...
    99+
    2023-06-15
  • 代理ip的常见作用是什么
    本篇内容主要讲解“代理ip的常见作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“代理ip的常见作用是什么”吧!1、更换IP,代理IP的主要用途和好处是可以随意更换IP,不管是生活还是工作...
    99+
    2023-06-20
  • spring aop代理控制的操作方式
    目录默认代理行为修改代理行为spring aop可通过参数proxyTargetProxy控制创建代理的方式 proxyTargetProxy=true:强制使用cglib代理pro...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作