2021-08-20 学习笔记(代理模式)

代理模式:
代理相当于对被代理对象的方法的一种增强
(一) 静态代理
代理对象和被代理对象必须实现同一个接口,代理对象会调用被代理对象本身的方法并且代理对象会做出扩展

package com.lzq.dao.proxy;

import java.util.Date;


import com.lzq.dao.DemoDaoimpl;
import com.lzq.dao.IDemoDao;

//代理对象与被代理对象实现同一个接口
public class DemoDaoProxy implements IDemoDao{
	
	//被代理的目标对象
	private DemoDaoimpl target = new DemoDaoimpl();
	
	@Override
	public int excuteInsert() {
		long begin = System.currentTimeMillis();
		System.out.println("[增强功能]:excuteInsert方法于"+new Date()+"开始");
		
		//调用被代理对象
		int rows = target.excuteInsert();
		
		long end = System.currentTimeMillis();
		System.out.println("[增强功能]:excuteInsert方法于"+new Date()+"结束");
		System.out.println("[增强功能]耗时"+(end-begin)+"ms");
		
		return rows;
	}

(二)动态代理
动态代理主要有两种方式,第一种是基于jdk反射机制,第二种是第三方的基于Cglib实现动态代理
基于jdk反射机制的动态代理须用接口实现既目标对象必须有接口,主要利用Proxy类和InvocationHandler接口实现
Proxy.newProxyInstance()方法的三个参数分别为①目标对象的类加载器,②目标对象的实现接口,③当前类,即回调到当前类的invoke()方法

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

public class JdkProxyFactory implements InvocationHandler{
	
	//目标对象
	private Object target;
	
	//有参构造方法
	public JdkProxyFactory(Object target) {
		this.target = target;
	}
	
	public Object creatProxy() {
		
		
		Class targetClass =  target.getClass();
		
		//1.类加载器
		//2.实现的接口
		//3.当前类(invocationHadeler接口的实现类 )
		Object newProxy = Proxy.newProxyInstance(targetClass.getClassLoader(), targetClass.getInterfaces(), this);
		
		return newProxy; 
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		long begin = System.currentTimeMillis();
		System.out.println("[增强功能]:"+method.getName()+"方法于"+new Date()+"开始");
		
		//invoke(目标对象,方法参数)
		Object returnValue = method.invoke(target, args);
		
		System.out.println("[增强功能]:"+method.getName()+"excuteInsert方法于"+new Date()+"结束");
		long end = System.currentTimeMillis();
		System.out.println("[增强功能]耗时"+(end-begin)+"ms");
		
		return returnValue ;
	}
}

基于Cglib的动态代理,主要利用Enhancer类和MethodInterceptor接口实现,在创建代理对象方法createProxy()中,enhancer.setSuperclass()方法的参数为目标对象的父类信息,enhancer.setCallback()回调当前类的intercept()方法,然后enhancer.create()方法创建出代理对象

import java.lang.reflect.Method;
import java.util.Date;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class CglibProxyFactory implements MethodInterceptor{
	
	private Object target;
	
	public CglibProxyFactory(Object target) {
		this.target = target;
	}
	
	public Object createProxy() {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(target.getClass());
		enhancer.setCallback(this);
		
		Object newProxy = enhancer.create();
		
		return newProxy;
	}
	
	@Override
	public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
		long begin = System.currentTimeMillis();
		System.out.println("[增强功能]:"+method.getName()+"方法于"+new Date()+"开始");
		
		Object returnVal = method.invoke(target, arg2);
		
		System.out.println("[增强功能]:"+method.getName()+"excuteInsert方法于"+new Date()+"结束");
		long end = System.currentTimeMillis();
		System.out.println("[增强功能]耗时"+(end-begin)+"ms");
		
		return returnVal;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值