2021-07-08_动态代理之CGLIB动态代理的实现

3 篇文章 0 订阅

1.动态代理的作用

动态代理的作用是实现AOP功能

2.代理实现功能描述

本次演示动态实现功能:为已经具有登录功能的方法增加权限控制

3.CGLIB动态代理和JDK动态代理区别

JDK动态代理是jdk自带功能,只能针对接口进行代理
CGLIB动态代理是spring功能,针对没有接口的类进行代理

4.动态代理步骤

 * 实现动态代理的步骤
1.创建目标类,不需要接口,与jdk代理的区别
 2.创建MethodInterceptor接口的实现类,在invoke方法中完成要代理类的功能
   		2.1.调用目标方法
		2.2 增强功能
 3.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型

5.代码实现
5.1 创建具有登录功能的类

public class LoginService {
    public boolean login(String username, String password) {
        //登录目标方法,验证用户名和密码是否正确
        System.out.println("执行目标类目标方法,验证用户名和密码是否正确");
        if("wensheng".equals(username) && "123456".equals(password)){
            System.out.println("用户名和密码验证正确");
            return true;
        }else{
            System.out.println("用户名和密码验证错误");
            return false;
        }
    }
}

5.2创建MethodInterceptor接口的实现类,在invoke方法中完成要代理类的功能

package com.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibDynamicProxy  implements MethodInterceptor {

    private Object target = null;

    //创建代理对象
    public Object  getProxyInstance(Object target) {
        //给目标对象赋值
        this.target = target;
        //声明增强类类型
        Enhancer enhancer = new Enhancer();
        //设置被代理的类字节码,CGLIB根据字节码生成被代理类子类
        enhancer.setSuperclass(this.target.getClass());
        //设置要代理的拦截器,回调函数,即一个方法拦截
        enhancer.setCallback(this);
        //创建代理对象实例
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object res = null;
        res = method.invoke(target,objects);//执行目标方法,即调用目标方法

        //以下为增强功能方法
        if(res != null){
            boolean b = (boolean)res;
            //如果b为true,表示用户名密码都在正确,否则表示不正确
            //如果用户名密码都正确,则去进行权限验证,否则不进行验证直接返回false
            if(b){
                //此处进行权限验证的方法,具体方忽略,权限正确返回true,权限错误返回false
                System.out.println("验证当前用户是否有登录权限");

                res = true;
            }else{
                res = false;
            }
        }
        return res;
    }
}

5.3使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型

package com.cglib;

import com.jdk.service.impl.LoginService;

/**
 * 实现cglib动态代理的步骤
 *  1.创建目标类,不需要接口,与jdk代理的区别
 *  3.创建MethodInterceptor接口的实现类,在invoke方法中完成要代理类的功能
 *      3.1.调用目标方法
 *      3.2 增强功能
 *  4.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型
 */
public class main {
    public static void main(String[] args) {
        LoginService loginService = new LoginService();
        CglibDynamicProxy cglib = new CglibDynamicProxy();
        LoginService proxy = (LoginService) cglib.getProxyInstance(loginService);
        boolean b = proxy.login("wensheng","123456");
        System.out.println(b);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DYS_房东的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值