1. <br>public class UserDAOImpl{
  2. <br><br>    public void save() {
  3. <br>        // TODO Auto-generated method stub
  4. <br>        System.out.println("user saved");
  5. <br>    }
  6. <br>}
  7. <br>//相关配置,省略了一些不相关内容
  8. <br><bean id="userDAO" class="UserDAOImpl">
  9. <br><bean id="userDAOProxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  10. <br>    <property name="target">
  11. <br>        <ref local="userDAO" />
  12. <br>    </property>
  13. <br></bean>

測试代码

  1. ApplicationContext ctx =
  2. <br>            new FileSystemXmlApplicationContext("applicationContext.xml");
  3. <br>        UserDAOImpl userDAOImpl =
  4. <br>            (UserDAOImpl)ctx.getBean("userDAOProxy");
  5. <br>        userDAOImpl.save();

上面这样的情况下程序能够正常执行,可是假设UserDAOImpl实现了一个接口,其它不变

  1. public class UserDAOImpl implements UserDAO {
  2. <br>
  3. <br>    public void save() {
  4. <br>        // TODO Auto-generated method stub
  5. <br>        System.out.println("user saved");
  6. <br>    }
  7. <br>
  8. <br>}

这样的情况下,程序将不能正常执行,会抛出java.lang.ClassCastException异常

理解上面这样的情况产生的原因须要了解Spring AOP的实现原理。

Spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。

下面是JDK动态代理和CGLIB代理简介
    JDK动态代理:其代理对象必须是某个接口的实现。它是通过在执行期间创建一个接口的实现类来完毕对目标对象的代理。

CGLIB代理:实现原理类似于JDK动态代理,仅仅是它在执行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。

Spring是依靠什么来推断採用哪种代理策略来生成AOP代理呢?下面代码就是Spring的推断逻辑

advisedSupport.isOptimize()与advisedSupport.isProxyTargetClass()默认返回都是false,所以在默认情况下目标对象有没有实现接口决定着Spring採取的策略。当然能够设置advisedSupport.isOptimize()或者advisedSupport.isProxyTargetClass()返回为true。这样不管目标对象有没有实现接口Spring都会选择使用CGLIB代理。所以在默认情况下,假设一个目标对象假设实现了接口Spring则会选择JDK动态代理策略动态的创建一个接口实现类(动态代理类)来代理目标对象。能够通俗的理解这个动态代理类是目标对象的另外一个版本号。所以这两者之间在强制转换的时候会抛出j ava.lang.ClassCastException。而所以在默认情况下,假设目标对象没有实现不论什么接口,Spring会选择CGLIB代理, 其生成的动态代理对象是目标类的子类。

以上说的是默认情况下。也能够手动配置一些选项使Spring採用CGLIB代理。

org.springframework.transaction.interceptor.TransactionProxyFactoryBean是org.springframework.aop.framework. ProxyConfig的子类,所以能够參照ProxyConfig里的一些设置例如以下所看到的,将optimize和proxyTargetClass随意一个设置为true都能够强制Spring採用CGLIB代理。

  1. //相关配置,省略了一些不相关内容
  2. <br><bean id="userDAO" class="UserDAOImpl">
  3. <br><bean id="userDAOProxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  4. <br>    <property name="target">
  5. <br>        <ref local="userDAO" />
  6. <br>    </property>
  7. <br>    <property name="optimize">
  8. <br>        <value>true</value>
  9. <br>    </property>
  10. <br>    <property name="proxyTargetClass">
  11. <br>        <value>true</value>
  12. <br>    </property>
  13. <br></bean>

使用CGLIB代理也就不会出现前面提到的ClassCastException问题了,

也能够在性能上有所提高,可是也有它的弊端,Spring doc原文解释例如以下optimization will usually mean that advice changes won't take effect after a proxy has been created. For this reason, optimization  is disabled by default。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5177571.html,如需转载请自行联系原作者

IT忍者神龟之Java动态代理与CGLib代理相关推荐

  1. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

    第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation ...

  2. Java静态代理、动态代理与CGLib代理

    java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...

  3. java代理(静态代理和jdk动态代理以及cglib代理)

    说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...

  4. 静态代理,JDK动态代理和CGLIB代理入门学习

    之前面试时面试官问我:"你知道spring中有哪几种代理吗?" 啊?代理?啥子代理?VPN代理吗?嘿嘿,面试官你要种子直说啊......被刷下来了.好吧,入门学习下代理. 为什么需 ...

  5. 设计模式-代理模式(静态代理、动态代理、cglib代理)

    文章目录 代理模式 静态代理 动态代理 cglib代理 应用 代理模式 代理模式(Proxy Pattern)是一种结构性模式.代理模式为一个对象提供了一个替身,以控制对这个对象的访问.即通过代理对象 ...

  6. Java动态代理与Cglib代理

    为什么80%的码农都做不了架构师?>>>    最近又继续回来死磕Spring源码,以前看的也忘得差不多了,这次先把Spring使用的动态代理cglib看了一下,打好基础知识. cg ...

  7. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

  8. Java动态代理和Cglib动态代理最强王者阵容

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨黎杜 来源丨非科班的科班(LDCldc1230 ...

  9. AspectJ和Spring AOP(java动态代理和CGLIB)简单介绍

    1.AOP介绍 什么是AOP:AOP就是面向切面编程.使用的背景: 1)我们的振隆维护着一千个方法,一天老板让振隆把这一千个方法都要加上事务代码(统一代码) 2)振隆咬咬牙,添加了一个新的方法,然后让 ...

  10. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

最新文章

  1. JavaScript修饰器-让代码更干净
  2. python中的map、filter、reduce函数
  3. php fpm子进程数配置,php-fpm进程管理方式以及子进程数量配置原则详解
  4. 计算机网络体系结构及协议
  5. 免费领取40本前端学习书籍【高清电子版】
  6. 记使用Python+Pandas和Scipy库计算TRIMMEAN(截尾均值)的demo
  7. 旷视回顾全球十大AI治理事件,技术与伦理安全如何进行落地
  8. 中国联通智慧客服项目31省集约收官,百度智能客服服务全国最多用户
  9. 12-16 云计算平台基础架构
  10. python class tynu()_Pisanie pierwszej aplikacji Django, część 4.
  11. 3D游戏编程与设计——粒子系统
  12. 【阅读】A Comprehensive Survey on Electronic Design Automation and Graph Neural Networks——EDA+GNN综述翻译
  13. 【知乎】我的知乎收藏夹——新奇故(nao)事(dong)篇
  14. 借助计算机音乐,计算机音乐教育在高校中的重要性
  15. Filmage Converter for mac - 全能的音视频转换器「m1兼容」
  16. 实木地板被机器人弄成坑_实木地板被修家具的压出凹痕看了心里难过怎么办
  17. 用ollydbg手脱ArmadilloV3.60加壳的DLL
  18. 【2022/02/04】thinkphp源码详细阅读(二)
  19. Python实现自动化给视频实时加字幕,软件已打包!
  20. 简述java的跨平台性是什么,为什么具有跨平台性

热门文章

  1. maven不引入parent_Maven 如何将本地的项目发布到 Archiva 中
  2. 士林变频器面板如何调速度_工业电气设计|变频器在应用中的故障处理实例分享...
  3. python通过什么对象连接数据库_介绍Python 数据库的Connection、Cursor两大对象
  4. go语言项目目录文件的管理样式
  5. python numpy diff_Python numpy.uint16方法代码示例
  6. html单元格选中状态,UITableViewCell 设置单元格选中后只显示一个打勾的状态
  7. 浙江理工大学机械复试c语言真题,2016年浙江理工大学机械与自动控制学院计算机应用基础)之C程序设计复试笔试最后押题五套卷...
  8. 面向过程编程与面向对象编程
  9. Silverlight 2中多语言支持实现(下)
  10. SQL Server内存