spring aop原理之一jdk动态代理

jdk 动态代理是代理模式的一种。只能对实现了接口的类产生代理。是spring aop 的底层技术之一,与cglib动态代理(对没有实现接口的类产生代理对象)相互补充。

这篇文章简单介绍下jdk动态代理是如何实现的。
  • 首先 jdk动态代理是对实现接口的类而言的,我们首先创建一个接口
    创建了增删改查的方法,
package aop_jdkproxy;

/**
 * @Author: Han Yu
 * @Description:
 * @Date: Create in 11:24 2019/1/15
 */
public interface UserService {
    void save();
    void update();
    void delete();
    void find();
}

  • 然后 创建类实现这个接口
package aop_jdkproxy;

/**
 * @Author: Han Yu
 * @Description:
 * @Date: Create in 16:05 2019/1/14
 */
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用户");
    }

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

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

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

  • 那么现在问题来了,我们想验证用户有没有调用这些方法的权限,这个时候怎么办呢,如果是不交权限我们既可以直接通过下面的代码调用方法
UserService userService = new UserServiceImpl();
   		userService .delete();
      	userService  .update();
        userService  .find();
        userService  .save();
  • 但是现在需要权限校验 我们引入jdk动态代理,使用jdk动态代理 对UserService产生代理
package aop_jdkproxy;

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

/**
 * @Author: Han Yu
 * @Description: 使用jdk动态代理  对UserService产生代理
 * @Date: Create in 16:05 2019/1/14
 */
public class JdkProxy implements InvocationHandler {

    //将被增强的对象传递到代理当中
    private UserService userService;
    public JdkProxy(UserService userService){
        this.userService =userService;

    }


    /**
        *@Author: Han Yu
        *@Description: 产生UserService代理的方法
        *@Param:
        *@Return:
        *@Date:   Create in 11:44 2019/1/15

    */
    public UserService createProxy(){

        //第一个参数类加载器
        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),this);
        return userServiceProxy;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //判断方法名是不是我们要增强的哪个方法名
        if("save".equals(method.getName()))
        {
            //增强
            System.out.println("增强 权限校验");
            return method.invoke(userService,args);

        }else{

        }
        return method.invoke(userService,args);
    }
}

  • 测试类
package aop_jdkproxy;

import org.junit.Test;

/**
 * @Author: Han Yu
 * @Description:
 * @Date: Create in 16:05 2019/1/14
 */
public class UserTest {

    @Test
    //jdk动态代理
    public void userServiceTest(){
        UserService userService= new UserServiceImpl();
        //创建代理
        UserService proxy = new JdkProxy(userService).createProxy();
        proxy .save();


    }
}

  • 结果
  • 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值