aop实现加注解,自动存入数据库功能

1、建包、创类、建数据库

在这里插入图片描述
在这里插入图片描述

2 、数据库对应实体类 PcOperateLog

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class PcOperateLog {private Integer id;private String name;private String time;private String ip;private String ipLocation;private String record;
}

3、MyLog类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解记录系统操作日志*/
//Target注解决定 MyLog 注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分
@Target({ ElementType.PARAMETER, ElementType.METHOD })
//Retention注解括号中的"RetentionPolicy.RUNTIME"意思是让 MyLog 这个注解的生命周期一直程序运行时都存在
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {/*** 日志内容*/String record() default "";
}

4、OperLogAspect类

package com.woniu.pc.aop;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.woniu.pc.entity.PcOperateLog;
import com.woniu.pc.mapper.PcOperateLogMapper;
import com.woniu.util.BaiduMapUtil;
import com.woniu.util.GetContext;
import com.woniu.util.JsonUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import com.woniu.pc.anno.MyLog;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;import com.woniu.pc.service.impl.PcLoginLogServiceImpl;
/*** 切面处理类,记录操作日志到数据库*/
@Aspect
@Component
public class OperLogAspect {@Autowiredprivate PcOperateLogMapper pcOperateLogMapper;//为了记录方法的执行时间ThreadLocal<Long> startTime = new ThreadLocal<>();/*** 设置操作日志切入点,这里介绍两种方式:* 1、基于注解切入(也就是打了自定义注解的方法才会切入)*    @Pointcut("@annotation(com.woniu.pc.anno.MyLog)")* 2、基于包扫描切入*    @Pointcut("execution(public * org.wujiangbo.controller..*.*(..))")*/@Pointcut("@annotation(com.woniu.pc.anno.MyLog)")//在注解的位置切入代码//@Pointcut("execution(public * com.woniu.pc.controller..*.*(..))")//从controller切入public void operLogPoinCut() {}@Before("operLogPoinCut()")public void beforMethod(JoinPoint point){startTime.set(System.currentTimeMillis());}/*** 设置操作异常切入点记录异常日志 扫描所有controller包下操作*/@Pointcut("execution(* com.woniu.pc.controller..*.*(..))")public void operExceptionLogPoinCut() {}/*** 正常返回通知,拦截用户操作日志,连接点正常执行完成后执行, 如果连接点抛出异常,则不会执行** @param joinPoint 切入点* @param result      返回结果*/@AfterReturning(value = "operLogPoinCut()", returning = "result")public void saveOperLog(JoinPoint joinPoint, Object result) {// 获取RequestAttributesRequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 从获取RequestAttributes中获取HttpServletRequest的信息HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);try {// 从切面织入点处通过反射机制获取织入点处的方法MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 获取切入点所在的方法Method method = signature.getMethod();// 获取操作MyLog myLog = method.getAnnotation(MyLog.class);PcOperateLog pcOperateLog = new PcOperateLog();if (myLog != null) {//记录日志的操作内容pcOperateLog.setRecord(myLog.record());}//获取操作者Map userInfo = GetContext.getContext();String username = (String)userInfo.get("username");pcOperateLog.setName(username);//获取ip地址String ip = PcLoginLogServiceImpl.ip;String fileName="js.txt";String path="D:\\js\\";String directoryPath = "D:\\js";JSONObject jsonObject = new JSONObject();jsonObject.put("ip", ip);String json = null;if(ip == "" || ip == null){json = JsonUtil.readJson("D:\\js\\js.txt");JSONObject jsonIp = JSON.parseObject(json);ip = (String)jsonIp.get("ip");}else {JsonUtil.writeJson(path,directoryPath,jsonObject,fileName);}pcOperateLog.setIp(ip);//获取ip地理位置String address = BaiduMapUtil.getAddress(ip);
//            String address = "江苏省南京市";pcOperateLog.setIpLocation(address);//调用方法,插入数据库pcOperateLogMapper.addPcOperateLog(pcOperateLog);} catch (Exception e) {e.printStackTrace();}}/*** 异常返回通知,用于拦截异常日志信息 连接点抛出异常后执行*/@AfterThrowing(pointcut = "operExceptionLogPoinCut()", throwing = "e")public void saveExceptionLog(JoinPoint joinPoint, Throwable e) {// 这是我数据库日志表对应的实体类PcOperateLog pcOperateLog = new PcOperateLog();try {// 从切面织入点处通过反射机制获取织入点处的方法MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 获取切入点所在的方法Method method = signature.getMethod();// 获取请求的类名String className = joinPoint.getTarget().getClass().getName();// 获取请求的方法名String methodName = method.getName();methodName = className + "." + methodName + "()";// 获取操作MyLog myLog = method.getAnnotation(MyLog.class);if (myLog != null) {//记录日志的操作内容pcOperateLog.setRecord(myLog.record());}//获取操作者Map userInfo = GetContext.getContext();String username = (String)userInfo.get("username");pcOperateLog.setName(username);//获取ip地址String ip = PcLoginLogServiceImpl.ip;String fileName="js.txt";String path="D:\\js\\";String directoryPath = "D:\\js";JSONObject jsonObject = new JSONObject();jsonObject.put("ip", ip);String json = null;if(ip == "" || ip == null){json = JsonUtil.readJson("D:\\js\\js.txt");JSONObject jsonIp = JSON.parseObject(json);ip = (String)jsonIp.get("ip");}else {JsonUtil.writeJson(path,directoryPath,jsonObject,fileName);}pcOperateLog.setIp(ip);String address = BaiduMapUtil.getAddress(ip);pcOperateLog.setIpLocation(address);//插入数据库pcOperateLogMapper.addPcOperateLog(pcOperateLog);} catch (Exception e2) {e2.printStackTrace();}}
}

5、Mapper类

import com.woniu.pc.entity.PcOperateLog;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface PcOperateLogMapper {void addPcOperateLog(PcOperateLog pcOperateLog);List<PcOperateLog> queryAll();
}

6、sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.woniu.pc.mapper.PcOperateLogMapper"><insert id="addPcOperateLog">INSERT INTO t_pc_operate_log(name, time, ip, record, ip_location)VALUES (#{name}, now(), #{ip}, #{record}, #{ipLocation})</insert><select id="queryAll" resultType="com.woniu.pc.entity.PcOperateLog">SELECT id, name, time, ip, record, ip_locationFROM t_pc_operate_log</select>
</mapper>

7、使用注解

在某个controller层的一个的方法上加上注解
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/21930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL 语句中 left join 后用 on 还是 where,区别大了!

目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条&#xff0c;奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数&#xff0c;只会根据and后的条件是否显示 B表的记录&#xff0c;A表的记录一定会显…

网络基础1

文章目录 网络基础11. 计算机网络背景1.1 网路发展1.2 认识 "协议" 2. 网络协议初识2.1 协议分层2.2 OSI七层模型2.3 TCP/IP五层(或四层)模型协议栈与OS的关系 3. 网络传输基本流程3.1 同一个局域网两台主机通信3.2 同一个路由器的两个子网通信 4. 网络中的地址管理4…

一文辨析,性能分析top命令中进程NI和PR

分析 Linux 服务器性能&#xff0c;首先想到的命令肯定是 top, 通过它&#xff0c;我们可以看到当前服务器资源使用情况和进程运行资源占用情况。 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的自动化测试教程&…

靶形数独

题目描述 小城和小华都是热爱数学的好学生&#xff0c;最近&#xff0c;他们不约而同地迷上了数独游戏&#xff0c;好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了&#xff0c;于是他们向 Z 博士请教&#xff0c;Z 博士拿出了他最近发明的“靶形数独”&am…

企业数字化转型:信息化还是数字化?

面对巨大的数字经济市场&#xff0c;全球大部分企业都开始了数字化转型进程&#xff0c;国内一半以上的企业已经将数字化转型视为下一步发展重点&#xff0c;并制定了清晰的数字化转型战略规划。 但是&#xff0c;相当一部分传统行业&#xff0c;如制造、金融、能源、化工等非数…

Dockerfile面试题(CMD、ENTRYPOINT与RUN命令对比)

目录 Dockerfile面试题 CMD、ENTRYPOINT与RUN命令对比 &#xff08;一&#xff09;CMD命令 &#xff08;二&#xff09;RUN命令 &#xff08;三&#xff09;ENTRYPOINT &#xff08;四&#xff09;RUN和CMD、ENTRYPOINT支持参数形式命令 &#xff1a; Dockerfile面试题 …

【M波段2D双树(希尔伯特)小波多分量图像去噪】基于定向M波段双树(希尔伯特)小波对多分量/彩色图像进行降噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python pypinyin module 的应用

安装pypinyin module 这个模块主要处理中文拼音可以用来做很多很有趣的事情 如何使用help 函数 将help 函数的输出保存到文件中去 一眼会 import sys import pypinyinwith open(帮助文档.txt,w) as f:sys.stdout f help(pypinyin) 如何查找模块中内置的函数 类 函数 la…

springboot+vue农产品特产商城销售平台_50kf2 多商家

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;南阳特产销售平台展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…

2023年测试岗,手动测试vs自动化测试,“我“该如何抉择...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在软件测试行业中…

OpenCL编程指南-9.1命令、队列、事件

概述 命令队列是OpenCL的核心。平台定义了一个上下文&#xff0c;其中包含一个或多个计算设备。每个计算设备可以有一个或多个命令队列。提交到这些队列的命令将完成OpenCL程序的具体工作。 在一个简单的OpenCL程序中&#xff0c;提交到一个命令队列的命令会按顺序执行。一个…

windows下mysql的下载与安装

文章目录 1 下载2 安装目录下新建data文件夹和my.ini3 安装4设置密码与远程连接5 配置环境变量6 navicate连接成功 1 下载 官网地址 https://www.mysql.com/点击下载 社区下载 社区服务 选择版本下载 2 安装目录下新建data文件夹和my.ini my.ini 内容如下 [mysql] # 设置my…

【C#学习笔记】内存管理

文章目录 分配内存释放内存GC标记清除算法分代算法 .NET的GC机制有这样两个问题&#xff1a; 官方文档 自动内存管理 自动内存管理是CLR在托管执行过程中提供的服务之一。 公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放。 对开发人员而言&#xff0c;这就意味着…

二次开发了个寂寞之HttpRunnerManager接口测试管理平台

文章目录 一、背景1、二次开发1.1、首页1.2、项目列表1.3、用例列表1.4、新增用例1.5、测试套件1.6、查看报告 二、总结 一、背景 自入职起&#xff0c;就在公司内部引入开源接口测试平台&#xff0c;选一个大家勉强看得懂源码的开源项目&#xff0c;方便后续的二次开发&#x…

【每日一题】—— C. Mocha and Hiking(Codeforces Round 738 (Div. 2))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

Kotlin~Visitor访问者模式

概念 将数据结构和操作分离&#xff0c;使操作集合可以独立于数据结构变化。 角色介绍 Visitor&#xff1a;抽象访问者&#xff0c;为对象结构每个具体元素类声明一个访问操作。Element&#xff1a;抽象元素&#xff0c;定义一个accept方法ConcreteElement&#xff1a;具体元…

docker 资源限制

目录 1、CPU使用率 2、CPU共享比例 3、CPU周期限制 4、CPU核心限制 5、CPU 配额控制参数的混合案例 6、内存限制 7、Block IO 的限制 8、限制bps 和iops docker资源限制 Docker容器技术底层是通过Cgroup&#xff08;Control Group 控制组&#xff09;实现容器对物理资…

Android 性能调优之bitmap的优化

背景 Android开发中&#xff0c;加载图片过多、过大很容易引起OutOfMemoryError异常&#xff0c;即我们常见的内存溢出。因为Android对单个应用施加内存限制&#xff0c;默认分配的内存只有几M&#xff08;具体视不同系统而定&#xff09;。而载入的图片如果是JPG之类的压缩格…

【unity】Pico VR 开发笔记(视角移动)

【unity】Pico VR 开发笔记&#xff08;视角移动&#xff09; 视角移动是简单的基础功能&#xff0c;这里区别于头显定位获得的小范围位移&#xff0c;是长距离不影响安全边界的位移方式。的常见的位移方式有两种&#xff0c;其一是触发后瞬间传送到指定位置&#xff0c;其次是…

IDEA用Gradle构建项目时,lombok插件无效的解决办法

Lombok 可用来帮助开发人员消除 Java 的重复代码&#xff0c;尤其是对于简单的 Java 对象&#xff08;POJO&#xff09;&#xff0c;比如说getter/setter/toString等方法的编写。它通过注解实现这一目的。 正确使用姿势 一、安装Lombok插件 菜单栏File -> Settings ->…