JDK动态代理是通过JDK中的 java.lang.reflect.Proxy 类来实现的。
举例:
1.有如下接口和实现类:
接口:
public interface UserDao { public void save(); public void update(); public void delete(); public void find(); }
实现类:
public class UserDaoImpl implements UserDao { public void save() { System.out.println("save 添加用户"); } public void update() { System.out.println("update 修改用户"); } public void delete() { System.out.println("delete 删除用户"); } public void find() { System.out.println("find 查询用户"); } }
2.创建切面类MyAspect
public class MyAspect { public void myBefore(){ System.out.println("方法执行前"); } public void myAfter(){ System.out.println("方法执行后"); } }
3.创建MyBeanFactory类,在该类中通过Proxy实现动态代理
public class MyBeanFactory { public static UserDao getBean(){ // 1.准备目标类 final UserDao userDao = new UserDaoImpl(); // 在spring中通过注入获取单例对象 //2.创建切面类 final MyAspect myAspect = new MyAspect(); //3.使用代理类,进行增强 return (UserDao)Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),new Class[]{UserDao.class},new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { //增强前 myAspect.myBefore(); Object obj = method.invoke(userDao,args); //增强后 myAspect.myAfter(); return obj; } }); }
这里模拟了Spring框架Ioc思想
代理类主要是对创建的实例中的方法进行增强
4.测试
@Test public void demo3(){ UserDao userDao = MyBeanFactory.getBean(); userDao.save(); userDao.delete(); userDao.find(); userDao.update(); }
测试结果:
5.总结:JDK动态代理模式可以减少系统间的重复代码,达到模块间的松耦合目的,让方法只关注于业务本身。