AOP案例(日志)

Logs 实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel
public class Logs implements Serializable {private static final long serialVersionUID = -89998567097386518L;/*** 日志ID*/@ApiModelProperty(hidden = true)private Integer opid;/*** 操作时间*/@ApiModelProperty(name = "optime",value = "操作时间",dataType = "string",example = "2021-12-28")private String optime;/*** 操作ip*/@ApiModelProperty(name = "ip",value = "操作IP",dataType = "string",example = "192.168.1.1")private String ip;/*** 操作方法*/@ApiModelProperty(name = "methods",value = "操作方法",dataType = "string",example = "save")private String methods;/*** 操作方法描述*/@ApiModelProperty(name = "ddesc",value = "操作方法描述",dataType = "string",example = "添加xxx数据")private String ddesc;
}

AdministratorsController

@RestController
@RequestMapping("/administrators")
@Api(tags = "管理员控制器")
@CrossOrigin //解决跨域访问
public class AdministratorsController {@Resourceprivate AdministratorsService administratorsService;@ApiImplicitParams({@ApiImplicitParam(name = "page",value = "分页起始数据",example = "1",required = true,dataType = "integer"),@ApiImplicitParam(name = "size",value = "每页显示最大记录数",example = "10",required = true,dataType = "integer"),@ApiImplicitParam(name = "username",value = "管理员姓名",example = "小杨",dataType = "string")})@GetMapping("/listPage")@ApiOperation("分页查询管理员信息")@SystemControllerLog(description = "分页查询管理员信息") //一会儿的自定义注解public CommonResult listpage(int page, int size, String username){Map<String,Object> map= new HashMap();map.put("data",administratorsService.listpage(page,size,username));map.put("count",administratorsService.count(username));return CommonResult.success(map);}
}

LogsService

package com.vrms.app.service;import com.vrms.app.entity.Logs;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface LogsService {List<Logs> listPage(@Param("page") int page,@Param("size") int size);int count();boolean save(Logs logs);}

LogsServiceImpl

@Service
public class LogsServiceImpl implements LogsService {@Resourceprivate LogsDao logsDao;@Overridepublic List<Logs> listPage(int page, int size) {return logsDao.listPage((page - 1) * size, size);}@Overridepublic int count() {return logsDao.count();}@Overridepublic boolean save(Logs logs) {return logsDao.save(logs) > 0;}}

LogsDao

package com.vrms.app.dao;import com.vrms.app.entity.Logs;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface LogsDao {List<Logs> listPage(@Param("page") int page,@Param("size") int size);int count();int save(Logs logs);}

LogsDao.xml

<?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.vrms.app.dao.LogsDao"><insert id="save">insert into logs(optime, ip, methods, ddesc)values (#{optime}, #{ip}, #{methods}, #{ddesc})</insert><select id="listPage" resultType="com.vrms.app.entity.Logs">select *from logsorder by opid desclimit #{page},#{size}</select><select id="count" resultType="java.lang.Integer">select count(*)from logs</select>
</mapper>

自定义注解SystemControllerLog

package com.vrms.app.aop;import java.lang.annotation.*;@Target({ElementType.PARAMETER, ElementType.METHOD})//作用在参数和方法上
@Retention(RetentionPolicy.RUNTIME)//运行时注解
@Documented//表明这个注解应该被 javadoc工具记录
public @interface SystemControllerLog {String description() default "";
}

SystemLogAspect

package com.vrms.app.aop;import com.vrms.app.entity.Logs;
import com.vrms.app.service.LogsService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;@Aspect
@Component
public class SystemLogAspect {private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect.class);@Resourceprivate LogsService logsService;//Controller层切点@Pointcut("@annotation(SystemControllerLog)")public void controllerAspect() {}@Before("controllerAspect()")public void doBefore(JoinPoint joinPoint) {HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();try {Logs logs = new Logs();logs.setMethods((joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName()));logs.setDdesc(getControllerMethodDescription(joinPoint));logs.setIp(request.getRemoteAddr()); //获得访问IP地址记录到日志的IP属性中logs.setOptime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));if(logsService.save(logs)){System.out.println("日志添加成功");}else{System.out.println("日志添加失败");}} catch (Exception e) {//记录本地异常日志logger.error("==前置通知异常==");logger.error("异常信息:{}", e.getMessage());}}/*** @Description 获取注解中对方法的描述信息 用于Controller层注解*/public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {String targetName = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();//目标方法名Object[] arguments = joinPoint.getArgs();Class targetClass = Class.forName(targetName);Method[] methods = targetClass.getMethods();String description = "";for (Method method : methods) {if (method.getName().equals(methodName)) {Class[] clazzs = method.getParameterTypes();if (clazzs.length == arguments.length) {description = method.getAnnotation(SystemControllerLog.class).description();break;}}}return description;}}

获取注解中对方法的描述信息其他方式

/*** @Description 获取注解中对方法的描述信息 用于Controller层注解 */
public static String getControllerMethodDescription(JoinPoint joinPoint) {MethodSignature methodSignature =(MethodSignature) joinPoint.getSignature();SystemLog systemLog = methodSignature.getMethod ().getAnnotation(SystemLog.class);return systemLog.description();
}

获取注解中对方法的描述信息其他方式(环绕通知中参数为ProceedingJoinPoint)

/*** @Description 获取注解中对方法的描述信息 用于Controller层注解 (环绕通知参数为 ProceedingJoinPoint)*/
public static String getControllerMethodDescription(ProceedingJoinPoint joinPoint) {MethodSignature methodSignature =(MethodSignature) joinPoint.getSignature();SystemLog systemLog = methodSignature.getMethod ().getAnnotation(SystemLog.class);return systemLog.description();
}

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

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

相关文章

jzoj1164-求和【欧拉函数,数论】(筛欧拉函数模板)

正题 大意 给出一个nn,求1&#x223C;n" role="presentation" style="position: relative;">1∼n1∼n里面和nn互质的数的和。解题思路&#x03C6;(i)" role="presentation" style="position: relative;">φ(i)φ(…

升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

概述 容器&#xff0c;顾名思义是用来存放并容纳东西的器皿&#xff1b; 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘&#xff0c;它是一个抽象的概念&#xff0c;同时也是默默存在世上多年的技术&#xff0c;不仅能使应用程序间完全的隔离&#xff0c;而且还能在共享…

MySQL 大表优化方案(1)

转载自 干货&#xff01;&#xff01;&#xff01;MySQL 大表优化方案&#xff08;1&#xff09; 当MySQL单表记录数过大时&#xff0c;增删改查性能都会急剧下降&#xff0c;可以参考以下步骤来优化&#xff1a; 单表优化 除非单表数据未来会一直不断上涨&#xff0c;否则…

顺时针打印3*3矩阵

import java.util.ArrayList; public class Mytest { //剑指OFFer 顺时针打印n*m矩阵 //思路 模拟过程 以顺时针顺序打印几层 取决于行数与列数中最小的那一个 两层构成一圈 两个之中最小的那个除以2 // public static void main(String[] args) { String[][] a new String[][]…

Spring Data Elasticsearch

文章目录一、 ELK二、 Elasticsearch简介三、 Linux安装Elasticsearch四、SpringData Elasticsearchpom.xmlapplication.yml创建实体创建索引 设置映射简单增删改查搜索五、 LogStash六、 使用Logback向Logstash中输出日志七、 在Kibana中查看日志信息八、 搭建日志系统九、 在…

项目参与度较低怎么办?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。经过这两天做项目的表现&#xff0c;可以很明显的看的出来学生与学生之间掌握的还是有差距的&#xff0c;组内有的组员是可以为项目贡献代码的&#xff0c;但是有的组员可能只能是贡献素材&#xff0c;…

从 TFS 迁移源代码到 git

准备工具&#xff1a; https://github.com/git-tfs/git-tfs 具体的安装步骤上面的 readme.md 中有说明。通过 Chocolatey 安装&#xff0c;如果本地没有 git &#xff0c;会自动安装 git 到本地。 迁移步骤&#xff1a; 从 Visual Studio 里面进入 Source Control Explorer…

缓存穿透、缓存并发、缓存失效之思路变迁

转载自 缓存穿透、缓存并发、缓存失效之思路变迁 在用缓存的时候&#xff0c;基本上会通用遇到以下三个问题&#xff1a; 缓存穿透缓存并发缓存失效 一、缓存穿透 上面三个图会有什么问题呢&#xff1f; 我们在项目中使用缓存通常都是先检查缓存中是否存在&#xff0c;如果…

jzoj3792,P2062-分队问题【贪心】

前言 题解上说&#xff1a; 然而我的贪心不仅A了&#xff0c;而且 反例也A了 自己的洛谷题解链接&#xff1a;https://www.luogu.org/blog/user52918/solution-p2062 正题 大意 n个人&#xff0c;每个人有一个要求a[i]表示他所在的队伍里不可以少于a[i]个人&#xff0…

反射---

问题1&#xff1a; Exception in thread “main” java.lang.NoSuchMethodException: com.bjsxt. why.Dog.(java.lang.String, java.lang.String) 原因&#xff1a;getConstructor只能获取public方法&#xff0c;无法获取其他修饰符修饰的方法。 解决&#xff1a;调用getDeclar…

.net core 2.0学习笔记(二):Hello World amp;amp; 进阶

官网已经有一个.net core的入手教程&#xff08;https://www.microsoft.com/net/core#windowscmd&#xff09;&#xff0c;但这个教程完全没有顾及全宇宙第一IDE的感受。今天就跟大家体验一下在VS2017上开发.net core程序吧。VS2017开发环境的搭建请参考&#xff1a;http://www…

MyBatis】MyBatis一级缓存和二级缓存

转载自 MyBatis】MyBatis一级缓存和二级缓存 MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。 也就是在同一个SqlSession中&#xff0c;执行相同的查询SQL&#xff…

jzoj3793,P2090-数字对【更相减损术,欧几里得算法,数论】

正题 题目链接&#xff1a; https://www.luogu.org/problemnew/show/P2090 大意 一个数对(a,b)&#xff0c;每次可以变为(ab,b)或(a,ab)。然后要求一个数对中有n求从(1,1)变成这个数对的最小次数。 解题思路 更相减损法是gcd(a,b)gcd(a,b-a)/gcd(a-b,b) 证明&#xff1a; …

反射与注解

文章目录一、反射二、注解一、反射 1.1反射引入 • 编译时知道类或对象的具体信息&#xff0c;此时直接对类和对象进行操作即可&#xff0c;无需反射&#xff08;reflection&#xff09; • 如果编译不知道类或对象的具体信息&#xff0c;此时应该如何做呢&#xff1f;使用反射…

.net core 2.0学习笔记(一):开发运行环境搭建

期待已久的.net core 2.0终于发布了&#xff01;大家等的花儿都谢了。 不过比预期提前了一个多月&#xff0c;这在微软历史上还真的不多见。按照历史经验看&#xff0c;2.0版本应该比较靠谱&#xff0c;我猜这也是社区非常火爆的原因吧。下面就简单分享一下.net core2.0开发运行…

不好意思,你这个加分理由不行……

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。周五了&#xff0c;又该周测了&#xff0c;今天和以往一样&#xff0c;上午前两节课都在上课&#xff0c;第三节课进行测试&#xff0c;这周的填空题有点儿多&#xff0c;所以考试的时间较…

SQL索引一步到位

转载自 SQL索引一步到位 SQL索引在数据库优化中占有一个非常大的比例&#xff0c; 一个好的索引的设计&#xff0c;可以让你的效率提高几十甚至几百倍&#xff0c;在这里将带你一步步揭开他的神秘面纱。 1.1 什么是索引&#xff1f; SQL索引有两种&#xff0c;聚集索引和非聚…

jzoj3794,P1383-高级打字机【欧拉序,离线O(n)】

正题 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1383 大意 三个操作 T c&#xff1a;加入一个字符c U x&#xff1a;撤销前x次操作&#xff08;只包括T和U&#xff09; Q x&#xff1a;询问当前第x个字符 解题思路 对于50%的数据U不会撤销到U 所以我们可…

你也可以做一个简易抽奖程序!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天给大家分享一个使用winform制作的小案例——随机点名&#xff08;抽奖&#xff09;程序&#xff0c;下面我们来看看运行结果&#xff1a;在班内点名为了公平起见&#xff0c;一直使用的…

ASP.NET Core 2.0 特性介绍和使用指南

ASP.NET Core 2.0 发布日期&#xff1a;2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布&#xff0c;发布Visual Studio 2017 15.3支持ASP.NET Core 2.0&#xff0c;提供新的Razor Pages项目模板。 详细发布信息查看.NET Core 2.0.0发布说明文档 最新版SDK下载&…