13-Spring-AOP-计数功能加日记功能-cglib动态代理

starrylsi
2024-09-12 / 0 评论 / 12 阅读 / 正在检测是否收录...

优点:在没有接口的情况下,同样可以实现代理的效果。
缺点:同样需要自己编码实现代理全部过程。
但是为了更好的整合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.png

介绍aop的实现方式

aop有两种实现方式 JDK动态代理和cglib代理
jdk-->proxy类, InvocationHandler,需要接口
cglib-->enhancer类,MethodInterceptor,需要类

0

评论 (0)

取消