JDK动态代理

2019-08-09 00:00:00 代理 动态 jdk

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();

    }

测试结果:

《JDK动态代理》

5.总结:JDK动态代理模式可以减少系统间的重复代码,达到模块间的松耦合目的,让方法只关注于业务本身。

 

相关文章