博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
7-设计模式-代理模式
阅读量:5927 次
发布时间:2019-06-19

本文共 3246 字,大约阅读时间需要 10 分钟。

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

你可能感兴趣的文章
Mysql安装及自动化部署脚本方案
查看>>
margin-top绑架父节点问题的分析
查看>>
javascript事件之:jQuery事件中实例对象和拓展对象之间的通信
查看>>
使用CDN引用jQuery
查看>>
基于zookeeper的solrCloud集群搭建
查看>>
javaBean
查看>>
线性代数与矩阵论 习题 1.2.2
查看>>
Ubuntu 12.10 安装官方JDK
查看>>
spring boot 整合mybatis
查看>>
opencv---颜色空间转化并实现物体跟踪
查看>>
数组与链表的对比
查看>>
企业文化和价值观
查看>>
rest-framework-权限组件
查看>>
管理Apache服务器访问日志
查看>>
前端几个笔试题及答案(bd)
查看>>
读取数量不定的输入数据
查看>>
由逻辑异或运算符而发现的PHP诡异运算符优先级
查看>>
lost connection to MySQL server at waiting for initial communication packet,system error:o
查看>>
Android 编译时:m、mm、mmm、mma、mmma的区别
查看>>
JavaScript校验网址
查看>>