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

在Spring中发现java.lang.ClassCastException: $Proxy1问题解析

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

碰到这样的错误提示信息一般是spring中AOP代理配置出现问题,在spring中代理的配置基本上有这么两种一种是基于JDK,而另外一种是CGLIB的代理。
基于JDK的代理是面向接口的,所有使用 Proxy 的对象都必须定义一个接口,而且用这些对象的代码也必须是对接口编程的,Proxy 生成的对象是接口一致的而不是对象一致的。Proxy 毕竟是通过反射实现的,必须在效率上付出代价:有实验数据表明,调用反射比一般的函数开销至少要大 10 倍。而且,从程序实现上可以看出,对 proxy class 的所有方法调用都要通过使用反射的 invoke 方法。因此,对于性能关键的应用,使用 proxy class 是需要精心考虑的,以避免反射成为整个应用的瓶颈。
CGLib代理同jdk代理采用不同的方式,它是采用修改java类文件而得到的。利用了CGLIB调用ASM库,ASM 能够通过改造既有类,直接生成需要的代码。增强的代码是硬编码在新生成的类文件内部的,没有反射带来性能上的付出。
新建一个公共类:

public class UserManager extends HibernateDaoSupport {
 private Hashtable<NetUserinfo, Long> userDao = new Hashtable<NetUserinfo, Long>();
 private Hashtable<NetRoleinfo, Long> roleDao = new Hashtable<NetRoleinfo, Long>();
 public UserManager() {
 }
 public void saveUser() {
  HibernateTemplate ht = this.getHibernateTemplate();
  List<NetUserinfo> lst = this.getHibernateTemplate().find(
    "from NetUserinfo");
  for (NetUserinfo userinfo : lst) {
   System.out.println(userinfo.getUserName());
  }
 }
}

第一种采用JDK代理:
applicationContext.xml 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation">
   <value>classpath:hibernate.cfg.xml</value>
  </property>
</bean>
<bean id="userManager" class="sx.cj.security.service.UserManager" scope="prototype">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>

测试:

ApplicationContext appContext = new ClassPathXmlApplicationContext(
    new String[] { "applicationContext-common.xml", "applicationContext-beans.xml" });
IUserManager userManager = (IUserManager) appContext.getBean("userManager");
userManager.saveUser();

在测试文件中必须采用接口的方式,才能获得BEAN对象。
第二种:采用CGLIB代理
applicationContext.xml

    <bean id="userManager"
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="target">
            <bean class="sx.cj.security.service.UserManager">
                <property name="sessionFactory" ref="sessionFactory"/>
            </bean>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
        <property name="proxyTargetClass" value="true">
        </property>
    </bean>

测试文件

 ApplicationContext appContext = new ClassPathXmlApplicationContext(
    new String[] { "applicationContext-common.xml",
      "applicationContext-beans.xml" });
  UserManager userManager = (UserManager) appContext
    .getBean("userManager");
  userManager.saveUser();

你可以只用对象而不需要使用接口。

转载于:https://my.oschina.net/u/2300159/blog/1114055

相关文章:

  • (转)setTimeout 和 setInterval 的区别
  • Bing正在让Image Graphic变得更加实用、吸引人
  • 持久数据层框架设计(二)
  • 《编译原理实践与指导教程》——第1章 词法分析与语法分析
  • gtest中如何跳出当前测试案例
  • linux-image-2.6.27-7-generic_2.6.27-7.16_i386.deb 无法安装
  • 安防设备:传统与智能差异在何处?
  • 微软确认Windows 7可降级至XP
  • 一键获取软硬件配置及管理员组
  • AMD发布第七代Pro A系列APU:面向企业
  • 草食系的“恋爱秘方”
  • 体验SCCM 2007 R2新特性-Reporting Services 报表订阅
  • 美国司法部:苹果三星专利侵权案应发回重申
  • windows编程入门之结构
  • 外媒称黑石集团或10亿美元出售文思海辉
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【面试系列】之二:关于js原型
  • 2017届校招提前批面试回顾
  • ERLANG 网工修炼笔记 ---- UDP
  • Java多线程(4):使用线程池执行定时任务
  • LeetCode29.两数相除 JavaScript
  • 构建工具 - 收藏集 - 掘金
  • 前端_面试
  • 新版博客前端前瞻
  • 用jQuery怎么做到前后端分离
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​如何在iOS手机上查看应用日志
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)鸿鹄云架构一服务注册中心
  • (转)c++ std::pair 与 std::make
  • .md即markdown文件的基本常用编写语法
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET值类型变量“活”在哪?
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @vue/cli 3.x+引入jQuery
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [100天算法】-不同路径 III(day 73)
  • [acm算法学习] 后缀数组SA
  • [Android学习笔记]ScrollView的使用
  • [Angular] 笔记 6:ngStyle
  • [Apio2012]dispatching 左偏树
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C++] sqlite3_get_table 的使用
  • [CCIE历程]CCIE # 20604