文档章节

基于Spring AOP的日志管理

问题达人
 问题达人
发布于 2016/07/15 16:47
字数 398
阅读 234
收藏 3

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

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;
    }

© 著作权归作者所有

问题达人
粉丝 13
博文 94
码字总数 91532
作品 0
昌平
程序员
私信 提问
加载中

评论(1)

jmy2123
jmy2123
797979 很棒哦 博主加油!
技术与架构之springmvc输入输出信息打印日志中

前言 同事在所有controller方法里加入了输入参数的log输出,输出数据的log输出或者使用aop的方式。真的很烦,鸟菜啊给大家一个简单的方式。 先看错误的方式 手动添加log打印方式 问题 每个类...

鸟菜啊
2019/10/21
238
0
08 SSM整合案例(企业权限管理系统):05.SSM整合案例的基本介绍

04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 05.SSM整合案例的基本介绍 06.产品操作 1.1 环境搭建 主要...

osc_npubdjvi
2019/09/18
6
0
从代理模式到Spring AOP

1、现实场景 场景:小A要在丰台科技园租一个单间。 如果不使用房产中介,一般的流程是这样: 浏览广告--->筛选房源--->约见房东--->鉴别真假--->谈判签约--->入住 小A的核心目标是租房,但在...

他城之途
2016/03/22
113
0
Spring的IoC与AOP的理解

1.Spring它到底是什么? Spring是一个开源的Java应用程序开发框架,为了解决企业应用开发的复杂性而创建的。   在spring中,它会认为一切Java类都是资源,而资源就是Bean,容纳这些Bean是S...

osc_tm2zceka
2018/06/26
2
0
AOP(Aspect Oriented Programming),即面向切面编程

AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构...

osc_azsn5lm2
2018/09/05
2
0

没有更多内容

加载失败,请刷新页面

加载更多

2020年中国AI基础数据服务行业研究报告(附件下载)

2020年中国AI基础数据服务行业研究报告 请在百度网盘下载 链接: https://pan.baidu.com/s/1-KBY9z1qC5Cbew-89MbXfw 提取码: 2egv...

解优猎头
33分钟前
20
0
转MDL中数据读取

http://yexin218.iteye.com/blog/532184 澄清一个误区:每个Net_BuFFER包含的是一个linked-list的MDL,而不仅仅是一个MDL。所以你要访问Net_BuFFER 中数据,你需要在代码中根据需要的offset遍...

simpower
35分钟前
7
0
怎么将WORD批量转换成PDF?可以批量转换的迅捷PDF转换器!

怎么将WORD批量转换成PDF?如果是一个文档需要进行转换,大家可以通过各式各样的方式去尝试解决,例如最简单的重新编辑,将WORD文档进行复制,粘贴到PDF文档当中,但是这个方法在面对多份WOR...

开源86
38分钟前
26
0
[开源] .Net ORM 访问 人大金仓数据库

前言 京人大金仓信息技术股份有限公司(以下简称“人大金仓”)是具有自主知识产权的国产数据管理软件与服务提供商。人大金仓由中国人民大学一批最早在国内开展数据库教学、科研、开发的专家...

2881099
44分钟前
19
0
phpcms v9 数据表结构

表 1 : v9_admin 管理员表 字段 类型 Null 默认 额外 注释 userid mediumint(6) unsigned PK auto_increment 用户id username varchar(20) YES 用户名 password varchar(32) YES 密码 roleid......

邓振华
45分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部