博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Spring AOP的日志管理
阅读量:6350 次
发布时间:2019-06-22

本文共 2212 字,大约阅读时间需要 7 分钟。

hot3.png

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

  • 定义注解

@Target({ ElementType.METHOD, ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)
@Documented
public 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;
    }

转载于:https://my.oschina.net/u/2307114/blog/712562

你可能感兴趣的文章
《数据科学:R语言实现》——2.5 使用Excel文件
查看>>
《淘宝店铺设计装修一册通》一2.5 抠图工具的简单运用
查看>>
《音乐达人秀:Adobe Audition实战200例》——实例4 收音机音乐节目转录到电脑里...
查看>>
《JavaScript应用程序设计》一一3.1 过时的类继承
查看>>
千万PV是什么意思?
查看>>
Amazon 推出 API 网关使用计划
查看>>
互联网流量超出路由器上限 或致全球断网
查看>>
《基于ArcGIS的Python编程秘笈(第2版)》——2.5 限制图层列表
查看>>
GNOME 地图 3.20 加入更多新特性 可用性得到加强
查看>>
《代码整洁之道:程序员的职业素养》导读
查看>>
《计算复杂性:现代方法》——习题
查看>>
Mozilla 释出更新修复中间人攻击漏洞
查看>>
思科表态反对网络中立
查看>>
《HTML5+CSS3网页设计入门必读》——1.5 利用多种Web浏览器执行测试
查看>>
Velocity官方指南-容器
查看>>
国家为何如此重视石墨烯?
查看>>
《Python和Pygame游戏开发指南》——1.14 配套网站上的更多信息
查看>>
Kafka+Flink 实现准实时异常检测系统
查看>>
利用mybatis查询两级树形菜单
查看>>
《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <一>
查看>>