代理模式

客户端不直接访问目标对象,需要通过第三者来实现间接访问对象

代理对象在客户端和目标对象之间起中介作用,能够屏蔽目标对象不想让客户端知道的内容,或增加额外的服务

动态代理

JDK 动态代理:基于接口,利用 JDK API 动态地在内存中构建代理对象,从而实现目标对象的代理功能。称为 JDK 代理或接口代理。

JDK 动态代理例子

  • MapperInvocationHandler 实现 InvocationHandler 接口,实现 invoke 方法,该方法最终是代理类增强的目标类方法
  • JDKProxyFactory 用于生成代理对象的工厂,通过调用 Proxy.newProxyInstance 方法生成代理对象
  • UserMapper 目标类,JDK 代理的目标类必须实现某个接口
  • IUserMapper 目标类接口

MapperInvocationHandler

public class MapperInvocationHandler implements InvocationHandler {
// 动态的目标对象
private Object target; public MapperInvocationHandler(Object target) {
this.target = target;
}
/**
* 增强方法
* @param proxy 代理实例
* @param method 目标方法
* @param args 目标方法参数
* @return 返回值
* @throws Throwable 异常
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("=========JDK 动态代理前置增强=========");
method.invoke(target, args);
System.out.println("=========JDK 动态代理后置增强=========");
return null;
}
}

JDKProxyFactory

public class JDKProxyFactory {
// 动态的目标对象
private Object target; public JDKProxyFactory(Object target) {
this.target = target;
} // 为目标对象生成代理对象
public Object getTargetProxy(){
return Proxy.newProxyInstance(
// 目标对象使用的类加载器
target.getClass().getClassLoader(),
// 目标对象实现的接口
target.getClass().getInterfaces(),
// 事件处理器
new MapperInvocationHandler(target)
);
}
}

IUserMapper

public interface IUserMapper {
void save();
}

UserMapper

public class UserMapper implements IUserMapper {
@Override
public void save() {
System.out.println("保存用户数据");
}
}

Client

public class Client {
public static void main(String[] args) {
JDKProxyFactory jdkProxyFactory = new JDKProxyFactory(new UserMapper());
IUserMapper userMapperProxy = (IUserMapper) jdkProxyFactory.getTargetProxy();
userMapperProxy.save();
}
}

运行结果

=========JDK 动态代理前置增强=========
保存用户数据
=========JDK 动态代理后置增强========= Process finished with exit code 0

JDK 动态代理原理

JDK 动态代理原理的更多相关文章

  1. 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)

    代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...

  2. 【深度思考】聊聊JDK动态代理原理

    1. 示例 首先,定义一个接口: public interface Staff { void work(); } 然后,新增一个类并实现上面的接口: public class Coder implem ...

  3. Java设计模式之JDK动态代理原理

    动态代理核心源码实现public Object getProxy() { //jdk 动态代理的使用方式 return Proxy.newProxyInstance( this.getClass(). ...

  4. 代理模式及jdk动态代理原理

    代理模式 :为其它对象提供代理,以控制对这个对象的访问. 代理模式的特征:代理类(proxyClass)与委托类(realClass)有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转 ...

  5. jdk动态代理原理

    http://www.cnblogs.com/MOBIN/p/5597215.html   请先查看这边博文 此文主要是在上篇博文的基础之上,宏观的理一下思路,因为之前本人看了上篇之后云里雾里(是本人 ...

  6. jdk动态代理使用及原理

    jdk动态代理的使用 1.创建实现InvocationHandler接口的类,实现invoke(Object proxy, Method method, Object[] args)接口,其中invo ...

  7. JDK动态代理与CGLib动态代理相关问题

    导读: 1.JDK动态代理原理是什么?为什么不支持类的代理? 2.JDK动态代理实例 3.CGLib代理原理是什么? 4.CGLib代理实例 5.JDK动态代理与CGLib代理的区别是什么? 6.总结 ...

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

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和 ...

  9. 【深度思考】聊聊CGLIB动态代理原理

    1. 简介 CGLIB的全称是:Code Generation Library. CGLIB是一个强大的.高性能.高质量的代码生成类库,它可以在运行期扩展Java类与实现Java接口, 底层使用的是字 ...

  10. JDK动态代理的实现原理

    学习JDK动态代理,从源码层次来理解其实现原理参考:http://blog.csdn.net/jiankunking/article/details/52143504

随机推荐

  1. AnyCAD应用——修改指定点,线,面的坐标实现物体移动

    课题需求: 三维模型位置随实物位置改变而动态改变的功能,通过顶点位置坐标的改变,修改模型在显示中的位置. 功能验证:目前,可通过选中顶点手动输入坐标的方式,模拟验证此功能. 首先,点击"文件 ...

  2. 给程序员准备的“蜜糍”--SOD框架简介

    注:本文是SOD框架源码仓库的首页介绍,原文地址 一.框架介绍 1,SOD框架是什么? 以前有一个著名的国产化妆品"大宝SOD密",SOD框架虽然跟它没有什么关系,但是名字的确受到 ...

  3. Hexo博客yilia主题使用cnzz统计网站访问量

    使用友盟第三方的统计插件,网址:http://www.umeng.com/ 进入网站先注册账号然后根据下列图片进入添加站点. 添加站点,自己搭建的博客,需要统计访问量的网站(这里加入我的博客网站),然 ...

  4. SVE学习记录- SVE特性以及寄存器

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/SVE_learn_0.html SVE对比NEON有几个新增的地方. 变长的向量 支持Gather-load & ...

  5. [Spring+SpringMVC+Mybatis]框架学习笔记:前言_目录

    下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(一):SpringIOC概述 前言 本笔记用于记录本人(Steven)的SSM框架学习历程,仅用作学习.交流,不用于商业用途, ...

  6. 分别在Windows系统和Linux系统环境安装anaconda3和tensorflow

    Windows系统环境 一.安装anaconda 这里安装的是Anaconda3-2019.03-Windows-x86_64.exe(python3.7版本) 二.检查安装环境 1.若anacond ...

  7. ITIL4与Devops(一)

    目录 一.服务管理与ITIL 1.1 服务管理现状 1.2 服务管理原则 1.3 ITIL版本发展历程 ITIL2 服务支持 服务交付 服务战略 ITIL3 框架 职能 ITIL 2011 流程的基本 ...

  8. linux下的venv使用

    首先安装该模块: sudo apt-get install python3-venv 之后创建用于存储工程的文件夹 mkdir [filename] 创建环境: python3 -m venv ven ...

  9. 浏览器工作原理及V8引擎

    浏览器解析过程 当浏览器加载html资源时,会进行如下的解析过程 遇见 HTML 标记,构建 DOM 树 遇见 style/link 标记调用相应解析器处理CSS标记,并构建出CSS样式树 遇见 sc ...

  10. [shell]在curl测试的data参数中引用变量

    在curl测试的data参数中引用变量 前言 在使用curl接口进行接口传参时,常会使用如下方法: #!/bin/bash url="http://192.168.0.10:8000/api ...