• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

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

编程语言 Geekerstar 11个月前 (05-29) 459次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

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 <a href="https://www.jikewenku.com/tag/spring" title="查看更多关于Spring的文章" target="_blank">Spring</a>Demo1 {
    @Test
    public void demo1(){
        UserDao userDao = new UserDaoImpl();

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

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

动态代理代码实现

现在我们要在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 <a href="https://www.jikewenku.com/tag/spring" title="查看更多关于Spring的文章" target="_blank">Spring</a>Demo1 {
    @Test
    public void demo1(){
        UserDao userDao = new UserDaoImpl();

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

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


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring AOP的底层实现之JDK动态代理
喜欢 (0)
[247507792@qq.com]
分享 (0)
Geekerstar
关于作者:
本站技术支持

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00