首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring AOP实现简单的日志功能

Spring AOP实现简单的日志功能

作者头像
秃头哥编程
发布于 2019-06-04 09:15:16
发布于 2019-06-04 09:15:16
59500
代码可运行
举报
文章被收录于专栏:秃头哥编程秃头哥编程
运行总次数:0
代码可运行

AOP对代码的侵入性非常的小,是一种可插拔的思想,大大降低了耦合度,AOP在许多地方都有应用,这篇文章就看看使用AOP实现日志的功能,也算是AOP思想的一种体现了。

主要是在用户访问一个URL前,记录用户的ip,访问方式,访问的URL,访问的哪个方法以及该方法的参数,访问URL后,记录访问返回的结果。

整个项目基于Spring Boot构建。

首先建立一个实体类Man,对应数据库中的一个表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
public class Man {
    // 主键、自增
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    private Integer age;
    // 省略get/set方法
}
使用jpa实现基本的CRUD(没搞service,直接在controller里干了,凑合着看~)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping("/man")
public class ManController {
    @Autowired
    private ManDao manDao;
    
    @Autowired
    private ManService manService;
    
    private Logger logger = LoggerFactory.getLogger(ManController.class);
    
    /**
     * 添加一条记录
     * @param man 结果集合
     * @Validated 注解
     * @return
     */
    @GetMapping("/insertMan")
    public Man insertOne(@Validated Man man, BindingResult br) {
        man.setName(man.getName());
        man.setAge(man.getAge());
        return manDao.save(man);
    }
    
    /**
     * 获取所有记录
     * @return
     */
    @GetMapping("/manList")
    public List<Man> getList() {
        logger.info("getList");
        return manDao.findAll();
    }
    
    /**
     * 根据id查询一条记录
     * @param id
     * @return
     */
    @GetMapping("/man/{id}")
    public Man getOne(@PathVariable("id") Integer id) {
        return manDao.findOne(id);
    }
    
    /**
     * 更新指定的一条记录
     * @param id
     * @param name
     * @param age
     * @return
     */
    @GetMapping("/updateMan/{id}")
    public Man updateOne(@PathVariable("id") Integer id, @RequestParam("name") String name, 
            @RequestParam("age") Integer age) {
        Man man = new Man();
        man.setId(id);
        man.setName(name);
        man.setAge(age);
        return manDao.save(man);
    }
    
    @RequestMapping("/deleteMan/{id}")
    public void deleteOne(@PathVariable("id") Integer id) {
        manDao.delete(id);
    }
    
    @RequestMapping("/insertTwo")
    public void insertTwo() {
        manService.insertTwo();
    }
}
使用AOP实现日志功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Component 该注解表示把类加入spring容器
 * @Aspect 该注解表示切面
 * @author liu
 */
@Component
@Aspect
public class Log {
    
    private Logger logger = LoggerFactory.getLogger(Log.class);
    
    /**
     * 定义一个公共切点,代码复用
     * 拦截com.codeliu.controller.ManController类下面的所有public方法
     */
    @Pointcut(value = "execution(public * com.codeliu.controller.ManController.*(..))")
    private void log() {}
    
    /**
     * 方法执行前切入
     */
    @Before(value = "log()")
    public void before(JoinPoint joinPoint) {
        ServletRequestAttributes sa = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = sa.getRequest();
        // 获取用户访问的url
        logger.info("url={}", request.getRequestURL());
        // 获取用户访问的方式,get/post
        logger.info("method={}", request.getMethod());
        // 获取的ip
        logger.info("ip={}", request.getRemoteAddr());
        // 获取用户访问的是哪个方法
        logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        // 获取方法的参数
        logger.info("args={}", joinPoint.getArgs());
    }
    
    @After(value = "log()")
    public void after() {
        logger.info("记录操作后");
    }
    
    /**
     * 打印返回的内容
     * @param object
     */
    @AfterReturning(value = "log()", returning = "object")
    public void afterReturn(Object object) {
        logger.info("object={}", object);
    }
}

切点是ManController 下面的所有public方法,在执行方法前,记录访问的URL等信息,方法返回后,记录返回的结果(@AfterReturning注解的returning 属性)。

试着访问一下getList方法获取数据库所有记录

可以看看控制台的输出

这样使用aop就实现了一个简单的日志功能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秃头哥编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot如何利用AOP巧妙记录操作日志?
SpringAOP的相关的知识点包括源码解析,我已经在之前的文章中详细说明,如果对AOP的概念还不是特别清晰的话。
烂猪皮
2021/01/14
1.2K0
Spring Boot如何利用AOP巧妙记录操作日志?
Spring Boot 之优雅使用 AOP
简述何为AOP AOP为Aspect Oriented Programming的缩写,意思是面向切面编程,通过预编译的方式和运行时动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑进行分离,降低耦合度,提高可重用性,提高开发效率。 主要用途 日志记录 事务处理 异常处理 安全处理 性能统计 ··· 在Spring Boot中使用AOP记录接口访问记录 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId>
Bobby
2019/06/11
9030
初识SpringBoot Web开发
虽说前端的h5和js都可以完成表单的字段验证,但是这只能是防止一些小白、误操作而已。如果是一些别有用心的人,是很容易越过这些前端验证的,有句话就是说永远不要相信客户端传递过来的数据。所以前端验证之后,后端也需要再次进行表单字段的验证,以确保数据到后端后是正确的、符合规范的。本节就简单介绍一下,在SpringBoot的时候如何进行表单验证。
端碗吹水
2020/09/23
4780
初识SpringBoot Web开发
Spring Boot AOP 扫盲
大家好,我是二哥呀。AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层添加一个切面来实现接口访问的统一日志记录。
沉默王二
2022/03/07
5650
Spring Boot AOP 扫盲
Spring Boot 知识点速记
本文是学习2小时学会Spring Boot和Spring Boot进阶之Web进阶的SpringBoot常用知识点速记。 SpringBoot前置知识: Spring:相关资料参考Spring知识点速查 Maven:相关资料参考Maven知识点速查 项目属性配置 配置项 resources/application.yml girl: cupSize: B age: 18 自动注入类中 @Component @ConfigurationProperties(prefix = "girl") publi
linxinzhe
2018/04/10
1.3K0
SpringBoot AOP 自定义注解异步监听方式实现日志记录(附源码)
主要记录的信息有: 操作人,操作IP,方法名,参数,消耗时间,日志类型,操作类型(操作日志和异常日志)以及增删改查记录,操作时间等。
小东啊
2019/06/26
3.2K0
SpringBoot AOP 自定义注解异步监听方式实现日志记录(附源码)
Spring Boot---(25)SpringBoot使用AOP
摘要:本文示例,是在一个简单的SpringBoot项目中,通过AOP技术,来实现对接口访问时的信息统计,和接口耗时统计。
IT云清
2019/01/22
6040
Spring Boot Web 开发相关总结
首先, 在实体类的需要验证的字段上添加添加验证注解, 验证注解类主要在 validation-api-1.1.0.Final.jar 的 javax.validation.constraints 包下, 以及 hibernate-validator-5.3.6.Final.jar 的 org.hibernate.validator.constraints 包下, 常用验证注解: @Min @Max @Length @Email 等.
北漂的我
2019/05/28
4630
Java自定义注解:定义、解析,AOP切面与日志打印
本文主要介绍了 Java 中的自定义注解以及结合 AOP(面向切面编程)技术进行日志记录的方法。
Yeats_Liao
2025/01/10
5520
Java自定义注解:定义、解析,AOP切面与日志打印
Spring AOP使用
AOP全程是Aspect—Oriented—Programming,面向切面编程。AOP采用横向抽取机制,将分散在各个方法中的重复代码抽取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
ha_lydms
2023/08/09
2040
Spring AOP使用
Spring Boot 进阶之 Web 进阶笔记
相应的 Controller 方法,用 Girl 对象接收传递过来的参数,并加上 @Validated 注解。BindingResult 用来接收错误信息
solocoder
2022/04/06
2280
(14)SpringBoot使用AOP
   摘要:本文示例,是在一个简单的SpringBoot项目中,通过AOP技术,来实现对接口访问时的信息统计,和接口耗时统计。
IT云清
2022/05/07
1.4K0
(14)SpringBoot使用AOP
Spring IOC 和 AOP的扩展(注解使用详解: )
上一章简单的使用Spring 通过 setter 访问器实现对属性的赋值; 称为 "设值注入" Spring 还提供了通过构造方法赋值的能力: "构造注入" 上代码! Data接口类型:Data.java
Java_慈祥
2024/08/06
1820
Spring IOC 和 AOP的扩展(注解使用详解: )
写了个牛逼的日志切面,甩锅更方便了!
最近项目进入联调阶段,服务层的接口需要和协议层进行交互,协议层需要将入参 [json 字符串] 组装成服务层所需的 json 字符串,组装的过程中很容易出错。
Java技术栈
2020/10/27
1.8K0
写了个牛逼的日志切面,甩锅更方便了!
【SpringBoot注解-2】AOP相关注解详解
AOP(Aspect Oriented Programming)是面向切面的编程,其编程思想是把散布于不同业务但功能相同的代码从业务逻辑中抽取出来,封装成独立的模块,这些独立的模块被称为切面,切面的具体功能方法被称为关注点。在业务逻辑执行过程中,AOP会把分离出来的切面和关注点动态切入到业务流程中,这样做的好处是提高了功能代码的重用性和可维护性。
云深i不知处
2020/09/16
8190
Spring学习笔记(二十一)——规范开发:SpringBoot表单验证、AOP切面编程、统一返回结果和异常处理
SpringMVC中使用Controller需要配合ResponseBody来返回json格式,springboot4后只需配置RestController就能实现返回json
不愿意做鱼的小鲸鱼
2022/09/26
7730
Spring学习笔记(二十一)——规范开发:SpringBoot表单验证、AOP切面编程、统一返回结果和异常处理
Spring系列六:AOP概念和使用
AOP:面向切面编程。简单说,就是把一些业务逻辑中的相同的代码抽取到一个独立的模块中,让业务逻辑更加清爽。
叶秋学长
2022/07/27
3140
Spring系列六:AOP概念和使用
Springboot项目使用aop切面保存详细日志到ELK日志平台
上一篇讲过了将Springboot项目中logback日志插入到ELK日志平台,它只是个示例。这一篇来看一下实际使用中,我们应该怎样通过aop切面,拦截所有请求日志插入到ELK日志系统。同时,由于往往我们有很多个服务,都需要记录日志,为每个服务都搭建一个ELK并不现实,所以我们采用集中化管理日志,将所有日志都插到同一个ELK中。这样又会遇到另一个问题,就是ES中的Index如果只有一个,那么所有日志都混杂在一个Index里,为日后的检索带来不便,我们希望能根据不同的应用来拆分为不同的ES的Index。
天涯泪小武
2019/01/17
1.5K0
写了个牛逼的日志切面,甩锅更方便了!
最近项目进入联调阶段,服务层的接口需要和协议层进行交互,协议层需要将入参[json字符串]组装成服务层所需的json字符串,组装的过程中很容易出错。入参出错导致接口调试失败问题在联调中出现很多次,因此就想写一个请求日志切面把入参信息打印一下,同时协议层调用服务层接口名称对不上也出现了几次,通过请求日志切面就可以知道上层是否有没有发起调用,方便前后端甩锅还能拿出证据
java进阶架构师
2021/05/08
4420
写了个牛逼的日志切面,甩锅更方便了!
极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介
w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started quickly through a series of examples (github.com)
w4ngzhen
2023/10/17
1790
推荐阅读
相关推荐
Spring Boot如何利用AOP巧妙记录操作日志?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验