CGLIB動(dòng)態(tài)代理:
針對(duì)類來實(shí)現(xiàn)代理的挟鸠,對(duì)指定目標(biāo)類產(chǎn)生一個(gè)子類,通過方法攔截技術(shù)攔截所有父類方法的調(diào)用菇夸。
而JDK動(dòng)態(tài)代理只能代理實(shí)現(xiàn)了接口的類惰拱,沒有實(shí)現(xiàn)接口的類是不可以被代理的。
開始引入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();
//通過這個(gè)方法凛虽,我們就可以得到代理類
public Object getProxy(Class clazz){
//設(shè)置創(chuàng)建子類的類
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 方法作用:攔截所有目標(biāo)類方法的調(diào)用
* @param o 目標(biāo)類的實(shí)例
* @param method 目標(biāo)方法的反射對(duì)象
* @param objects 方法的參數(shù)
* @param methodProxy 代理類的實(shí)例
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("記錄日志開始...");
//代理類調(diào)用父類的方法
methodProxy.invokeSuper(o,objects);
System.out.println("記錄日志結(jié)束...");
return null;
}
/**
* 測試main
* @param args
*/
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
Car car = (Car) proxy.getProxy(Car.class);
car.move();
}
打印結(jié)果:
記錄日志開始...
小汽車行駛中...
記錄日志結(jié)束...