使用CGLIB实现动态代理

参考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments

CGLIB动态代理

定义:CGLIB(code genaration libary), 代码自动生成类库。

在程序运行中自动生成扩展类和实现java接口,是一个强大的高性能的代码生成包

CGLIB动态代理的实现

1)、导入cglib所需的jar包

2)、实现MethodIntercetor类,实现代理类对象的具体逻辑

       重写intercept()方法,在intercept方法中实现代理的逻辑

      intercept(Object o, Method method, Object[] Objects, MehodProxy methodProxy )

       o: 被代理类对象

        method: 被代理类的方法

    objects: 被代理类方法的参数

     methodProxy: 调用被代理类对象的参数

3)、使用Enhance生成代理类对象

          enhance.create() //生成代理类对象

使用CGLIB实现延迟加载

MehodInterceptor实现类:

/**
 * 实现代理的逻辑
 * 步骤:
 *   --: 1、实现MethodInterceptor拦截器
 *        o: 被代理对象
 *        method: 被代理对象的方法
 *        objects: 被代理对象的方法参数
 *        methodProxy: 触发父类方法的对象
 */
public class DBQueryCglibMethodInterceptor implements MethodInterceptor {
    DBQuery dbQuery = null;
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
           if(dbQuery == null){
               dbQuery = new DBQuery();
           }
           return dbQuery.Request();
    }
}

真实类:

/**
 * 使用cglib来实现数据库的查询
 */
public class DBQuery {
    public String Request(){
        return "数据库查询完毕";
    }
}

使用类:

public class Client {
    public static void main(String[] args) {
        /**
         * 创建增强类对象
         */
        Enhancer enhancer = new Enhancer();

        /**
         * 创建增强类的父类对象
         */
        enhancer.setSuperclass(DBQuery.class);

        /**
         * 创建拦截切入类
         */
        enhancer.setCallback(new DBQueryCglibMethodInterceptor());

        /**
         * 创建代理对象
         */
        DBQuery dbQueryProxy = (DBQuery) enhancer.create();
        String result = dbQueryProxy.Request();
        System.out.println(result);
    }
}

结果:

数据库查询完毕

使用CGLIB增强原有类的功能

MethodIntercptor实现类

/**
 * cglib代理逻辑切入类
 *  ---: intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
 *       o: 被代理类对象
 *       method: 要拦截的被代理类的方法
 *       objects:被代理类的方法参数
 *       methodyProxy: 要触发父类的方法对象
 */
public class CglibMethodInteceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("插入前置通知");
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("插入后置通知");
        return object;
    }
}

真实类:

/**
 * 使用cglib实现动态代理,不用创建接口
 */
public class HelloService {
    HelloService(){
        System.out.println("HelloServie构造器");
    }

    public final String sayOthers(String name){
        System.out.println("HelloService: sayOthers" +name);
        return null;
    }

    public void sayHello(){
        System.out.println("HelloService: sayHello");
    }

    public void sayByeBye(){
        System.out.println("HelloService: sayByeBye");
    }
}

使用类:

public class Client {
    public static void main(String[] args) {
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
        /**
         * 创建增强类对象
         */
        Enhancer enhancer = new Enhancer();

        /**
         * 创建需要增强的父类对象
         */
        enhancer.setSuperclass(HelloService.class);

        /**
         * 设置切入类对象
         */
        enhancer.setCallback(new CglibMethodInteceptor());

        /**
         * 生成代理对象
         */

        HelloService service = (HelloService) enhancer.create();
        service.sayHello();
        service.sayByeBye();
    }
}

结果:

HelloServie构造器
插入前置通知
HelloService: sayHello
插入后置通知
插入前置通知
HelloService: sayByeBye
插入后置通知

原文地址:https://www.cnblogs.com/Auge/p/11579283.html

时间: 2024-11-09 04:00:49

使用CGLIB实现动态代理的相关文章

基于jdk和cglib的动态代理

动态代理是Spring Aop的基础,分为基于JDK的动态代理和基于CGLIB的动态代理. 声明一个被代理的类: package com.maheng.proxy.jdk; public interface IUser { public void save(String name); } package com.maheng.proxy.jdk; public class User implements IUser{ @Override public void save(String name)

JDK动态代理和Cglib的动态代理

最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需要被代理的类需要有接口,否则无法实现 package proxy.dynamic; public interface IBook { void add(); } 实现接口的类如下 package proxy.dynamic; public class Book implements IBook { @Override public void add() { System.

好记性不如烂笔头47-java拦截器-用CGLib实现动态代理(2)

动态代理技术是整个java技术系统中非常重要的一环,它是我们能够深入学习java框架的基础,是深入了解Spring等框架时要掌握的基础知识之一. Java中自带的动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高.

cglib实现动态代理简单使用

Boss: package proxy.cglib; public class Boss{ public void findPerson() { System.out.println("我要找java架构师"); } } WebApp: package proxy.cglib; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.prox

JDK和CGLIB生成动态代理类的区别

 关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代理:程序员事先写好代理对象类,在程序发布前就已经存在了: 动态代理:应用程序发布后,通过动态创建代理对象. 其中动态代理又可分为:JDK动态代理和CGLIB代理. 1.JDK动态代理 此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前

cglib的动态代理

前言 jdk中的动态代理通过反射类Proxy和InvocationHandler回调接口实现,要求委托类必须实现一个接口,只能对该类接口中定义的方法实现代理,这在实际编程中有一定的局限性. cglib实现 使用cglib[Code Generation Library]实现动态代理,并不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码,下面通过一个例子看看使用CGLib如何实现动态代理.1.定义业务逻辑 public class UserServiceImpl { publ

cglib 的动态代理

接着JDK 的动态代理的内容一起写的 ①目标类 public class GirlWaiter{ public void serve() { System.out.println("上菜"); }} public class Advice { public void smile() { System.out.println("微笑服务"); } public void discount() { System.out.println("打折服务")

cgLib生成动态代理

package com.stono.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor { private Enhancer

JDK动态代理和CGLIB动态代理

转载自http://www.itzhai.com/java-dong-tai-dai-li-zhi-jdk-dong-tai-dai-li-he-cglib-dong-tai-dai-li-mian-xiang-qie-mian-bian-cheng-aop-yuan-li.html 静态代理 静态代理相对来说比较简单,无非就是聚合+多态: 参考:设计模式笔记 – Proxy 代理模式 (Design Pattern) 动态代理 我们知道,通过使用代理,可以在被代理的类的方法的前后添加一些处理方