CGLIB动态代理:
针对类来实现代理的,对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用。
而JDK动态代理只能代理实现了接口的类,没有实现接口的类是不可以被代理的。
开始引入pom:
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
被代理类:
public class Car{
public void move(){
System.out.println("小汽车行驶中...");
}
}
Cglib代理测试类:
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
//通过这个方法,我们就可以得到代理类
public Object getProxy(Class clazz){
//设置创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 方法作用:拦截所有目标类方法的调用
* @param o 目标类的实例
* @param method 目标方法的反射对象
* @param objects 方法的参数
* @param methodProxy 代理类的实例
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("记录日志开始...");
//代理类调用父类的方法
methodProxy.invokeSuper(o,objects);
System.out.println("记录日志结束...");
return null;
}
/**
* 测试main
* @param args
*/
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
Car car = (Car) proxy.getProxy(Car.class);
car.move();
}
打印结果:
记录日志开始...
小汽车行驶中...
记录日志结束...