什么是动态代理
在程序运行时,运用反射机制动态创建而成,无需手动编写代码
CgLib动态代理的原理是对指定的业务类生成一个子类,并覆盖其中的业务方法来实现代理
步骤:
第一步:创建代理类(CglibProxy)实现(MethodInterceptor)接口
第二步:获取目标类绑定对应关系
第三步:实现业务代码
代码:
public class CglibProxy implements MethodInterceptor {
//目标类
private Object targetObject;
//绑定关系
public Object newProxyInstance(Object targetObject){
this.targetObject=targetObject;
//用于绑定对应的关系
Enhancer enhancer=new Enhancer();
//设置代理类父类(目标类)
enhancer.setSuperclass(this.targetObject.getClass());
//设置回调函数
enhancer.setCallback(this);
//创建子类(代理对象)
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object result=null;
try {
System.out.println("通过CGLIB动态代理调用"+method.getName()+",打印日志 begin" );
result=methodProxy.invokeSuper(o,objects);
System.out.println("通过CGLIB动态代理调用"+method.getName()+",打印日志 end" );
}catch (Exception e){
e.printStackTrace();
}
return result;
}
}
测试代码:
public class ProxyTest {
public static void main(String [] args){
// CGLIB动态代理
CglibProxy cglibProxy=new CglibProxy();
PayService payService=(PayService) cglibProxy.newProxyInstance(new PayServiceImpl());
payService.save(14,323);
payService.callback("afajn666");
}
}
测试效果截图: