文章目录
- 前言
- 概要
- SpringBoot中使用
- 小结
前言
当我们需要在Java中实现动态代理时,通常会考虑使用 JDK原生动态代理
或者 CGLIB动态代理
。
我这里说一下CGLIB动态代理,并给出一个例子。
概要
CGLIB
(Code Generation Library)是一个基于字节码生成的类库,用于在运行时动态生成类的子类。它常被用于实现基于类的动态代理。这种方式不要求被代理的类必须实现接口,因此可以代理没有实现接口的类。
CGLIB的工作原理:
- CGLIB通过生成目标类的子类来实现动态代理。
- 当需要代理一个类时,CGLIB会创建一个该类的子类,并在子类中重写需要代理的方法。
- 这允许我们在方法调用前后插入自定义逻辑,实现方法的增强。
SpringBoot中使用
第一步:导入依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
第二步:java代码实现
//被代理的类
class OriginalClass {
public void doSomething() {
System.out.println("原方法");
}
}
核心逻辑:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
// Enhancer用于生成代理类 它是CGLIB库中的一个关键类
Enhancer enhancer = new Enhancer();
// OriginalClass被代理的类(父类)
// CGLIB会生成一个OriginalClass的子类作为代理类。
enhancer.setSuperclass(OriginalClass.class);
// 设置拦截器 拦截器会在代理类的方法调用前后执行一些自定义逻辑
//用了java的匿名内部类来创建了一个实现MethodInterceptor接口的对象
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("原方法:" + method.getName() + "执行前");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("原方法:" + method.getName() + "执行后");
return result;
}
});
// 创建代理对象
OriginalClass proxy = (OriginalClass) enhancer.create();
// 调用代理对象的方法(比原方法多一些功能)
proxy.doSomething();
}
}
intercept()
参数解释
o: 目标对象的实例。
method: 被调用的方法对象。
objects: 方法的参数数组。
methodProxy: 方法的代理对象,可以调用父类方法。
methodProxy.invokeSuper()作用:调用目标对象的方法(methodProxy子类的实例)
结果
小结
CGLIB动态代理在许多框架和库中都有广泛应用,它是实现AOP(面向切面编程)的重要基础之一,也是许多ORM(对象关系映射)框架的核心技术之一
有用就点个赞~~~~