美文网首页
028 Cglib代理

028 Cglib代理

作者: 双鬼带单 | 来源:发表于2021-11-26 21:54 被阅读0次

Cglib代理

Java 提供的静态代理和动态代理模式都是要求目标对象实现一个接口,但是有时候目标对象只是一个单独的对象(例如hibernate中的model活着springMVC中的controller),并没有实现任何的接口,这个时候就可以使用以目标对象子类的方式实现搭理,其中实现的方法就是:Cglib代理

Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展.

JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现.

Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的被许多AOP的框架使用,例如Spring AOPsynaop,为他们提供方法的interception(拦截)

Cglib包的底层是通过使用一个小而快的字节码处理框架ASM来转换字节码并生成新的类.不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉.

Cglib子类代理实现方法:

  1. 需要引入cglib的jar文件,但是Spring的核心包中已经包括了Cglib功能,所以直接引入spring-core.jar即可.
  2. 引入功能包后,就可以在内存中动态构建子类
  3. 代理的类不能为final,否则报错
  4. 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.

代码示例:
目标对象类:UserDao.java

/**
 * 目标对象,没有实现任何接口
 */
public class LoginController implements ILogin {

    public void login(String userName, String password) {
        // 用户验证登录操作
    }

    public void logout(String userName) {
        // 用户退出操作
    }
}

Cglib代理工厂:ProxyFactory.java

public class ProxyFactory implements MethodInterceptor{
    //维护目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    //给目标对象创建一个代理对象
    public Object getProxyInstance(){
        //1.工具类
        Enhancer en = new Enhancer();
        //2.设置父类
        en.setSuperclass(target.getClass());
        //3.设置回调函数
        en.setCallback(this);
        //4.创建子类(代理对象)
        return en.create();

    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("开始事务...");

        //执行目标对象的方法
        Object returnValue = method.invoke(target, args);

        System.out.println("提交事务...");

        return returnValue;
    }
}

测试类:

public class App {

    @Test
    public void test(){
        //目标对象
        UserDao target = new UserDao();

        //代理对象
        UserDao proxy = (UserDao)new ProxyFactory(target).getProxyInstance();

        //执行代理对象的方法
        proxy.save();
    }
}

在Spring的AOP编程中:

如果加入容器的目标对象有实现接口,用JDK代理

如果目标对象没有实现接口,用Cglib代理

相关文章

  • 028 Cglib代理

    Cglib代理 Java 提供的静态代理和动态代理模式都是要求目标对象实现一个接口,但是有时候目标对象只是一个单独...

  • 浅谈Java代理二:Cglib动态代理-MethodInterc

    CGLib动态代理特点:使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM...

  • Java下的两种代理

    代理 JDK动态代理 CGLIB动态代理 CGLIB(Code Generation Library)是一个基于A...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • 源码基础 -- 动态代理(2)

    再看java动态代理之Cglib动态代理,早期大家选择Cglib主要是因为Cglib底层采用ASM字节码生成框架,...

  • # 源码解析:AOP(2)

    接上篇# 源码解析:AOP cglib类代理 使用cglib实现的代理与jdk代理类似,只是代理对象的构造方式不同...

  • 2019-04-27_CGlib相关概念

    CGlib相关概念 1.****CGlib概述 cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对...

  • java代理笔记:静态代理、JDK动态代理、CGlib动态代理

    1.静态代理 JDK动态代理 CGlib动态代理

  • java动态代理

    目前动态代理主要有两种形式,jdk和cglib代理,其中动态代理是基于接口的代理,而cglib是基于类的动态代理。...

网友评论

      本文标题:028 Cglib代理

      本文链接:https://www.haomeiwen.com/subject/bvgxxrtx.html