当前位置: 首页 > news >正文

AOP面向切面编程和log4j的使用(Java版)

  • 什么是面向切面编程

        在传统的面向对象编程中,程序的功能被模块化成各个类和方法,这些类和方法分别处理特定的功能。然而,有些功能可能涉及到多个类、多个方法,例如日志记录、事务管理、性能监控等,这些功能可能在不同的地方重复出现,导致代码的重复性和复杂性增加。

AOP 解决了这个问题,它允许你在程序的运行时,将这些横切逻辑(cross-cutting concerns)从它们所影响的对象中分离出来,然后以一种更模块化的方式进行管理。

  • 示例

        客户端请求服务端接口时,记录请求的接口信息,包括接口请求时间、接口名称、请求内容以及返回结果等信息。实现步骤如下:

        1. 配置log4j的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info"><Loggers><Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="RollingFile"/></Root></Loggers><Appenders><!--控制台输出的配置--><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><!--输出到文件的配置--><RollingFile name="RollingFile" fileName="./data/logs/app.log"filePattern="./data/logs/app-%d{yyyy-MM-dd}-%i.log.gz"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="1 MB"/></Policies><DefaultRolloverStrategy max="10"/></RollingFile></Appenders></Configuration>

        2. 在项目中添加依赖(log4j和AOP)

<!-- 引入log4j2依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
<!--AOP--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

        3. 创建一个拦截器类,用于拦截Api请求和响应,记录日志。

@Slf4j
@Aspect   //定义一个切面
@Component  //标记该类作为Spring托管的组件。可以通过依赖注入在其他地方使用
public class ApiMonitorFilter{//在执行com.example.service包下所有的方法之后打印日志@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")public void logAPICall(JoinPoint joinPoint, Object result) {long currentTime = System.currentTimeMillis();String apiName = joinPoint.getSignature().getName();Object[] args = joinPoint.getArgs();ObjectMapper objectMapper = new ObjectMapper();String aa=null;try {aa=objectMapper.writeValueAsString(args);} catch (JsonProcessingException e) {throw new RuntimeException(e);}log.info("进入过滤器:开始监控api信息.........");log.info("接口相应时间{}:",currentTime);log.info("接口名称{}:",apiName);log.info("请求内容{}:",aa);log.info("响应结果{}:",result);}
}

        2. 写一个接口

//@Controller  //@Controller返回的是一个视图View,需要搭配@ResponseBody使用,两个的结合相当于@RestController,可以直接返回一个对象。
//@ResponseBody
@RestController
@RequestMapping("/api/test")
@Slf4j
public class TestController {@ResourceTestService testService; //接口中调用的方法  import com.example.service.TestService;@PostMapping(value = "/getValue")public  String GetValue(int a,int b){log.info("进入Controller");String result=testService.CalculateValue(a,b);return  result;}
}

运行结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多列传感器数据多项式拟合python脚本
  • 斯坦福UE4 C++课学习补充 14:UMG-优化血量条
  • spring常用注解有哪些
  • YOLOv5改进 | 注意力机制 | 二阶注意力网络来进行单图像超分辨率【附网盘完整代码】
  • 力扣SQL 最后一个能进入巴士的人 自连接
  • 【爱上C++】list用法详解、模拟实现
  • 放大电路总结
  • electron 网页TodoList工具打包成win桌面应用exe
  • lua 游戏架构 之 游戏 AI (九)ai_mgr Ai管理
  • Matlab M_map工具箱绘制Interrupted Mollweide Projection
  • 【React 】开发环境搭建详细指南
  • Java中的集合相关知识汇总
  • 【Go】探索 Go 语言的内建函数 copy
  • nacos2.x作为配置中心和服务注册和发现以及springcloud使用
  • linux离线安装mysql8(单机版)
  • C# 免费离线人脸识别 2.0 Demo
  • Consul Config 使用Git做版本控制的实现
  • Debian下无root权限使用Python访问Oracle
  • HomeBrew常规使用教程
  • httpie使用详解
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript的使用你知道几种?(上)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js学习笔记
  • nodejs实现webservice问题总结
  • python 装饰器(一)
  • Unix命令
  • 动态规划入门(以爬楼梯为例)
  • 对象引论
  • 嵌入式文件系统
  • 世界上最简单的无等待算法(getAndIncrement)
  • 推荐一个React的管理后台框架
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序:实现悬浮返回和分享按钮
  • 项目管理碎碎念系列之一:干系人管理
  • 在Mac OS X上安装 Ruby运行环境
  • 【干货分享】dos命令大全
  • Semaphore
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​linux启动进程的方式
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​如何防止网络攻击?
  • #70结构体案例1(导师,学生,成绩)
  • #QT(一种朴素的计算器实现方法)
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (C++哈希表01)
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (函数)颠倒字符串顺序(C语言)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (四) 虚拟摄像头vivi体验
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)SpringBoot3---尚硅谷总结