基于Spring AOP的日志管理
基于Spring AOP的日志管理
问题达人 发表于1年前
基于Spring AOP的日志管理
  • 发表于 1年前
  • 阅读 67
  • 收藏 3
  • 点赞 1
  • 评论 1

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 采用Spring AOP + 注解 +反射技术,拦截用户访问(通过注解标签,拦截想要拦截的方法),通过反射技术获取拦截方法的参数名称及值。

1. Spring AOP + 注解 实现拦截(包括Controller层的拦截) -

  • 定义注解

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {

    String remark() default "操作日志记录";

注意:在Spring的主配置文件配置组件扫描 ``` ``` -

  • 定义AOP拦截器

@Component
@Aspect
public class LogAspect implements Serializable {

    private static final long serialVersionUID = 1L;

    //定义拦截的方法

    @Pointcut("@annotation(com.emvc.aspect.LogAnnotation)")
    public void methodCachePointcut() {

    }

    //拦截处理

    @After("methodCachePointcut()  && @annotation(logRemark)")
    public void doAfter(JoinPoint jp, LogAnnotation logRemark) throws ClassNotFoundException, NotFoundException {

          //业务处理

    }

注:要在spring的配置文件配置, 特别的Controller的代理默认是JDK,如果想要用AOP拦截Controller的方法,需要将Controller的代理交由Cglib(在Spring mvc的配置文件配置 ),expose-proxy将Controller代理交由Cglib。

2.AOP拦截后的参数处理(利用反射获取方法的参数名及其值)

    /**
    *    返回  参数名=值;
    **/
    private static String writeLogInfo(String[] paramNames, JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        StringBuilder sb = new StringBuilder();
        for (int k = 0; k < args.length; k++) {
            Object arg = args[k];
            sb.append(paramNames[k]);
            sb.append("=" + arg + ";");
        }
        return sb.toString();
    }

    /**
     * 得到方法参数的名称
     * 
     * @param cls  this.getClass(), 
     * @param clazzName jp.getTarget().getClass().getName()
     * @param methodName jp.getSignature().getName()
     * @return 参数名数组
     * @throws NotFoundException
     */
    private String[] getFieldsName(Class cls, String clazzName, String methodName) throws NotFoundException {
        ClassPool pool = ClassPool.getDefault();
        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) {
            return null;
        }
        String[] paramNames = new String[cm.getParameterTypes().length];
        int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
        for (int i = 0; i < paramNames.length; i++) {
            paramNames[i] = attr.variableName(i + pos); // paramNames即参数名
        }
        return paramNames;
    }

共有 人打赏支持
粉丝 11
博文 89
码字总数 82209
评论 (1)
jmy2123
797979 很棒哦 博主加油!
×
问题达人
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: