首页 > 其他分享 >SpringBoot+Aop实现业务操作日志demo

SpringBoot+Aop实现业务操作日志demo

时间:2024-03-26 11:29:18浏览次数:27  
标签:description SpringBoot demo org ServiceLog Aop import public name

1、建表

CREATE TABLE `business_log`  (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NULL COMMENT '业务名称',
  `description` varchar(255) NULL COMMENT '业务操作描述',
  `operator` varchar(100) NULL COMMENT '操作人',
  `oper_time` datetime NULL COMMENT '操作时间',
  `param` varchar(255) NULL COMMENT '操作参数报文',
  `ip_from` varchar(50) NULL COMMENT '操作来源ip',
  PRIMARY KEY (`id`)
);

1、添加pom

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

2、定义业务日志注解,可以作用在控制器或其他业务类上,用于描述当前类的功能,也可以作用在方法上,用于描述当前方法的作用。

/**
 * 业务日志注解
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceLog {
    /**
     * 名称
     */
    String name() default "";

    /**
     * 描述
     */
    String description() default "";
}

3、编写切面类,并使用@ServiceLog定义切入点,在环绕通知内执行过目标方法后,获取目标类、目标方法上的业务日志注解上的功能名称、功能描述和参数名称, 作用在方法上的名称可覆盖作用在类上的名称

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.example.demo.entity.BusinessLog;
import com.example.demo.mapper.BusinessLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;

@Slf4j
@Component
@Aspect
public class ServiceLogAop implements Ordered {

    @Resource
    private BusinessLogMapper businessLogMapper;

    /**
     * 定义ServiceLogAop的切入点为标记@ServiceLog注解的方法
     */
    @Pointcut(value = "@annotation(com.example.demo.automation.ServiceLog)")
    public void  pointcut() {}

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint pjp) {
        log.info("ServiceLogAop around start");
        Object result = null;
        //执行目标方法
        try {
            result = pjp.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        //目标方法执行完成后,获取目标类、目标方法上的业务日志注解上的功能名称和功能描述
        Object target = pjp.getTarget();
        Object[] args = pjp.getArgs();
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        ServiceLog log1 = target.getClass().getAnnotation(ServiceLog.class);
        ServiceLog log2 = signature.getMethod().getAnnotation(ServiceLog.class);
        BusinessLog businessLog = new BusinessLog();
        if (log2 != null){
            String name = log2.name();
            if (StrUtil.hasBlank(name) && log1 != null){
                name = log1.name();
            }
            businessLog.setName(name);
            String description = log2.description();
            businessLog.setDescription(description);
        }
        businessLog.setOperator("user");
        businessLog.setOperTime(LocalDateTime.now());

        businessLog.setParam(JSONUtil.toJsonStr(args));

        businessLogMapper.insert(businessLog);

        log.info("ServiceLogAop around end");
        return result;




    }



    @Override
    public int getOrder() {
        return 1;
    }
}

4、Controller 测试

@ServiceLog(description = "联表查询")
    @GetMapping("/index")
    public SearchResult<Map<String, Object>> index(){
        return mapSearcher.search(StudentVo.class);
    }

    @GetMapping("/aop")
    @ServiceLog(description = "aop日志测试")
    public String aopTest(String username) {
        return "test";
    }

    @GetMapping("/aop2")
    @ServiceLog(name = "aop测试2", description = "aop日志测试2")
    public String aopTest2() {
        return "test2";
    }

标签:description,SpringBoot,demo,org,ServiceLog,Aop,import,public,name
From: https://blog.csdn.net/qq_36813853/article/details/137039584

相关文章

  • 基于SpringBoot+Vue+uniapp微信小程序的乡村政务服务系统的详细设计和实现(源码+lw+部
    文章目录前言项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • SpringBoot 快速实现 api 加密
    在项目中,为了保证数据的安全,我们常常会对传递的数据进行加密。常用的加密算法包括对称加密(AES)和非对称加密(RSA),博主选取码云上最简单的API加密项目进行下面的讲解。https://gitee.com/isuperag/rsa-encrypt-body-spring-boot项目介绍该项目使用RSA加密方式对API接口返回的......
  • springboot项目的目录顺序
    在idea上自动生成的springboot项目中一定要注意文件的上下顺序此时在项目运行时并不会报错但是不会执行utils下的类此时 此时 utils下的类是一个解析类可以解析一份存放在resources下的一份emp.xml文件并把解析后的数据返会给一个集合,因为此时不会执行utils下的类所以......
  • ENSP Demo3 VLAN Trunk & Hybrid
    syssysnSW1vlanbatch1020100200intg0/0/1portlink-typetrunkporttrunkallow-passvlan1020100200intg0/0/2portlink-typehybridporthybriduntaggedvlan10100porthybridpvidvlan10intg0/0/3portlink-typehybridporthybridunta......
  • Spring笔记——SpringBoot启动流程
    Spring笔记——SpringBoot启动流程创建ApplicationContext配置资源加载器配置启动类确定web容器类型获取一些BootStrap容器初始动作配置一些容器初始动作配置一些监听器运行ApplicationContext创建BootStrap容器并设置监听器准备容器环境启动容器调用所有Applica......
  • 基于vue+Springboot后台前后端分离项目:购物商城设计与实现(源码+文档+安装部署)
      博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书......
  • Mac 使用VSCode搭建SpringBoot+Maven开发环境
    Mac使用VSCode搭建SpringBoot+Maven开发环境大多数人在开发java后端时使用的是IntelliJIDEA,该软件商用版收费太贵,社区版功能又太少,所以我希望可以使用VSCode来创建和开发后端项目,搭建的过程如下:1.下载和安装javasdk下载地址:https://www.oracle.com/java/technologies/downl......
  • springboot关于bean对象的管理
    Bean的扫描@springbootApplication注释,本质上是一个组合注解,其中组合了@ComponentScan注解,默认只能扫描启动类所在的包以及子包 如果要注册的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的可以用@Bean注释注入三方bean对象publicstatic......
  • 基于SpringBoot+Vue的大学生兼职管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我自己的网站自己的小程序(小蔡coding)代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue的大学校园旧物捐赠网站的详细设计和实现(源码+lw+部署文档+讲解等
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我自己的网站自己的小程序(小蔡coding)代码参考数据库参考源码获取前言......