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