今天来看看CGLIB动态代理的实现
- 个人感觉CGLIB的动态代理比JDK动态代理要简单一点
- jdk动态代理要求被代理的类是实现接口的,即jdk动态代理的前提是你代理的类有实现接口,但是很多情况下类不一定会实现有接口,甚至接口中的方法也不一定是你想代理的。这时候就需要一种可以直接基于类的动态代理方式,cglib就是这样一种基于类的动态代理方式。
先说注意事项:一开始我在jdk17上使用这个cglib动态代理,一直报错,怀疑是pom.xml导包的问题然后搞了好一阵子还是报错,于是我决定使用jdk1.8来进行实验。朋友们,这里是jdk1.8哈!当然如果知道在jdk17怎么使用这个cglib的话十分欢迎留言,教教孩子吧!
下面正式开始
- 先导入cglib的依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.7</version>
</dependency>
- 下面给大伙看看我的目录结构
- zmain是最终测试的,里面就一个main方法
- origin_class是原来的类,就是需要被代理的类
- cglibProxy是对被代理类的方法的代理增强,换言之,这个就是动态代理的关键
- origin_class类
public class origin_Class {
public void sayHello(){
System.out.println("this is origin");
}
public void sayGood(){
System.out.println("this is good");
}
}
- 可以看到这里就是定义了两个方法哈
- 接下来是关键的cglib动态代理过程,实现
MethodInterceptor
接口
public class cglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
String name = method.getName();
System.out.println("the method name is "+name);
return methodProxy.invokeSuper(o,objects);
}
}
- 重写里面的intercept方法,方法原来的调用使用MethodProxy.invokeSuper()实现,和jdk动态代理那里类似
- 我这里做的增强工作是把每个方法的方法名打印出来
- 创建动态代理实例
public class zmain {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(origin_Class.class);
enhancer.setCallback(new cglibProxy());
origin_Class ans = (origin_Class)enhancer.create();
ans.sayGood();
ans.sayHello();
}
}
- 这个过程十分简单,就是创建一个enhancer实力,然后通过
setSuperclass
设置被代理的类的class对象,然后通过setCallback
来设置代理对象,即实现了MethodInterceptor
接口的类。
- 打印输出结果看看
the method name is sayGood
this is good
the method name is sayHello
this is origin
进程已结束,退出代码为 0
- 可以看到cglib动态代理功能已经实现
重要的事情反复说,这里是基于jdk1.8实现。