小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Spring 利用Aop和注解 加入log日志

Java,java,mybatis,spring 额外说明

收录于:52天前

1.导入AOP包


      <!-- aop aspect注解导包-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.6</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>

2. springMVC配置

<!--扫描,Controller类-->
	<context:component-scan base-package="com.JXWork"/>
	<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true">
		<!-- 指定@Aspect类,支持正则表达式,符合该表达式的切面类才会被应用-->
		<aop:include name="annotationLogAspect"></aop:include>
	</aop:aspectj-autoproxy>
	<bean id="annotationLogAspect" class="com.JXWork.service.AopLog.AnnotationLogAspect"/>

3.定义AnnotationLog注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})//表示只能给类添加该注解
@Retention(RetentionPolicy.RUNTIME)//这个必须要将注解保留在运行时
public @interface AnnotationLog {
    String name() default "";
}

4. 声明方面类

定义切入点(PointCut),定义连接点,在这个Annotation日志注释标注的方法上加入日志切入点。

package com.train.annotation;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
/**
 * @auther: TF12778 2022/8/25 10:36
 * @description:
 */
@Component
@Slf4j
@Aspect
public class LogAspect {

    @Pointcut("@annotation(com.train.annotation.AnnotationLog)")
    public void logPoint() {
    }

    @Before("logPoint()")
    public void doBefore(JoinPoint joinPoint) {

    }

    @After("logPoint()")
    public void doAfter(JoinPoint joinPoint) {

    }

    /**
     *  ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中,
     *  添加了  Object proceed() throws Throwable //执行目标方法
     *         Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法
     */
    @Around("logPoint()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {

        //获取连接点的方法签名对象
        Signature signature = joinPoint.getSignature();
        if (!(signature instanceof MethodSignature)) {
            throw new IllegalArgumentException("该注解只能用于方法");
        }

        MethodSignature methodSignature = null;
        methodSignature = (MethodSignature) signature;

        // 获取连接点所在的目标对象类
        Class target = joinPoint.getTarget().getClass();
        Method method = target.getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
        AnnotationLog annotationLog = method.getAnnotation(AnnotationLog.class);
        log.info("注解内容获取:" + annotationLog.name());

        // 获取连接点方法运行时的入参列表
        Object[] params = joinPoint.getArgs();
        Map<String, Object> paramMap = object2Map(params[0]); // 参数转换为map

        log.info("{}.{}方法请求入参:{}", target.getSimpleName(), method.getName(), JSON.toJSONString(paramMap));
        Object result = joinPoint.proceed();
        log.info("{}.{}方法执行结果:{}", target.getSimpleName(), method.getName(), JSON.toJSONString(result));

        return result;
    }

    /**
     * 实体对象转成Map
     * @param obj 实体对象
     * @return
     */
    public static Map<String, Object> object2Map(Object obj) {
        Map<String, Object> map = new HashMap<>();
        List<Field> fieldList = new ArrayList<>() ;
        if (obj == null) {
            return map;
        }
        Class clazz = obj.getClass();
        while (clazz != null) {
            fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
            clazz = clazz.getSuperclass();
        }
        try {
            for (Field field : fieldList) {
                field.setAccessible(true);
                if (Objects.equals("serialVersionUID", field.getName()) ) {
                    continue;
                }
                map.put(field.getName(), field.get(obj));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

}

5、在具体方法上添加注解@AnnotationLog

 @RequestMapping(value = "/selectCustomerList")
    @AnnotationLog(name = "打印执行结果")
    public List<jxzCustomer> selectCustomerList(jxzCustomer query) {
        List<jxzCustomer> list = customerService.selectList(query);

        return list;
    }

检测结果:

 

. . .

相关推荐

额外说明

找不到有效的条目或内容,这不是有效的 OOXML (Office Open XML) 文件

问题描述: 导出Excel的时候出现的异常,我这个导出是为导入Excel做准备的,也就是用户先下载模板,然后根据模板填写数据再导入Excel。 模板当中Excel也是可以正常打开的 解决过程: Maven编译过后的target文件夹当中的Excel是否可

额外说明

中烟新商联盟最新JS逆向分析实用教程

目标网址:https://xinshangmeng.com/ 重要说明:文章教程仅供参考学习,请勿用于非法用途,否则后果自负。 目录 一、接口参数分析 二、全局搜索j_mcmm关键词</

额外说明

数据库json、视图

1 什么是JSON?      JSON是一种轻量级的数据交换格式,全称为JavaScript Object Notation(JavaScript对象表示法)。它以易于阅读和编写的文本格式来表示结构化数据,常用于Web应用程序之间的数据传输。  JSO

额外说明

Unity:如何使用Button切换Scene

背景: 游戏中点击UI按钮后从当前Scene跳到另一个Scene,看起来是一个挺简单的事情,但是有没有最最简便,不用完全依赖脚本的方法?下面是我的总结: 方法: 使用Button自带的宏按钮,给Onclick时间追加处理指令。这样的好处,是自己省去了写监

额外说明

Unity 热更新技术 |(七)完整热更新实战案例学习使用,包括资源热更新及代码热更新【文末书】

- 博客主页:https://xiaoy.blog.csdn.net - 本文由 呆呆敲代码的小Y 原创,首发于 CSDN- - 学习专栏推荐:Unity系统学习专栏 - 游戏制作专栏推荐:游戏制作 -Unity实战100例专栏推荐:Unity 实战10

额外说明

【Git基础篇】实习生的必备技能Git——本地追加,提交,等命令使用(包含安装包网盘下载)

部门老大:小李,下星期就要入职了,这是咱们部门项目代码的链接,你先提前熟悉一下 我:…,不会呀 部门老大:就克隆代码呀 我:Ctrl+c,Ctrl+V ? 由于内容多,关于git分为两篇:本文主要简单介绍了git的概念以及本地的一些命令,具体远程操作见实

额外说明

二、哈希算法和Merkle Tree

章节系列目录:点击跳转 文章目录 哈希算法 哈希函数的定义 可靠哈希函数需满足的要求 哈希函数的主要作用 哈希实际例子 Merkle Tree默克尔树 完整性校验的方法 哈希列表 Hash List Merkle Tree 哈希树 总结 哈希算法 哈希函

额外说明

Java——JList的简单运用

┏(ω)=☞ 本专栏的目录(为您提供更好的查询方式) import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.

额外说明

搜索旋转排序数组、路径总和 II、拆分数字

文章目录 搜索旋转排序数组(数组、二分查找) 路径总和 II(树、深度优先搜索) 拆分数字(算法) 搜索旋转排序数组(数组、二分查找) 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <

额外说明

启动软件出现Run-time error ‘713’: class not registered.解决方法

运行时错误“713”:类未注册。启动软件时出现。 您需要在您的计算机上安装以下文件。 MSSTDFMT.DLL 事实上,很多用户在玩单机游戏或安装软件时都遇到过这个问题。如果你是新手,你会立即认为软件或游戏有错误。事实上,情况并非如此。主要原因是你的电脑

ads via 小工具