优点:在没有接口的情况下,同样可以实现代理的效果。
缺点:同样需要自己编码实现代理全部过程。
但是为了更好的整合Spring框架使用。所以我们需要学习一下Spring 的AOP 功能。也就是学习Spring提供的AOP功能。
package top.starrylsi.cglib;
import net.sf.cglib.proxy.Enhancer;
public class cglibProxyFactory {
public static Object getProxy(Object target) {
//1. 创建cglib执行器
Enhancer enhancer = new Enhancer();
//2. 指定被代理类是代理类的父类(子类可以继承父类的方法)
enhancer.setSuperclass(target.getClass());
//3. 指定处理方式
enhancer.setCallback(new CglibInterceptor());
//4. 生成代理对象
return enhancer;
}
}
package top.starrylsi.cglib;
import static org.hamcrest.CoreMatchers.nullValue;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import top.starrylsi.utils.LogUtils;
public class CglibInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object target, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
//1.获取方法名
String methodName = method.getName();
//2.执行前置日志
LogUtils.logBefore(methodName, params);
//3.声明结果
Object result = null;
try {
//4.执行方法并获取返回值
result = methodProxy.invokeSuper(target, params);
} catch (Exception e) {
//5.异常日志
LogUtils.logThrowing(methodName, e);
}finally {
//6.后置日志
LogUtils.logAfter(methodName);
}
//7.返回执行结果
if(result !=null) {
LogUtils.logAfterReturing(methodName, result);
}
return null;
}
}
实现日记功能总结
介绍aop的实现方式
aop有两种实现方式 JDK动态代理和cglib代理
jdk-->proxy类, InvocationHandler,需要接口
cglib-->enhancer类,MethodInterceptor,需要类
评论 (0)