1.概述
CGLIB动态代理是针对类实现代理(无需实现接口),为了弥补jdk的不足,
Cglib 不基于接口,是基于父子的继承关系(被代理的对象是代理对象的父类),通过重写的形式扩展方法
2.定义需要代理的service
/**
* 被代理的对象不需要接口
*/
public class WanghongService {
public int yuehui(String name){
System.out.println("做了榜一大哥,线下见面:" + name + ",做泰迪狗干的事");
return 1;
}
}
3.继承:MethodInterceptor
public class MyMethodIntercepter implements MethodInterceptor {
/**
* 给拦截的目标方法做增强
* @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 {
this.tuoKuzi();
// 执行目标方法
Object result = methodProxy.invokeSuper(o, objects);
this.chuanKuzi();
return result;
}
private void chuanKuzi() {
System.out.println("后置:大威德3秒就结束了,提起裤子");
}
private void tuoKuzi() {
System.out.println("前置:大威德脱裤子,带上冈本");
}
public Object getProxyInstance(Object obj) {
//1.使用enhancer 生成代理对象---cglib增强类
Enhancer enhancer = new Enhancer();
// 2.为代理对象设置父类
enhancer.setSuperclass(obj.getClass());
//3. 设置回调函数--调用service的yuehui方法之后,会调用方法拦截器中的intercept
enhancer.setCallback(this);
//4. 创建子类对象,即代理对象
Object proxyObj = enhancer.create();
// 返回代理对象
return proxyObj;
}
}
4.test方法
public class CglibTest {
public static void main(String[] args) {
MyMethodIntercepter cgLibProxy = new MyMethodIntercepter();
//返回一个代理类的对象--注意这里现在传入的是实现类
WanghongService wanghongService = new WanghongService();
WanghongService proxyService2 = (WanghongService)cgLibProxy.getProxyInstance(wanghongService);
proxyService2.yuehui("李采潭");
}
}