package cn.itcast.spring3; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * JDK的动态代理的机制 * @author zhongzh * */ 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);//InvocationHandler这里也可以使用匿名内部类 return proxy; } //调用目标对象的任何一个方法都相当于调用invoke();这个方法都会执行. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub if("add".equals(method.getName())){//增强add()方法 //记录日志 System.out.println("日志记录=============================================");//如果方法名是add(),记录日志 Object result = method.invoke(userDao, args);//记录日志之后执行添加用户的代码 //如果是add()方法那么在add()方法之前做了一个事情然后才执行add()方法. return result; } return method.invoke(userDao, args); } }
package cn.itcast.spring3; /** * DAO的接口 * @author zhongzh * */ public interface UserDao { public void add(); public void update(); }
package cn.itcast.spring3; public class UserDaoImpl implements UserDao { public void add() { // TODO Auto-generated method stub System.out.println("添加用户...."); } public void update() { // TODO Auto-generated method stub System.out.println("修改用户....."); } }
package cn.itcast.spring3; import org.junit.Test; public class SpringTest1 { @Test public void demo1(){ 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(); } }