按照平时写代码的习惯,我们会定义一个service接口

package com.proxy.test;
public interface UserService {public void sayHello(String word);
}

接着是实现类

package com.proxy.test;
public class UserServiceImpl implements UserService{@Overridepublic void sayHello(String word) {System.out.println("执行dao的删除操作,添加一个用户:" + word);System.out.println("执行dao的删除添加,删除一个用户:" + word);}
}

我们的目的是,执行sayHello中的添加删除操作时,让这几条sql语句同时提交(commit)或同时回滚(rollback),下面我们用动态代理的方式,实现这个功能:
自定义一个代理管家,帮我们创建代理类,需要实现InvocationHandler接口(必须)

package com.proxy.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class MyProxyManager implements InvocationHandler {private Object target;public Object bind(Object target){this.target = target;/** Proxy.newProxyInstance 会返回一个代理对象* target.getClass() --> 被代理对象的ClassLoader,这里实际对应UserServiceImpl类* target.getClass().getInterfaces() --> 被代理对象实现的接口列表(UserService),指定之后,代理对象就可以使用其接口中的方法了* this -- 表示的是当这个动态代理对象在调用方法的时候,会通过哪个InvocationHandler,这里实际是MyProxyManager这个类*/return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}/*** 我们通过MyProxyManager创建出来的代理对象在调用自己的方法时,* 会通过invoke这个方法进行调用,而不是直接调用* @param proxy 被代理对象* @param method 被代理对象执行的方法* @param args 被代理对象执行的方法所需要的参数**/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) {System.out.println("我是动态代理对象");System.out.println("准备进入事务..");Object result = null;try{// 执行被代理对象自己的方法result = method.invoke(target, args);}catch(Exception e){// 如果有错误,执行数据库的rollBack方法System.out.println("执行rollBack");}// 如果没错,执行数据库的commit方法System.out.println("执行commit");System.out.println("-----------------------");return result;}
}

测试代码

public static void main(String[] args) {MyProxyManager manager = new MyProxyManager();// 创建UserService的代理对象UserService userService = (UserService) manager.bind(new UserServiceImpl());userService.sayHello("lalala");
}

运行看一下效果:

我是动态代理对象
准备进入事务..
执行dao的删除操作,添加一个用户:lalala
执行dao的删除添加,删除一个用户:lalala
执行commit

这里只是使用打印语句简单模拟了数据库的操作,没有真正连接数据库操作,有空的童鞋可以实际操作一下。


我们平时用到的spring的事务管理、springmvc的interceptor都是aop的实例
spring把事务操作放到了代理类中统一commit或rollback
interceptor本身就是一个代理类,在调用指定方法前后添加一系列操作

使用动态代理简单模拟一下spring的事务管理相关推荐

  1. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...

  2. batch spring 重复执行_一个3年老javaer竟然连Spring的事务管理都不知道,惊呆了

    1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 这里我们以取钱的例子来讲解:比如你去ATM ...

  3. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述 事务管理对于企业应用来说是至 ...

  4. 初见Spring之事务管理

    初见Spring之事务管理 在很多业务的场景下,需要对数据库进行操作,在对访问数据库的时候,尤其是对数据的内容进行增删改操作时,引入事务就是必要的了.在通常情况下利用Java自带的JDBC操作完成事务 ...

  5. spring,mybatis事务管理配置与@Transactional注解使用

    spring,mybatis事务管理配置与@Transactional注解使用 概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性. Spring Framewor ...

  6. Spring 的事务管理

    Spring 事务的隔离级别和传播行为 try catch 对 Spring 事务的影响 一.Spring 事务管理的两种方式 1️⃣编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理.编程 ...

  7. Spring不同事务管理方式与声明式事务管理局部回滚处理方案

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分.  DataS ...

  8. 谈Spring的事务管理

    开篇前  Spring发展至今已到v5,本篇旨在探究Spring对于事务管理的方式的发展变化,算是对许久以来使用的总结,同时也希望和想深入Spring事务管理的小伙伴们做一个分享.  开篇  Spri ...

  9. Spring入门——事务管理Transaction Manager

    1.事务初识 事务是逻辑上的一组操作,要么全部成功,要么全部失败. 事务具有ACID特性,参考百度百科,具体如下: 原子性(Atomicity):整个事务中的所有操作,要么全部完成,要么全部不完成,不 ...

最新文章

  1. android 获取资源文件 r.drawable中的图片转换为drawable、bitmap
  2. Oracle:管理 date类型 interval 动态变化的分区:查询、删除
  3. Design Pattern IDisposable Pattern C
  4. java安装_使用Java 9模块化来发布零依赖本机应用程序
  5. python是不是特别垃圾-Python里的垃圾回收机制是什么意思,搞不懂?
  6. 【转】Kettle集群
  7. Python BaseHTTPServer 模块解析
  8. bzoj#4555. [Tjoi2016Heoi2016]求和
  9. java大文件解析_java大文件(百M以上)的上传下载实例解析
  10. LeetCode 646. 最长数对链
  11. springbank 开发日志 springbank是如何执行一个handler的requestMapping对应的方法的
  12. Windows server 2008 R2桌面调出“计算机”等图标
  13. byte数组转为string 去掉转义符_三道简单的 String 面试题干趴下了 n 多大牛!
  14. ssh密码长度漏洞java_CVE-2016-2183,CNNVD-201608-448|DES和Triple DES密码算法信息泄露漏洞 - 信息安全漏洞门户 VULHUB...
  15. 电子凸轮设计之数学基础设计
  16. [966]无需ROOT就能让你用上Xposed框架
  17. IDEA学生授权申请方式(免费)
  18. Cherry键盘外接Mac command按键失灵
  19. Ubuntu根目录的各个文件夹的介绍
  20. 视频后期调色,PR调色分享,lumetri color调色

热门文章

  1. centos 安装 openfire
  2. HTML5实践 -- 使用css装饰你的图片画廊 - part2
  3. freemarker-ide eclipse安装地址 安装方法 页面静态化
  4. .classpath文件
  5. 编写安装配置DHCP服务脚本
  6. hibernate笔记(三) Hibernate标识符属性(主键)生成策略全析
  7. spark VS Hadoop 两大大数据分析系统深度解读
  8. Word2Vec 使用总结
  9. Java Web学习总结(22)——使用kaptcha生成验证码
  10. Xbox One:微软商店中都是Xbox One的主题