jdk动态代理的实现流程(事务处理)
- JDK动态代理的定义及功能
- 动态代理就是使用JDK的反射机制创建对象的能力,创建的是代理类的对象,而不是类文件,不用写java文件。
- 动态代理常用的有两类,jdk动态代理和cglib动态代理。将jdk动态代理必须有接口,且代理类对象必须实现接口。没有接口时使用cglib动态代理。
- 主要的功能就是功能增强,在后面代码中我会加以说明。另外一种功能就是控制访问。
- 动态代理的核心方法及思路理解
java.lang.reflect
:反射包,里面有三个类,InvocationHandler , Method, Proxy。- 实现
InvocationHandler
接口,接口中有一个方法invoke(),它表示代理对象要执行的功能代码。- Method类:过Method可以执行某个目标类的方法,
Method.invoke()
,相当于静态代理中你要执行的方法的调用。- Proxy类:核心的对象,创建代理对象。我们通常设置对象都是使用new类的构造方法的方式,在动态代理中,我们使用Proxy类来代替new使用。
- 它有三个参数:(1)
ClassLoader loader
:类加载器,负责向内存中加载对象。(2)Class<?>[] interfaces
:获取目标对象的实现类接口。(3)InvocationHandler
:代理类对象,表示代理类要完成的功能。- 代理类的代码实现与理解
实现代理类对象
我就用动态代理实现事务提交这个功能来举个栗子吧,推荐从测试类中开始开效果更好哦!
public class TransactionInvocationHandler implements InvocationHandler {private Object target;//用来指定要实现动态代理的实现类public TransactionInvocationHandler(Object target){this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {SqlSession session = null;//获取SqlSession用来获取dao层的连接Object obj = null;//方法的返回值对象try{//获取dao层连接,关于这个不懂的同学可以去看看mybatissession = SqlSessionUtil.getSession();//处理业务逻辑,相当于静态代理中的方法执行。在它的前后部分可以编写其他方法,只要使用动态代理对象调用方法,就会执行你在invoke方法前后定义的方法obj = method.invoke(target, args);//处理业务逻辑完毕后,提交事务session.commit();}catch(Exception e){session.rollback();e.printStackTrace();}finally {//使用工具类关闭连接SqlSessionUtil.myClose(session);}return obj;}public Object getProxy(){//参数传入TransactionInvocationHandler这个类对象,用于获取target为目标类的动态代理对象return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}
}
获取service层的动态代理对象的工具类,通过传入的service实现类获取该类动态代理对象
//参数service为service层实现某种方法的实现类对象
public class ServiceFactory {public static Object getService(Object service){return new TransactionInvocationHandler(service).getProxy();}
}
使用动态代理进行测试
public class MyApp {@Testpublic void test01() {//通过new的方式创建静态的service对象StudentService service = new StudentServiceImpl();//添加一条数据试试Student student = new Student();student.setId("1314225");student.setName("xihai");student.setAge(20);//由于sqlsession默认是不自动提交的,所以数据库中并没有插入数据,//具体的dao实现方法insert就自己写吧,我主要不是讲数据库方面内容,只是为了更好的理解才举例说明事务的处理service.insert(student);}@Testpublic void test02() {//使用jdk的Proxy创建动态代理对象StudentService serviceProxy = (StudentService) ServiceFactory.getService(new StudentServiceImpl());//测试添加操作Student student = new Student();student.setId("1314226");student.setName("shengge");student.setAge(21);//插入成功,由于动态代理对象中添加了事务提交功能。/*这里会去执行TransactionInvocationHandler对象中的invoke方法。对象的invoke方法的三个参数分别代表着serviceProxy代理对象,insert方法,student参数。*/serviceProxy.insert(student);}
}
jdk动态代理的实现流程(事务处理)相关推荐
- 静态代理,cglib动态代理,jdk动态代理区别以及流程详解
1.静态代理 静态代理使用的是代理设计模式,不讲高大上的思想,我们直接实战 这是动物接口,其中有一个吃饭方法 这是其中的一只动物,实现了动物接口,覆盖了吃饭方法 现在我们思考,我想要给猫找一个代理,希 ...
- 定时器的实现原理 不消耗cpu_一直在使用JDK动态代理, 不明白原理如何实现?
01.前言 本来动态代理知识点并不在最近文章列表中, 但是在 mybatis 注册 mapper 接口使用到了, 知其然知其所以然 本篇文章是围绕 JDK 动态代理来进行说明, 需要读者掌握基本的反射 ...
- [转]JDK动态代理
代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...
- JDK 动态代理之源码解析
过几天我会分享spring AOP 的相关的代理的源码,为了让大家学好springAOP ,今天先分析jdk 的动态代理 1.首先创建一个接口和一个被代理的对象: package com.nandao ...
- java代理(静态代理和jdk动态代理以及cglib代理)
说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...
- JDK动态代理模式这篇就够了
JDK动态代理 第一章 代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 1.1 什么是代理 代理,在我们日常生活之中 ...
- 23种设计模式——JDK动态代理(AOP)
文章目录 01 代理 1.1 什么是代理? 1.2 为什么要找中介 02 静态代理 2.1 使用代理模式的作用 2.2 实现代理的方式 2.3 具体实现 2.4 静态代理的优缺点 03 动态代理 3. ...
- JDK动态代理为什么必须要基于接口?
前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和反射的底层知识的,我们今天就盘一盘这个问题,走你~ 一个 ...
- 接住喽????,送你个装逼的技能: JDK动态代理
今天讲一个比较深层的知识点:JDK动态代理,这是个可以让小白在大咖面前装逼的神器,顺便送你一个代理模式的温习机会. 代理模式场景 为了引出动态代理的用法,我们先看看代理设计模式,这能让你了解JDK动态 ...
最新文章
- 道阻且长,Libra 项目负责人长文回应一切质疑
- 如何掌握平面设计中的减法思维
- 【面试练习题】使用“暴力”的方法将字符串时间转化为秒数
- Linux:nice函数
- python列表的复制,扯一下浅拷贝与深拷贝的区别
- 喜报!爱卡汽车签约神策数据
- 【转】Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)
- 一个R包完成单细胞基因集富集分析 (全代码)
- 计算机与人脑_人脑和计算机相比,谁具有更强的能力?听完科学家的解释恍然大悟...
- 基于单片机GSM的防火防盗系统的设计
- 《集成电路先进光刻技术与版图设计优化》课程分享之一:典型显微系统的光学成像原理
- 通信原理及系统系列11—— 设计无码间串扰的通信系统(升余弦滚降滤波器)
- 数学建模美赛2019 人生经验
- java实体类中的枚举类型_Java枚举类的使用
- diskgenius克隆硬盘无法启动_克隆分区
- beyond compare文件内容相同依然标红问题+文件过滤
- 计算一阶导数的四阶中心差分格式
- Excel 文件怎么批量插入首页、扉页、尾页?怎么将某个 Excel 文件批量插入到其它 Excel 文件的指定位置?
- 【《Linus Torvalds自传-Linux OS 之父》摘录】
- 有哪些可以用于语文作文中的高级词汇?
热门文章
- 秒、毫秒、微秒、纳秒以及赫兹对应换算表
- ubuntu 刷新频率 如何查看_ubuntu如何调整显示的分辨率和刷新率?
- EditPlus之Java开发环境配置
- 查看.pth文件里面保存了哪些权重及那些权重的shape
- sql if语句实例
- linux能解锁小米手机吗,【BL锁】还在为小米手机如何解锁及解锁后如何加锁而烦恼吗?...
- 希尔伯特变换产生负频率解决方法
- 教你如何用PS制作iOS端APP应用图标AppIcon.appiconset
- 摩尔斯电码(摩斯电码)
- 浅学transcad(与表格链接以及创建矩阵OD并显示期望线)