美文网首页
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