场景:整个系统的DML操作需要记录日志

记录内容:1 操作人 2 操作时间 3 操作类型(登录 新增 修改 删除) 4 操作描述  5 详细请求数据(varchar2()) 6 操作IP  ==>日志表

实现:

原来方式:在每个方法的里面编写记录日志代码;

缺点:代码重复 ,与原有逻辑耦合度高。

AOP: 将日志记录功能提取到切面中。动态切入到需要日志记录的方法上即可;

优点: 解耦合,代码复用。

1) 先写一个日志切面LogAspect.java;

//日志切面

@Component//对象由spring管理

@Aspect//切面注解

public classLogAspect {//定义切入点,切入到添加了LogData注解的方法上

@Pointcut("@annotation(aop.LogData)")public voidpointCut(){}/**

* 记录日志的切面方法

* 在该方法中定义统一的日志记录逻辑

* @param joinPoint*/@Before("pointCut()")public voidlog(JoinPoint joinPoint){

System.out.println("进入日志Aspect");

}

}

2)写一个日志信息LogData.java;

//自定义日志注解

@Target({ElementType.METHOD})//指定作用的目标对象(可以添加的位置)

@Retention(RetentionPolicy.RUNTIME)//指定在运行期间起作用

public@interface LogData {//定义注解中的属性

String description() default "";//日志类型

intlogType();

}

3)在控制层方法上写上注解,加上描述信息,描述日志;

@LogData(logType = 1,description = "学生信息修改")

@RequestMapping("/update")publicString update(Integer id,ModelMap modelMap){//查询用户信息,展示到页面

Student student=studentService.findById(id);

modelMap.put("student",student);return "update.jsp";

}

要想起作用,还要在springmvc.xml配置文件中配置AOP注解;

二、自定义注解

枚举:jdk1.5之后存在的一种数据类型。用来定义有限个对象。 enum

语法:

Public enum 类名{

对象定义;

类的成员定义

}

调用: 类名.对象名 获取枚举对象。

1)创建一个LogType.java文件来写枚举;

/**

* 日志枚举类型

* 枚举是一个特殊的类

* class 可以创建n个对象

* 枚举类型的对象是固定的*/

public enumLogType {//创建枚举对象,对象的个数是有限的,对象与对象之间用逗号隔开

LOGIN(1),DELETE(2),UPDATE(3),INSERT(4);//可以定义任意的方法和属性,与普通类类似

private final inttype;//构造方法

LogType(inttype) {this.type =type;

}public intgetType() {returntype;

}

}

2)日志的注解也需要改变为枚举类型的,在LogData.java文件中;

/**

* 自定义注解*/@Target({ElementType.METHOD,ElementType.FIELD})//指定作用的目标对象(可以添加的位置)

@Retention(RetentionPolicy.RUNTIME)public@interface LogData {//定义注解中的属性

String description() default "";//日志类型 1、登录 2、删除 3、修改 4、插入

LogType logType();

}

3)调用日志对象,在控制层中;

@LogData(logType = LogType.DELETE,description = "学生信息删除")

@RequestMapping("/delete")publicString delete(Integer id){

studentService.delete(id);return "redirect:list";

}

@LogData(logType= LogType.UPDATE,description = "学生信息修改")

@RequestMapping("/update2")publicString update2(Integer id,ModelMap modelMap){

Student student=studentService.selectById(id);

modelMap.put("student",student);return "update.jsp";

}

@LogData(logType= LogType.INSERT,description = "学生信息新增")

@RequestMapping("/insert")publicString insert(Student student){

studentService.insert(student);return "redirect:list";

}

4)写LogAspect.java文件;

@Component//对象由spring管理

@Aspect//切面注解

public classLogAspect {private static final Logger LOGGER = LogManager.getLogger(LogAspect.class);//定义切入点,切入到添加了LogData注解的方法上

@Pointcut("@annotation(aop.LogData)")public voidpointCut(){

}/**

* 记录日志的切面方法

* 在该方法中定义统一的日志记录逻辑

* @param joinPoint*/@Before("pointCut()")public voidlog(JoinPoint joinPoint){

System.out.println("进入日志Aspect");//获取到方法签名

MethodSignature signature=(MethodSignature) joinPoint.getSignature();//获取到连接点方法对象

Method method=signature.getMethod();//获取方法上面特定的注解

LogData annotation=method.getAnnotation(LogData.class);

LogType logType=annotation.logType();

String description=annotation.description();

LOGGER.info("获取到注解内容:logType="+logType.getType()+",description:"+description);//aop中获取request

ServletRequestAttributes requestAttributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request=requestAttributes.getRequest();

HttpSession session=request.getSession();//获取操作人

Student student= (Student) session.getAttribute("student");//获取请求数据

Map parameterMap=request.getParameterMap();//将对象转换成json字符串==>存储到请求数据字段中//jackSon json字符串操作

ObjectMapper objectMapper=newObjectMapper();try{

String s=objectMapper.writeValueAsString(parameterMap);

LOGGER.info("请求数据:"+s);

}catch(JsonProcessingException e) {

e.printStackTrace();

}//todo 将日志信息保存到数据库 LogController service mapper jsp

}

}

三、枚举

枚举可用于switch语句中

public classT {public static voidmain(String[] args) {

test(LogType.DELETE);//获取到枚举对象

LogType logType =LogType.DELETE;//获取到对象之后,与普通对象操作方式一样

int type =logType.getType();

}/**

* 枚举类型在switch中的使用

* @param logType*/

public static voidtest(LogType logType) {switch(logType){caseLOGIN:

System.out.println("登录操作");break;caseDELETE:

System.out.println("删除操作");break;caseINSERT:

System.out.println("插入操作");break;caseUPDATE:

System.out.println("修改操作");break;

}

}

}

四、枚举还是实现单例模式的最佳方式

java aop日志记录_AOP实现日志记录功能相关推荐

  1. aop日志(记录方法调用日志)

    一,使用aop记录方法调用日志 1)使用注解与aop做方法调用日志,只需要把注解添加在要记录的方法上就可以,不会影响代码结构 2)实现思路 数据库表建立>>配置需要环境>>自定 ...

  2. Spring Boot + Aop 记录用户操作日志

    目录 一.前言 二.实战 1.设计用户操作日志表: sys_oper_log 2.引入依赖 3.自定义用户操作日志注解 4.自定义用户操作日志切面 5.MyLog注解的使用 6.最终效果 三.总结 一 ...

  3. JPOM - AOP+自定义注解实现操作日志记录

    文章目录 地址 版本 源码解析-AOP+自定义注解实现操作日志记录 地址 Gitee: https://gitee.com/dromara/Jpom 官网: https://jpom.io/ 一款简而 ...

  4. springboot 利用aop实现系统日志和操作日志记录

    1.目的 通过aop及注解的方式,记录异常信息和特定的操作日志到数据库. 2.引入依赖 <dependency><groupId>org.springframework.boo ...

  5. Java学习day051 记录日志(基本日志、高级日志、修改日志管理器配置、本地化、处理器、过滤器、格式化器、日志记录说明)

    使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识. day051   记录日志(基本日志.高级日志.修改日志管理器配置.本地化.处理器.过滤器.格式化器 ...

  6. 一文搞懂Java日志级别,重复记录、丢日志问题

    1 SLF4J 日志行业的现状 框架繁 不同类库可能使用不同日志框架,兼容难,无法接入统一日志,让运维很头疼! 配置复杂 由于配置文件一般是 xml 文件,内容繁杂!很多人喜欢从其他项目或网上闭眼co ...

  7. java基于servlet开发的旅游日志博客系统用来记录旅行的

    简介 记录个人旅游动态日志的系统,也可以用来做博客系统,主页可以发布旅游日志,关注博主,给博主留言,管理评论,博文点赞,个人主页. 演示视频 https://www.bilibili.com/vide ...

  8. 找到合适的方案记录服务端日志

    做过服务端开发的同学都清楚日志是多么的重要,你要分析应用当天的 PV/UV,你需要对日志进行统计分析; 你需要排查程序 BUG, 你需要寻找日志中的异常信息等等, 所以, 建立一套合适的日志体系是非常 ...

  9. 如何在ABAP Netweaver和CloudFoundry里记录并查看日志

    Netweaver 要记录日志需要有一个checkpoint group,可以自行创建也可以使用标准的.这里我重用标准的group:DEMO_CHECKPOINT_GROUP. tcode SAAB, ...

最新文章

  1. 清华博士接亲被要求现场写代码,5 分钟做出一颗爱心
  2. python爬取小说章节信息用pygame进行数据显示_爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)...
  3. Python 编码风格指南
  4. Fabric学习笔记-PBFT算法
  5. Zoom 是如何击败科技巨头的?
  6. webkit的编译(r76498)
  7. SOLIDWORKS流体分析为什么两栋楼之间会感觉风大
  8. w7设置双显示器_4K+144Hz 支持FreeSync Acer XV273K显示器评测
  9. 290页11万字数字农业农村项目规划建设方案2022
  10. EXCEL+方方格子中的翻译工具+百度翻译=实现批量翻译
  11. python多元非线性回归_Python利用神经网络解决非线性回归问题实例详解
  12. H5调用手机的前后摄像头,canvas显示,自带截图,兼容ios和android
  13. RK3399 Android7.1如何查看屏幕分辨率
  14. GIFCAM GIF录制编辑工具 V5.5中文版 GIF制作
  15. uniapp 小程序 easycom 配置 找不到组件 失效问题
  16. camera360android版有全景功能吗,用软件拍摄360全景照片 安卓机也可以
  17. Unity案例-实现心电图效果
  18. 冯唐:年轻人到底挣多少钱算够?
  19. 2652: 今夕何夕
  20. 【Vue】Vue项目报错Analyzer will use module sizes from stats file.

热门文章

  1. java strtotime_js模仿php中strtotime()与date()函数实现方法
  2. 《易流》电子商务平台经营模式和技术分析
  3. 打开百度时地址栏有其他地址闪过
  4. 项目15—温度计与电子表用LCD1602显示
  5. dota2已连接协调服务器,正在登陆中的解决办法
  6. A Simple Framework for Contrastive Learning of Visual Representations
  7. java appkey_如何使用Microsoft Graph API获取AppKey
  8. 瓦片地图的URL解读
  9. Python中*args、**args到底是什么、有啥区别、怎么用
  10. Bootstrap 创建表格通讯录