• springboot---aop切片编程


    1.介绍

      面向切面编程,关注点代码与业务代码分离,就是给指定方法执行前执行后。。插入重复代码

      关注点:重复代码

      切面:被切面的类

      切入点:执行目标对象方法,动态植入切片代码

    2.部署步骤

      2.1:添加依赖

    <!-- spring aop支持-->  
            <dependency>
                  <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-aop</artifactId>

      2.2 aop切片配置

    package com.ty.tyzxtj.aop;
    
    import java.util.HashMap;
    import java.util.Map;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import javassist.ClassClassPath;
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtMethod;
    import javassist.Modifier;
    import javassist.NotFoundException;
    import javassist.bytecode.CodeAttribute;
    import javassist.bytecode.LocalVariableAttribute;
    import javassist.bytecode.MethodInfo;
    
    /**
     * 调用接口的切面类
     * @author wangjiping
     *
     */
    @Aspect
    @Component
    public class WebLogAspect  {
        private Logger logger = null; 
        /**
         * 定义一个切面
         */
        @Pointcut("execution(* com.ty.tyzxtj.controller.*.*(..))")
        public void webLog(){
            
        }
        @Before("webLog()")  
        public void doBefore(JoinPoint joinPoint) throws Throwable {  
            // 接收到请求,记录请求内容  
            Class<?> target = joinPoint.getTarget().getClass();//目标类
            logger = LoggerFactory.getLogger(target);//对应日志成员
            String clazzName = target.getName();//类名
            Object[] args = joinPoint.getArgs();//参数
            String methodName = joinPoint.getSignature().getName();//方法名
            Map<String,Object> nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName, args);//获取被切参数名称及参数值
            logger.info("["+clazzName+"]["+methodName+"]["+nameAndArgs.toString()+"]");
            //获取参数名称和值
        }  
      
        @AfterReturning(returning = "ret", pointcut = "webLog()")  
        public void doAfterReturning(Object ret) throws Throwable {  
            // 处理完请求,返回内容  
            logger.info("response : " + ret);
        }  
        
        /**
         * 通过反射机制 获取被切参数名以及参数值
         *
         * @param cls
         * @param clazzName
         * @param methodName
         * @param args
         * @return
         * @throws NotFoundException
         */
        private Map<String, Object> getFieldsName(Class<?> cls, String clazzName, String methodName, Object[] args) throws NotFoundException {
            Map<String, Object> map = new HashMap<String, Object>();
            ClassPool pool = ClassPool.getDefault();
            //ClassClassPath classPath = new ClassClassPath(this.getClass());
            ClassClassPath classPath = new ClassClassPath(cls);
            pool.insertClassPath(classPath);
    
            CtClass cc = pool.get(clazzName);
            CtMethod cm = cc.getDeclaredMethod(methodName);
            MethodInfo methodInfo = cm.getMethodInfo();
            CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
            LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
            if (attr == null) {
            }
            int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
            for (int i = 0; i < cm.getParameterTypes().length; i++) {
                map.put(attr.variableName(i + pos), args[i]);//paramNames即参数名
            }
            return map;
        }
    }

    3.注意事项

  • 相关阅读:
    POJ 3268 Silver Cow Party (Dijkstra)
    怒学三算法 POJ 2387 Til the Cows Come Home (Bellman_Ford || Dijkstra || SPFA)
    CF Amr and Music (贪心)
    CF Amr and Pins (数学)
    POJ 3253 Fence Repair (贪心)
    POJ 3069 Saruman's Army(贪心)
    POJ 3617 Best Cow Line (贪心)
    CF Anya and Ghosts (贪心)
    CF Fox And Names (拓扑排序)
    mysql8.0的新特性
  • 原文地址:https://www.cnblogs.com/xiaoping1993/p/8086884.html
Copyright © 2020-2023  润新知