关于spring aop两种代理混用的问题

 更新时间:2021年11月24日 15:01:47   作者:babyLetsGo  
这篇文章主要介绍了关于spring aop两种代理混用的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

spring aop两种代理混用问题

工作繁忙,但是遇到问题还是要总结积累下来,今天项目中出现了代理混用的问题,解决之后记录一下对两种代理方式的学习理解。

一、首先复习一下两种代理

JDK动态代理 和 cglib代理

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

Spring AOP的原理是 JDK 动态代理和CGLIB字节码增强技术,前者需要被代理类实现相应接口,也只有接口中的方法可以被JDK动态代理技术所处理;后者实际上是生成一个子类,来覆盖被代理类,那么父类的final方法就不能代理,因为父类的final方法不能被子类所覆盖。一般而言Spring默认优先使用JDK动态代理技术,只有在被代理类没有实现接口时,才会选择使用CGLIB技术来实现AOP。

但是也提供了配置参数来强制选择使用 CGLIB 技术,如下:

<aop:config proxy-target-class="true" /> 

proxy-target-class="true" 表示强制使用 CGLIB 技术来实现AOP,因为CGLIB是生成子类也就是代理类来实现的,所以proxy-target-class,表示是否代理目标类。<aop:config /> 就会由spring来选择,spring优先使用JDK动态代理来实现AOP。

二、我们项目是spring-boot项目

默认即为proxy-target-class="true",service实现类使用@service注解后都是使用CGLIB代理。

我遇到问题是,service某个方法添加@Async注解使该方法可异步调用,然后原有从spring容器中获取Bean对象的方法运行时就报错了,原来这个service实现类就不在使用CGLIB而是直接使用JDK动态代理。时间紧迫,具体原因后续再次分析,今天的记录就先到这里。

spring的aop和代理模式理解

Spring的AOP:即面向切面编程,其代码实质,即代理模式的应用。

代理模式代码的主要特点是

不改变原有类的前提下,在原有类某些方法执行前后,插入任意代码。所以代理模式需要写新的类对原有的类进行包装。

代理模式目前实现的方式有三种

  • 静态代理:需要增强原有类的哪个方法,就需要对在代理类中包装哪个方法。个人理解,从功能上来说,原有类和代理类不一定要实现共同接口,但是为了赋予代理和和被代理类之间的逻辑关系,增加程序的可读性,可理解性,逻辑性,增加代理对象和被代理对象之间的关系,以更加符合面向对象编程是思维,而应该实现共同接口。
  • 动态代理:使用反射机制,方法和对象都是传入的变量,就可以经过传入的对象和方法而动态调用被代理对象的任何方法,jdk中提供了实现此动态代理的api,被代理类必须实现接口
  • Cglib代理:返回对象是代理对象的子类,不需要代理对象实现接口。当调用原对象方法时,实际上调用的是代理子类的方法。

Aop的最大意义是

在不改变原来代码的前提下,也不对源代码做任何协议接口要求。而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码。

Struts2中的拦截器,spring中的赖加载都是用代理模式实现

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Java设计模式编程中的访问者模式

    详解Java设计模式编程中的访问者模式

    这篇文章主要介绍了Java设计模式编程中的访问者模式,访问者模式的合理利用可以避免项目中出现大量重复的代码,需要的朋友可以参考下
    2016-02-02
  • 使用Java读取Excel文件数据的方法详解

    使用Java读取Excel文件数据的方法详解

    通过编程方式读取Excel数据能实现数据导入、批量处理、数据比对和更新等任务的自动化,本文为大家介绍了三种Java读取Excel文件数据的方法,需要的可以参考下
    2024-01-01
  • Java AOP实现自定义滑动窗口限流器方法详解

    Java AOP实现自定义滑动窗口限流器方法详解

    这篇文章主要介绍了Java AOP实现自定义滑动窗口限流器方法,其中滑动窗口算法弥补了计数器算法的不足,滑动窗口算法把间隔时间划分成更小的粒度,当更小粒度的时间间隔过去后,把过去的间隔请求数减掉,再补充一个空的时间间隔,需要的朋友可以参考下
    2022-07-07
  • MyBatis 多表操作的实现

    MyBatis 多表操作的实现

    这篇文章主要介绍了MyBatis 多表操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot前后端接口对接常见错误小结

    SpringBoot前后端接口对接常见错误小结

    SpringBoot前后端接口对接工作时,经常遇到请求500,400等问题,本文主要介绍了SpringBoot前后端接口对接常见错误小结,感兴趣的可以了解一下
    2022-01-01
  • spring mvc 组合mybatis框架实例详解

    spring mvc 组合mybatis框架实例详解

    本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回数据。对spring mvc 组合mybatis的方法感兴趣的朋友可以参考下本文
    2018-01-01
  • 一文搞懂Java的SPI机制(推荐)

    一文搞懂Java的SPI机制(推荐)

    Java定义了一套JDBC的接口,但并未提供具体实现类,而是在不同云厂商提供的数据库实现包。这篇文章给大家介绍Java的SPI机制,感兴趣的朋友一起看看吧
    2021-11-11
  • java随机生成10位数的字符串ID

    java随机生成10位数的字符串ID

    这篇文章主要为大家详细介绍了java随机生成10位数字符串ID的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Spring Boot利用Java Mail实现邮件发送

    Spring Boot利用Java Mail实现邮件发送

    这篇文章主要为大家详细介绍了Spring Boot利用Java Mail实现邮件发送,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • java项目导出为.exe执行文件的方法步骤

    java项目导出为.exe执行文件的方法步骤

    最近做了个项目,想要转换成可执行文件,那么java项目如何导出为.exe执行文件,本文就介绍一下,主要使用jar2exe软件,感兴趣的可以了解一下
    2021-05-05

最新评论