提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Spring AOP 简介
一、aop是什么
Spring AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在提高模块化,特别是关注点分离。它允许将横切关注点(如日志记录、事务管理、安全检查等)从业务逻辑中分离出来,从而提高代码的可维护性和复用性。
二、为什么使用 Spring AOP?
关注点分离:将业务逻辑与横切关注点分离,使代码更加清晰和模块化。
代码复用:横切关注点可以被多个业务模块重用,减少重复代码。
增强功能:通过切面(Aspect)可以在不修改原有代码的情况下,动态地增加新的功能。
简化开发:Spring AOP 提供了强大的工具和注解,使得 AOP 编程变得更加简单和直观。
如何在 Spring Boot 项目中使用 Spring AOP?
要在 Spring Boot 项目中使用 Spring AOP,首先需要在项目的 pom.xml 文件中添加 spring-boot-starter-aop 依赖。以下是具体的依赖配置:
二、使用步骤
1.引入依赖
代码如下(示例):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.aop基于注解使用(这样更灵活定位接口)
代码如下(示例):
package com.xiaogung.logs.annotation; import com.xiaogung.logs.domain.enums.BusinessTypeEnum; import java.lang.annotation.*; /** * 自定义操作日志记录注解 * @author qrxm */ @Target(ElementType.METHOD) // 注解只能用于方法 @Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期 public @interface Log { String value() default ""; /** * 模块 */ String title() default "测试模块"; /** * 方法名称 */ String method() default "测试方法"; /** * 功能 */ BusinessTypeEnum businessType() default BusinessTypeEnum.OTHER; }
package com.xiaogung.logs.aop; import com.xiaogung.logs.annotation.Log; import com.xiaogung.logs.domain.po.SysLog; import com.xiaogung.logs.listener.EventPubListener; import com.xiaogung.logs.uilts.IpUtils; import com.xiaogung.tool.domain.po.SysUser; import com.xiaogung.tool.utils.JwtTokenUtil; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; 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 java.util.Date; @Aspect @Component @RequiredArgsConstructor public class SysLogAspect { private final JwtTokenUtil jwtTokenUtil; private final Logger logger = LoggerFactory.getLogger(SysLogAspect.class); private final EventPubListener eventPubListener; /** * 以注解所标注的方法作为切入点 */ @Pointcut("@annotation(com.xiaogung.logs.annotation.Log)") public void sysLog() {} /** * 在切点之后织入 * @throws Throwable */ @After("sysLog()") public void doAfter(JoinPoint joinPoint) { Log log = ((MethodSignature) joinPoint.getSignature()).getMethod() .getAnnotation(Log.class); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String method = request.getMethod(); String url = request.getRequestURL().toString(); String ip = IpUtils.getIpAddr(request); SysLog sysLog = new SysLog(); sysLog.setBusinessType(log.businessType().getCode()); sysLog.setTitle(log.title()); sysLog.setMethod(log.method()); sysLog.setRequestMethod(method); sysLog.setOperIp(ip); sysLog.setOperUrl(url); if(request.getHeader("Authorization")!=null){ SysUser userInfo= jwtTokenUtil.getUserNameFromToken(request.getHeader("Authorization")); sysLog.setOperName(userInfo.getUserName()); } sysLog.setOperTime(new Date()); // 发布消息 eventPubListener.pushListener(sysLog); logger.info("=======日志发送成功,内容:{}",sysLog); } } 这里我没有使用异步
@Log(value = "用户登录",title = "用户登录",method = "POST",businessType = BusinessTypeEnum.SELECT) @PostMapping("/login") @Operation(summary = "用户登录") public Result login(@RequestBody SysUserDTO sysUserDTO){ log.info("用户登录{}",sysUserDTO); loginVo s= sysUserService.login(sysUserDTO); return Result.SUCCESS(s); }
展示结果
可以看到日志记录了在看看数据库
成功了是不是很简单信息所有人都可以
总结
如果没有成功看看是不是依赖冲突,解决办法修改依赖版本。