• 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动态代理的实现流程(事务处理)相关推荐

  1. 静态代理,cglib动态代理,jdk动态代理区别以及流程详解

    1.静态代理 静态代理使用的是代理设计模式,不讲高大上的思想,我们直接实战 这是动物接口,其中有一个吃饭方法 这是其中的一只动物,实现了动物接口,覆盖了吃饭方法 现在我们思考,我想要给猫找一个代理,希 ...

  2. 定时器的实现原理 不消耗cpu_一直在使用JDK动态代理, 不明白原理如何实现?

    01.前言 本来动态代理知识点并不在最近文章列表中, 但是在 mybatis 注册 mapper 接口使用到了, 知其然知其所以然 本篇文章是围绕 JDK 动态代理来进行说明, 需要读者掌握基本的反射 ...

  3. [转]JDK动态代理

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

  4. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...

  5. JDK 动态代理之源码解析

    过几天我会分享spring AOP 的相关的代理的源码,为了让大家学好springAOP ,今天先分析jdk 的动态代理 1.首先创建一个接口和一个被代理的对象: package com.nandao ...

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

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

  7. JDK动态代理模式这篇就够了

    JDK动态代理 第一章 代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 1.1 什么是代理 代理,在我们日常生活之中 ...

  8. 23种设计模式——JDK动态代理(AOP)

    文章目录 01 代理 1.1 什么是代理? 1.2 为什么要找中介 02 静态代理 2.1 使用代理模式的作用 2.2 实现代理的方式 2.3 具体实现 2.4 静态代理的优缺点 03 动态代理 3. ...

  9. JDK动态代理为什么必须要基于接口?

    前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和反射的底层知识的,我们今天就盘一盘这个问题,走你~ 一个 ...

  10. 接住喽????,送你个装逼的技能: JDK动态代理

    今天讲一个比较深层的知识点:JDK动态代理,这是个可以让小白在大咖面前装逼的神器,顺便送你一个代理模式的温习机会. 代理模式场景 为了引出动态代理的用法,我们先看看代理设计模式,这能让你了解JDK动态 ...

最新文章

  1. 道阻且长,Libra 项目负责人长文回应一切质疑
  2. 如何掌握平面设计中的减法思维
  3. 【面试练习题】使用“暴力”的方法将字符串时间转化为秒数
  4. Linux:nice函数
  5. python列表的复制,扯一下浅拷贝与深拷贝的区别
  6. 喜报!爱卡汽车签约神策数据
  7. 【转】Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)
  8. 一个R包完成单细胞基因集富集分析 (全代码)
  9. 计算机与人脑_人脑和计算机相比,谁具有更强的能力?听完科学家的解释恍然大悟...
  10. 基于单片机GSM的防火防盗系统的设计
  11. 《集成电路先进光刻技术与版图设计优化》课程分享之一:典型显微系统的光学成像原理
  12. 通信原理及系统系列11—— 设计无码间串扰的通信系统(升余弦滚降滤波器)
  13. 数学建模美赛2019 人生经验
  14. java实体类中的枚举类型_Java枚举类的使用
  15. diskgenius克隆硬盘无法启动_克隆分区
  16. beyond compare文件内容相同依然标红问题+文件过滤
  17. 计算一阶导数的四阶中心差分格式
  18. Excel 文件怎么批量插入首页、扉页、尾页?怎么将某个 Excel 文件批量插入到其它 Excel 文件的指定位置?
  19. 【《Linus Torvalds自传-Linux OS 之父》摘录】
  20. 有哪些可以用于语文作文中的高级词汇?

热门文章

  1. 秒、毫秒、微秒、纳秒以及赫兹对应换算表
  2. ubuntu 刷新频率 如何查看_ubuntu如何调整显示的分辨率和刷新率?
  3. EditPlus之Java开发环境配置
  4. 查看.pth文件里面保存了哪些权重及那些权重的shape
  5. sql if语句实例
  6. linux能解锁小米手机吗,【BL锁】还在为小米手机如何解锁及解锁后如何加锁而烦恼吗?...
  7. 希尔伯特变换产生负频率解决方法
  8. 教你如何用PS制作iOS端APP应用图标AppIcon.appiconset
  9. 摩尔斯电码(摩斯电码)
  10. 浅学transcad(与表格链接以及创建矩阵OD并显示期望线)