当前位置: 首页 > news >正文

7-设计模式-代理模式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

代理模式

什么是代理?

通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现)  ,AOP核心技术面向切面编程。

代理应用场景

安全代理 可以屏蔽真实角色

远程代理 远程调用代理类RMI

延迟加载 先加载轻量级代理类,真正需要在加载真实

代理的分类

静态代理(静态定义代理类)

动态代理(动态生成代理类)

Jdk自带动态代理

Cglib 、javaassist(字节码操作库)

静态代理

静态代理需要自己生成代理类

public interface Hose {

	/**
	 * 
	 * @methodDesc: 功能描述:(买房代理)
	 * @author: 余胜军
	 * @param:
	 * @createTime:2017年8月27日 上午2:54:34
	 * @returnType: void
	 * @copyright:上海每特教育科技有限公司
	 */
	public void mai();

}

public class XiaoMing implements Hose {
	@Override
	public void mai() {
		System.out.println("我是小明,我要买房啦!!!!haha ");
	}
}
class Proxy  implements Hose {
	private XiaoMing xiaoMing;
	public Proxy(XiaoMing xiaoMing) {
		this.xiaoMing = xiaoMing;
	}
	public void mai() {
		System.out.println("我是中介 看你买房开始啦!");
		xiaoMing.mai();
		System.out.println("我是中介 看你买房结束啦!");
	}
	public static void main(String[] args) {
		Hose proxy = new Proxy(new XiaoMing());
		proxy.mai();
	}
}

JDK动态代理(不需要生成代理类)

实现InvocationHandler 就可以了。

public interface Hose {

	/**
	 * 
	 * @methodDesc: 功能描述:(买房代理)
	 * @author: 余胜军
	 * @param:
	 * @createTime:2017年8月27日 上午2:54:34
	 * @returnType: void
	 * @copyright:上海每特教育科技有限公司
	 */
	public void mai();

}


public class XiaoMing implements Hose {

	@Override
	public void mai() {
		System.out.println("我是小明,我要买房啦!!!!haha ");
	}

}
public class JDKProxy implements InvocationHandler {
	private Object tarjet;

	public JDKProxy(Object tarjet) {
		this.tarjet = tarjet;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("我是房产中介.....开始监听你买房啦!");
		Object oj = method.invoke(tarjet, args);
		System.out.println("我是房产中介.....结束监听你买房啦!");
		return oj;

	}

}

class Test222 {
	public static void main(String[] args) {
		XiaoMing xiaoMing = new XiaoMing();
		JDKProxy jdkProxy = new JDKProxy(xiaoMing);
		Hose hose=(Hose) Proxy.newProxyInstance(xiaoMing.getClass().getClassLoader(), xiaoMing.getClass().getInterfaces(), jdkProxy);
		hose.mai();
	}

}

CGLIB动态代理


import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public interface Hose {

	/**
	 * 
	 * @methodDesc: 功能描述:(买房代理)
	 * @author: 余胜军
	 * @param:
	 * @createTime:2017年8月27日 上午2:54:34
	 * @returnType: void
	 * @copyright:上海每特教育科技有限公司
	 */
	public void mai();

}


public class XiaoMing implements Hose {

	@Override
	public void mai() {
		System.out.println("我是小明,我要买房啦!!!!haha ");
	}

}

public class Cglib implements MethodInterceptor {

	@Override
	public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		System.out.println("我是买房中介 , 开始监听你买房了....");
		Object invokeSuper = methodProxy.invokeSuper(o, args);
		System.out.println("我是买房中介 , 开结束你买房了....");
		return invokeSuper;

	}

}

class Test22222 {
	public static void main(String[] args) {
		Cglib cglib = new Cglib();
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(XiaoMing.class);
		enhancer.setCallback(cglib);
		Hose hose = (Hose) enhancer.create();
		hose.mai();
	}
}

CGLIB与JDK动态代理区别

区别:

java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 

2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

 

 

 

转载于:https://my.oschina.net/u/3578766/blog/1612243

相关文章:

  • 如何统计序列中元素的出现频度
  • DirectX3D设备丢失(lost device)的处理(一)
  • Ubuntu12.04_X64 apt-get install 报错404
  • 面试必问的volatile,你了解多少?
  • Day04——Python模块
  • [UWP]附加属性2:实现一个Canvas
  • 微信支付demo 报错解决方案:ld: symbol(s) not found for architecture arm64 clang: error: lin
  • java ftp上传方法
  • SQLServer 复制中移除和添加发布而不初始化所有项目
  • gitignore的配置
  • CXF WebService中传递复杂对象(List、Map、Array)
  • 常规活动页面制作
  • Oracle、PostgreSQL的对象命名规则
  • Spring Cloud教程 (一)云原生应用程序
  • Eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • DOM的那些事
  • Git 使用集
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java精华积累:初学者都应该搞懂的问题
  • log4j2输出到kafka
  • Netty源码解析1-Buffer
  • 力扣(LeetCode)56
  • 聊聊flink的TableFactory
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 新手搭建网站的主要流程
  • 一道闭包题引发的思考
  • 一份游戏开发学习路线
  • 最近的计划
  • 带你开发类似Pokemon Go的AR游戏
  • #ifdef 的技巧用法
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $$$$GB2312-80区位编码表$$$$
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (分布式缓存)Redis哨兵
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十八)三元表达式和列表解析
  • (算法)N皇后问题
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)程序员疫苗:代码注入
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .sdf和.msp文件读取
  • ??在JSP中,java和JavaScript如何交互?
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [BZOJ1008][HNOI2008]越狱
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [BZOJ2850]巧克力王国
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C++]拼图游戏
  • [CF407E]k-d-sequence