Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
package cn.jdk.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* jdk的动态代理
* @author Administrator
*InvocationHandler接口是proxy代理实例的调用处理程序实现的一个接口,
*每一个proxy代理实例都有一个关联的调用处理程序;
*在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法。
*/
public class JdkProxy implements InvocationHandler {
private UserDao userDao;
public JdkProxy(UserDao userDao) {
super();
this.userDao = userDao;
}
public UserDao createProxy(){
UserDao proxy=(UserDao) Proxy.newProxyInstance(userDao.getClass()
.getClassLoader(),userDao.getClass().getInterfaces(), this);//还可以用匿名类
return proxy;
}
//调用 目标对象的任何一个方法都相当于调用invoke()
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
//如何是add方法执行多一个日志记录操作
if("add".equals(method.getName())){
//记录日志
System.out.println("****************日志记录**************");
Object result=method.invoke(userDao, args);
}
return method.invoke(userDao ,args);
}
}
测试方法 :
package cn.jdk.proxy;
import org.junit.Test;
public class SpringTest {
//普通方法
@Test
public void test(){
UserDao userDao=new UserDaoImpl();
userDao.add();
userDao.update();
}
//采用代理模式
@Test
public void demo2(){
UserDao userDao=new UserDaoImpl();
UserDao proxy=new JdkProxy(userDao).createProxy();//生成代理
proxy.add();
proxy.update();
}
}
关于动态代理,看了一个博客总结比较详细:https://blog.youkuaiyun.com/yaomingyang/article/details/80981004。有兴趣的可以延伸阅读。