Spring AOP的底层实现之JDK动态代理

JDK动态代理

Spring AOP的底层实现之JDK动态代理

代码演示

同样新建一个工程,再新建一个包com.jikewenku.aop.demo1。新建一个UserDao接口,完成增删改查方法

package com.jikewenku.aop.demo1;

public interface UserDao {
    public void save();

    public void update();

    public void delete();

    public void find();
}

新建一个实现类UserDaoImpl,实现上述方法,由于我们只是用来测试,直接输出这些方法就行了。

package com.jikewenku.aop.demo1;

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("保存用户...");
    }

    public void update() {
        System.out.println("修改用户...");
    }

    public void delete() {
        System.out.println("删除用户...");
    }

    public void find() {
        System.out.println("查询用户...");
    }
}

新建一个测试类SpringDemo1

package com.jikewenku.aop.demo1;

import org.junit.Test;

public class SpringDemo1 {
    @Test
    public void demo1(){
        UserDao userDao = new UserDaoImpl();

        userdao.save();
        userdao.update();
        userdao.delete();
        userdao.find();
    }
}

运行测试程序,控制台输出了这些信息

Spring AOP的底层实现之JDK动态代理

动态代理代码实现

现在我们要在save之前做权限校验,保存之前先校验一下。这里我们就可以使用代理。

还是在这个包下新建一个类MyJdkProxy

package com.jikewenku.aop.demo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyJdkProxy implements InvocationHandler{
    private UserDao userDao;

    public MyJdkProxy(UserDao userDao){
        this.userDao = userDao;
    }

    public Object createProxy(){
        Object proxy = Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);
        return proxy;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if("save".equals(method.getName())){
            System.out.println("权限校验...");
            return method.invoke(userDao,args);
        }
        return method.invoke(userDao,args);
    }
}

修改我们的测试类

package com.jikewenku.aop.demo1;

import org.junit.Test;

public class SpringDemo1 {
    @Test
    public void demo1(){
        UserDao userDao = new UserDaoImpl();

        UserDao proxy = (UserDao)new MyJdkProxy(userDao).createProxy();
        proxy.save();
        proxy.update();
        proxy.delete();
        proxy.find();
    }
}

运行程序,输出结果,看在保存之前进行了权限校验,这就是动态代理的代码实现。

Spring AOP的底层实现之JDK动态代理

本站所有文章均来自互联网,如有侵权,请联系站长删除。极客文库 » Spring AOP的底层实现之JDK动态代理
分享到:
赞(0)

评论抢沙发

评论前必须登录!