美文网首页
Spring(5) - (13)拦截器的原理和日志记录

Spring(5) - (13)拦截器的原理和日志记录

作者: 小白201808 | 来源:发表于2018-09-26 09:39 被阅读31次

拦截器的原理

             拦截器:interceptor     Action
   
             前置增强
request ——->  放行     ——————————---> .....
             后置增强

与Filter 过滤器很相似:

Filter就是对请求做相应的拦截
Filter:web领域的概念,只能针对请求和响应做增强,离不开servlet-api.jar
interceptor:整个java领域的概念,不仅可以运用到service层,还可以用到web层。

日志记录

代码演示

(1)LogUtil类,有一个 writeLog的方法

package com.keen.proxy.log;

import java.util.Date;

//在seivice方法调用之前,做日志记录
public class LogUtil {
    public void writeLog(String className,String methodName) {
        System.out.println(new Date().toLocaleString()+"调用了"+className+"类的"+methodName+"方法");
        
        
    }

}

(2)LogAdvice 日志增强类(底层依然用cglib)

pckage com.keen.proxy.log;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class LogAdvice implements MethodInterceptor{

    private Object targer;//真实对象
    private LogUtil logUtil;
    
    public void setTarger(Object targer) {
        this.targer = targer;
    }

    public void setLogUtil(LogUtil logUtil) {
        this.logUtil = logUtil;
    }
    //创建代理对象
    public <T> T getProxyObject(){
        /*Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targer.getClass());//告诉它,你要增强的哪个类
        enhancer.setCallback(this);
        return (T) enhancer.create();
        */
        //使用另外一种更加简单的方法
        return (T) Enhancer.create(targer.getClass(), this);
    }
    @Override
    //做增强
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodproxy) throws Throwable {
        //调用日志
        logUtil.writeLog(method.getDeclaringClass().getName(),method.getName());
        //调用真实对象
        Object ret = method.invoke(targer, args);
        return ret;
    }

}

测试类

@SpringJUnitConfig
public class AutoTest {
    @Autowired 
    private LogAdvice advice;
    
    
    @Test
    void testSave() throws Exception {
        //获取代理对象 jdk :class com.sun.proxy.$Proxy19
        //cglib:class com.keen.proxy.service.IEmployeeServiceImpl$$EnhancerByCGLIB$$ec7415fa
         IEmployeeServiceImpl proxy = advice.getProxyObject();
         //System.out.println(proxy.getClass());
         proxy.save(new Employee());
    }
    @Test
    void testUpdate() throws Exception {
        
         IEmployeeServiceImpl proxy = advice.getProxyObject();
         //System.out.println(proxy.getClass());
         proxy.update(new Employee());
        
        
    }
    
}

相关文章

网友评论

      本文标题:Spring(5) - (13)拦截器的原理和日志记录

      本文链接:https://www.haomeiwen.com/subject/tqqdoftx.html