@Transaction:  http://blog.csdn.net/bao19901210/article/details/41724355

Spring上下文:  http://blog.csdn.net/yang123111/article/details/32099329

情况是这样的:

  1. @Transactional
  2. public void test(){
  3. System.out.println("1 insert db...");
  4. try {
  5. ((XxxService)AopContext.currentProxy()).add2();
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. }
  9. }
  10.  
  11. @Transactional(propagation=Propagation.REQUIRES_NEW)
  12. public void add2() throws Exception{
  13. System.out.println("2 insert db...");
  14. int i = 1;
  15. if(i ==1 )
  16. throw new RuntimeException("保存add2错误");
  17. }

出现错误: com.sun.proxy.$Proxy27 cannot be cast to xxxService

Spring的文档中这么写的:

  Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。如果被代理的目标实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理

解决办法2种:

1:JDK方式  新建一个Service调用add2方法.

1.1 创建获取Spring上下文的工具类

  1. package com.utils;
  2.  
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.ApplicationContextAware;
  6.  
  7. public class ContextUtil implements ApplicationContextAware {
  8.  
  9. private static ApplicationContext applicationContext; // Spring应用上下文环境
  10.  
  11. /*
  12. * 实现了ApplicationContextAware 接口,必须实现该方法;
  13. * 通过传递applicationContext参数初始化成员变量applicationContext
  14. */
  15. public void setApplicationContext(ApplicationContext applicationContext)
  16. throws BeansException {
  17. ContextUtil.applicationContext = applicationContext;
  18. }
  19.  
  20. public static ApplicationContext getApplicationContext() {
  21. return applicationContext;
  22. }
  23.  
  24. @SuppressWarnings("unchecked")
  25. public static <T> T getBean(String name) throws BeansException {
  26. return (T) applicationContext.getBean(name);
  27. }
  28.  
  29. }

1.2  配置xml

  1. <bean id="contextUtil" class="com.utils.ContextUtil" scope="singleton" />

1.3  调用

  1. // IXxxService 接口类
  2. IBoxStatusService iBoxStatusService = (IBoxStatusService)ContextUtil.getBean("boxStatusService");
  3. iBoxStatusService.add2();

注意,此处的IBoxStatusService 是接口类

2 Cglib方式

1.1 导入cglib包

1.2 配置xml

  1. <aop:config proxy-target-class="true" expose-proxy="true">
  1. proxy-target-class="true" 默认是false 表示使用Cglib代理
  1. expose-proxy="true" 默认是false 表示 目标对象内部的自我调用将无法实施切面中的增强
  2.  
  3. 1.3
  1. ((BoxStatusService)AopContext.currentProxy()).add2();
  1.  

Spring @Trasactionl 失效, JDK,CGLIB动态代理的更多相关文章

  1. Spring Boot @Trasactionl 失效, JDK,CGLIB动态代理

    来自: https://www.cnblogs.com/sweetchildomine/p/6978037.html?utm_source=itdadao&utm_medium=referra ...

  2. 代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  3. 基于SpringBoot实现AOP+jdk/CGlib动态代理详解

    动态代理是一种设计模式.在Spring中,有俩种方式可以实现动态代理--JDK动态代理和CGLIB动态代理. JDK动态代理 首先定义一个人的接口: public interface Person { ...

  4. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  5. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  6. Spring AOP详解 、 JDK动态代理、CGLib动态代理

    AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码 ...

  7. spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能

    一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了.--->JDK的动态代理机制只能代理实现了接口的类,而不能 ...

  8. 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

    Spring AOP详解 . JDK动态代理.CGLib动态代理  原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...

  9. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

随机推荐

  1. WIFI_仿手机写wifi应用程序_WDS

    2-1.1_15节_使用WIFI网卡6_仿手机写wifi操作程序============================== 1. 仿手机写一个WIFI操作程序,作为STA,有这几个功能:a. 自动扫 ...

  2. k最邻近算法——加权kNN

    加权kNN 上篇文章中提到为每个点的距离增加一个权重,使得距离近的点可以得到更大的权重,在此描述如何加权. 反函数 该方法最简单的形式是返回距离的倒数,比如距离d,权重1/d.有时候,完全一样或非常接 ...

  3. Angular 4 绑定

    一.事件绑定 1. 创建doOnClick函数 2. 网页中绑定doOnClick方法 3. 效果图 二. 属性绑定 1. 定义imgUrl的网址 2. 定义img  src属性 另外一种写法 3. ...

  4. Angularjs+ThinkPHP3.2.3集成微信分享JS-SDK实践

    先来看看微信分享效果: 在没有集成微信分享js-sdk前是这样的:没有摘要,缩略图任意抓取正文图片   在集成微信分享js-sdk后是这样的:标题,摘要,缩略图自定义   一.下载微信SDK开发包 下 ...

  5. Netty源码分析之NioEventLoop(一)—NioEventLoop的创建

    一.NioEventLoop的概述 NioEventLoop做为Netty线程模型的核心部分,从本质上讲是一个事件循环执行器,每个NioEventLoop都会绑定一个对应的线程通过一个for(;;)循 ...

  6. webpack创建library及从零开始发布一个npm包

    最近公司有个需求,我们部门开发一个平台项目之后,其他兄弟部门开发出的插件我们可以拿来直接用,并且不需要我们再进行打包,只是做静态的文件引入,研究一波后发现,webpack创建library可以实现. ...

  7. bzoj2048 书堆

    Description Input 第一行正整数 N M Output 一行(有换行符),L,表示水平延伸最远的整数距离 (不大于答案的最大整数) 贪心地把最高的书尽量向右放可以得到最优解,因而最高的 ...

  8. HSSF NPOI 颜色

    using System; using System.IO; using System.Windows.Forms; using NPOI.HSSF.UserModel; using NPOI.SS. ...

  9. Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(五)技能属性集(AttributeSet)

    如果没有完成前面的教程,请前往学习.先上一段理论介绍(源于https://wiki.unrealengine.com/GameplayAbilities_and_You#GameplayTasks): ...

  10. javascript事件处理程序的3个阶段

    第一阶段:HTML事件处理阶段.就是在元素里面添加onclick之类的属性来调用某个函数. <input type="button" value="单击" ...