初识代理——Proxy
无处不在的模式——Proxy
最近在看《设计模式之禅》,看到代理模式这一章的时候,发现自己在写spring项目的时候其实很多时候都用到了代理,无论是依赖注入、AOP还是其他,可以说是无处不在。
于是自己便自己摸索写了一些小例子,当然也参考了网上其他博主的博客,毕竟小白一枚hhhhhh
进入正题:
图1-1:代理Proxy
代理模式现在主流的有两大类:1、JDK代理 2、CGLB代理
(JDK静态代理就不说了,网上很多都有,主要我觉得现在面向企业项目,静态代理局限性有点大,对于我而言可能就只是去了解了一下,而并没有说想要去深入这个)
Th1:JDK动态接口代理(需要实现InvocationHandler接口中的invoke(...)方法,必须实现某个接口)
public class MyJdkProxy implements InvocationHandler { // 目标对象
public Object target; // 初始化传入代理对象
public MyJdkProxy(Object target){
this.target = target;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("xsc");
return method.invoke(target,args);
} public Object newProxy(){
// 获取代理目标对象实例
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
}
Th2:CGLB动态接口代理(需要实现MethodInterceptor接口中的intercept(...)方法,当然也可无需实现接口,可直接代理类)
public class MyCgljProxy implements MethodInterceptor { // 目标对象
public Object target; // 初始化传入代理对象
public MyCgljProxy(Object target){
this.target = target;
} @Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cj");
return methodProxy.invoke(target,objects);
} public Object newProxy(){
// 获取代理目标对象实例
return Enhancer.create(target.getClass(),this);
}
}
Th3:测试类Test.java
public class Test{
// 需要代理的接口
interface Subject{
void sayHi();
void sayHallo();
} // 代理接口实现类
static class SubjectImpl implements Subject{ @Override
public void sayHi() {
System.out.println("Hi");
} @Override
public void sayHallo() {
System.out.println("Hello");
}
} public static void main(String[] args) {
// JDK动态接口代理方式
Subject target1 = new SubjectImpl();
MyJdkProxy proxy = new MyJdkProxy(target1);
target1 = (Subject) proxy.newProxy(); target1.sayHallo();
target1.sayHi(); System.out.println("----------------------------"); // CGLB动态接口代理方式
Subject target2 = new SubjectImpl();
MyCgljProxy myCgljProxy = new MyCgljProxy(target2);
target2 = (Subject) myCgljProxy.newProxy();
target2.sayHi();
target2.sayHallo();
}
}
Th4:测试结果
总结:
当然这些只是简单的代理,感觉其实一通百通,目的都是为对象提供个代理来控制对其的访问,而我们的代理类则委托预处理、过滤、转发消息,以及委托后进行的后续处理,解决了在直接访问对象时可能带来的问题
革命尚未成功,同志仍需努力~~~~
初识代理——Proxy的更多相关文章
- 代理(Proxy)和反射(Reflection)
前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...
- 深度揭秘ES6代理Proxy
最近在博客上看到关于ES6代理的文章都是一些关于如何使用Proxy的例子,很少有说明Proxy原理的文章,要知道只有真正掌握了一项技术的原理,才能够写出精妙绝伦的代码,所以我觉得有必要写一篇关于深刻揭 ...
- Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试
Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试 会撸码的小马 关注 2018.05.29 17:30* 字数 212 阅读 1488评论 0喜欢 2 接到上一章, ...
- 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...
- JAVA设计模式-动态代理(Proxy)示例及说明
在Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析文章的最后部分,我们提到了动态代理的概念,下面我们就简单了解一下动态代理. 一,概念 代理设计模式的目的就是在不直接操作对象的前 ...
- JAVA设计模式-动态代理(Proxy)源码分析
在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...
- java动态代理--proxy&cglib
大纲 代理 proxy cglib 小结 一.代理 为什么要用代理?其实就是希望不修改对象的情况下,增强对象. 静态代理: 静态代理模式,需要代理类和目标类实现同一接口,代理类的方法调用目标类的方法, ...
- 神秘代理-Proxy
前言: 代理模式作为常见的设计模式之一,在项目开发中不可或缺.本文就尝试着揭开代理的神秘面纱,也欢迎各路人批评指正! 1.如何实现代理: [假设有个关于汽车移动(move)的计时需求]设计:Movea ...
- 动态代理proxy与CGLib的区别
什么是代理? 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib 与JDK动态代理的区别 代理模式是Java中常见的一种模式,英文名字叫走Proxy或者Surrogat ...
随机推荐
- java虚拟机-JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
一.背景 1.1 永久代(PermGen)在哪里? 根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了): 上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域. 关于方 ...
- JDK1.8集合之HashMap
目录 简介 内部实现 类的属性 Node数组 重要方法 put()和putVal()方法 get()和getNode()方法 resize()方法 容量设置为2的幂的优点 计算Hash时候 扩容时候 ...
- IDEA为新手专业打造
IDEA为新手专业打造 一.创建一个项目 新手的话可以先创建一个空项目 项目创建完成后会弹出一个Project Settings设置框,点击Project进行如图设置,设置完成点击OK 一.在创建的项 ...
- .Net Core 创建和使用中间件
1. 定义中间内容 1.1 必须有一个RequestDelegate 委托用了进入一个中间件 1.2 通过构造函数设置这个RequestDelegate委托 1.3 必须有一个方法Task Invok ...
- Java编程思想:构建复杂模型
import sun.nio.cs.Surrogate; import java.util.ArrayList; import java.util.Random; public class Test ...
- Excel催化剂开源第33波-Quick Bible For PPT插件项目全代码开源
很感恩,能够在上帝奇妙地带领下,经过多方的资源整合后,可以从我手中完成一款对教会内部制作PPT过程中,引用圣经的这个小环节能够发挥一些小小的作用的小插件.因制作本插件时,也大量用到VSTO开发的一些技 ...
- C语言入门1-计算机工作原理
一. 计算机与人工智能.计算机系统: 计算机工作原理:计算机的基本原理是存储程序和程序控制,预先要把指挥计算机如何进行操作的指令序列(称为程序)和原始数据通过输入设备输送到计算机内存贮器中.每一条指令 ...
- Catalan公式
f(n)=f(1)*f(n-1)+f(2)*f(n-2)+f(3)*f(n-3)+......+f(n-1)*f(1) 例用:一个长度为n的无重复序列入栈的所有出栈方式
- linux初学者-网络桥接篇
linux初学者-网络桥接篇 在网络的使用中,有时需要搭建网络桥来实现网络桥接.例如在一台主机上制作一台虚拟机,虚拟机是没有物理网卡的,这时虚拟机数据的发送和接收就需要通过主机上的物理网卡,需要主机的 ...
- 使用redis分布式锁解决并发线程资源共享问题
众所周知, 在多线程中,因为共享全局变量,会导致资源修改结果不一致,所以需要加锁来解决这个问题,保证同一时间只有一个线程对资源进行操作 但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一 ...