spring的AOP(二)----JDK动态代理

来源:互联网 发布:淘宝购买送货入户 编辑:程序博客网 时间:2024/05/17 22:32

JDK动态代理在1.3的时候引入,其底层需要依赖一个工具类java.lang.reflect.Proxy和一个接口java.lang.reflect.InvocationHandler

JDK 动态代理 必须基于 接口进行代理

这里写图片描述

代码示例:
JdkProxyUtils.java

package com.my.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//对目标对象 创建 JDK 动态代理 (工具类)public class JdkProxyUtils implements InvocationHandler {    // 代理目标对象    private Object target;     public JdkProxyUtils(Object target) {        this.target = target;    }    //通过invoke调用 目标对象 方法    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        System.out.println("执行JDK代理增强!!!!!!");        return method.invoke(target, args); // 调用目标对象方法    }    // 为目标对象创建代理    public Object createProxy(){        // loader 目标对象类加载器        // interfaces 目标对象实现接口        // h  回调对象,需要invocationhandler 执行目标对象方法        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);    }}

UserDao.java

package com.my.jdkproxy;//用户操作接口public interface UserDao {    public void save();    public void update();    public void delete();}

UserDaoImpl.java

package com.my.jdkproxy;//用户操作实现类public class UserDaoImpl implements UserDao {    @Override    public void save() {        System.out.println("保存用户。。。");    }    @Override    public void update() {        System.out.println("更新用户。。。");    }    @Override    public void delete() {        System.out.println("删除用户。。。");    }}

Test.java

package com.my.jdkproxy;public class Test {    // 没有代理编程    @org.junit.Test    public void demo1(){        System.out.println("没有代理编程");        // 业务对象        UserDao userDao = new UserDaoImpl();        userDao.save();        userDao.update();        userDao.delete();        System.out.println("----------------");    }    // 应用JDK动态代理    @org.junit.Test    public void demo2(){        System.out.println();        System.out.println("应用JDK动态代理");        // 目标对象        UserDao userDao = new UserDaoImpl();        // 为目标对象 创建JDK动态代理        JdkProxyUtils jdkProxyUtils = new JdkProxyUtils(userDao);// 传入目标对象        UserDao proxy = (UserDao) jdkProxyUtils.createProxy(); // 必须根据接口创建代理         // 调用代理对象方法        proxy.save(); // 执行 InvocationHandler 的 invoke方法        proxy.update();        proxy.delete();    }}

运行结果:
这里写图片描述

原创粉丝点击