From 438290ad52bfcffc9daae15043dbde578080c0c1 Mon Sep 17 00:00:00 2001 From: xuxin <840198532@qq.com> Date: Tue, 28 Oct 2025 16:21:28 +0800 Subject: [PATCH] =?UTF-8?q?tlias=E7=AE=A1=E7=90=86=E7=B3=BB=E7=BB=9F-sprin?= =?UTF-8?q?gAOP=E7=9A=84=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=AE=9E=E7=8E=B0=EF=BC=81=EF=BC=81=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/inmind/aop/MyAspect6.java | 2 +- .../main/java/com/inmind/aop/MyAspect7.java | 26 +++++++ .../main/java/com/inmind/aop/MyAspect8.java | 64 +++++++++++++++++ .../src/main/java/com/inmind/aop/MyLog.java | 11 +++ .../inmind/service/impl/DeptServiceImpl.java | 3 + tlias-web-management/pom.xml | 5 ++ .../src/main/java/com/inmind/anno/Log.java | 12 ++++ .../main/java/com/inmind/aop/LogAspect.java | 69 +++++++++++++++++++ .../com/inmind/mapper/OperateLogMapper.java | 15 ++++ .../main/java/com/inmind/pojo/OperateLog.java | 21 ++++++ .../inmind/service/impl/DeptServiceImpl.java | 8 ++- 11 files changed, 233 insertions(+), 3 deletions(-) create mode 100644 springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect7.java create mode 100644 springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect8.java create mode 100644 springboot-aop-quickstart/src/main/java/com/inmind/aop/MyLog.java create mode 100644 tlias-web-management/src/main/java/com/inmind/anno/Log.java create mode 100644 tlias-web-management/src/main/java/com/inmind/aop/LogAspect.java create mode 100644 tlias-web-management/src/main/java/com/inmind/mapper/OperateLogMapper.java create mode 100644 tlias-web-management/src/main/java/com/inmind/pojo/OperateLog.java diff --git a/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect6.java b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect6.java index 5649031..052288c 100644 --- a/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect6.java +++ b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect6.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; //切面类 @Slf4j -@Aspect +//@Aspect @Component public class MyAspect6 { diff --git a/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect7.java b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect7.java new file mode 100644 index 0000000..39f5deb --- /dev/null +++ b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect7.java @@ -0,0 +1,26 @@ +package com.inmind.aop; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +//切面类 +@Slf4j +//@Aspect +@Component +public class MyAspect7 { + + + /*需要匹配list和delete这2个方法*/ + + @Pointcut("@annotation(com.inmind.aop.MyLog)") + private void pt(){} + + @Before("pt()") + public void before(){ + log.info("MyAspect6 ... before ..."); + } + +} diff --git a/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect8.java b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect8.java new file mode 100644 index 0000000..7688565 --- /dev/null +++ b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyAspect8.java @@ -0,0 +1,64 @@ +package com.inmind.aop; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.Calendar; + +//切面类 +@Slf4j +@Aspect +@Component +public class MyAspect8 { + + @Pointcut("execution(* com.inmind.service.DeptService.*(..))") + private void pt(){} + + @Before("pt()") + public void before(JoinPoint joinPoint){ + log.info("MyAspect8 ... before ..."); + //1. 获取 目标对象的类名 . + String className = joinPoint.getTarget().getClass().getName(); + log.info("目标对象的类名:{}", className); + //2. 获取 目标方法的方法名 . + String methodName = joinPoint.getSignature().getName(); + log.info("目标方法的方法:{}", methodName); + //3. 获取 目标方法运行时传入的参数 . + Object[] args = joinPoint.getArgs(); + log.info("目标方法运行时传入的参数:{}", Arrays.toString(args)); + } + +// @Around("pt()") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + log.info("MyAspect8 around before ..."); + + //1. 获取 目标对象的类名 . + String className = joinPoint.getTarget().getClass().getName(); + log.info("目标对象的类名:{}", className); + + //2. 获取 目标方法的方法名 . + String methodName = joinPoint.getSignature().getName(); + log.info("目标方法的方法:{}", methodName); + + //3. 获取 目标方法运行时传入的参数 . + Object[] args = joinPoint.getArgs(); + log.info("目标方法运行时传入的参数:{}", Arrays.toString(args)); + + //4. 放行 目标方法执行并返回结果 .其他4个通知是获取不到返回值的,JoinPoint没有提供该方法, + Object result = joinPoint.proceed(); + + //5. 获取 目标方法运行的返回值 . + log.info("目标方法运行的返回值:{}", result); + + log.info("MyAspect8 around after ..."); + + return result;//注意:null默认是不返回,导致有返回值的方法失效,必须将原始方法执行结果进行return + } +} diff --git a/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyLog.java b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyLog.java new file mode 100644 index 0000000..e83c71f --- /dev/null +++ b/springboot-aop-quickstart/src/main/java/com/inmind/aop/MyLog.java @@ -0,0 +1,11 @@ +package com.inmind.aop; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME)//设置注解的生命周期为运行时有效 +@Target(ElementType.METHOD)//设置作用域:该注解只能作用于方法上 +public @interface MyLog { +} diff --git a/springboot-aop-quickstart/src/main/java/com/inmind/service/impl/DeptServiceImpl.java b/springboot-aop-quickstart/src/main/java/com/inmind/service/impl/DeptServiceImpl.java index 8b52004..c968768 100644 --- a/springboot-aop-quickstart/src/main/java/com/inmind/service/impl/DeptServiceImpl.java +++ b/springboot-aop-quickstart/src/main/java/com/inmind/service/impl/DeptServiceImpl.java @@ -1,5 +1,6 @@ package com.inmind.service.impl; +import com.inmind.aop.MyLog; import com.inmind.mapper.DeptMapper; import com.inmind.pojo.Dept; import com.inmind.service.DeptService; @@ -17,12 +18,14 @@ public class DeptServiceImpl implements DeptService { @Autowired private DeptMapper deptMapper; + @MyLog @Override public List list() { List deptList = deptMapper.list(); return deptList; } + @MyLog @Override public void delete(Integer id) { //1. 删除部门 diff --git a/tlias-web-management/pom.xml b/tlias-web-management/pom.xml index f797418..e060f25 100644 --- a/tlias-web-management/pom.xml +++ b/tlias-web-management/pom.xml @@ -82,6 +82,11 @@ fastjson 2.0.53 + + + org.springframework.boot + spring-boot-starter-aop + diff --git a/tlias-web-management/src/main/java/com/inmind/anno/Log.java b/tlias-web-management/src/main/java/com/inmind/anno/Log.java new file mode 100644 index 0000000..b67dcfd --- /dev/null +++ b/tlias-web-management/src/main/java/com/inmind/anno/Log.java @@ -0,0 +1,12 @@ +package com.inmind.anno; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Log { +} diff --git a/tlias-web-management/src/main/java/com/inmind/aop/LogAspect.java b/tlias-web-management/src/main/java/com/inmind/aop/LogAspect.java new file mode 100644 index 0000000..922d4f5 --- /dev/null +++ b/tlias-web-management/src/main/java/com/inmind/aop/LogAspect.java @@ -0,0 +1,69 @@ +package com.inmind.aop; + +import com.alibaba.fastjson.JSONObject; +import com.inmind.mapper.OperateLogMapper; +import com.inmind.pojo.OperateLog; +import com.inmind.utils.JwtUtils; +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.weaver.ast.Var; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.time.LocalDateTime; +import java.util.Arrays; + +@Aspect +@Component +@Slf4j +public class LogAspect { + + //之前在控制器中,直接定义HttpServletRequest参数,前端控制器 DispatcherServlet就会直接传递一个请求对象给我们。 + //此处直接从spring容器中获取请求对象 + @Autowired + private HttpServletRequest request; + + @Autowired + private OperateLogMapper operateLogMapper; + + @Around("@annotation(com.inmind.anno.Log)") + public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable { + //1.操作人ID,就在当前请求是携带的令牌JWT中 + String jwt = request.getHeader("token"); + Claims claims = JwtUtils.parseJWT(jwt); + Integer operateUser = (Integer) claims.get("id"); + //2.操作时间 + LocalDateTime operateTime = LocalDateTime.now(); + + //3.执行方法全类名 + String className = joinPoint.getTarget().getClass().getName(); + + //4.执行方法方法名 + String methodName = joinPoint.getSignature().getName(); + + //5.执行方法运行时参数 + Object[] args = joinPoint.getArgs(); + String methodParams = Arrays.toString(args); + + long begin = System.currentTimeMillis(); + //6.执行方法返回值 + Object result = joinPoint.proceed(); + + long end = System.currentTimeMillis(); + + String returnValue = JSONObject.toJSONString(result); + + //7.执行时长 + Long costTime = end - begin; + OperateLog operateLog = new OperateLog(null,operateUser, operateTime, className, methodName, methodParams, returnValue, costTime); + //保存到数据库中,Mapper + operateLogMapper.insert(operateLog); + + log.info("AOP记录操作日志:{}",operateLog); + return result; + } +} diff --git a/tlias-web-management/src/main/java/com/inmind/mapper/OperateLogMapper.java b/tlias-web-management/src/main/java/com/inmind/mapper/OperateLogMapper.java new file mode 100644 index 0000000..c7cba9b --- /dev/null +++ b/tlias-web-management/src/main/java/com/inmind/mapper/OperateLogMapper.java @@ -0,0 +1,15 @@ +package com.inmind.mapper; + +import com.inmind.pojo.OperateLog; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OperateLogMapper { + + //插入日志数据 + @Insert("insert into operate_log (operate_user, operate_time, class_name, method_name, method_params, return_value, cost_time) " + + "values (#{operateUser}, #{operateTime}, #{className}, #{methodName}, #{methodParams}, #{returnValue}, #{costTime});") + public void insert(OperateLog log); + +} diff --git a/tlias-web-management/src/main/java/com/inmind/pojo/OperateLog.java b/tlias-web-management/src/main/java/com/inmind/pojo/OperateLog.java new file mode 100644 index 0000000..cd490e2 --- /dev/null +++ b/tlias-web-management/src/main/java/com/inmind/pojo/OperateLog.java @@ -0,0 +1,21 @@ +package com.inmind.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OperateLog { + private Integer id; //ID + private Integer operateUser; //操作人ID + private LocalDateTime operateTime; //操作时间 + private String className; //操作类名 + private String methodName; //操作方法名 + private String methodParams; //操作方法参数 + private String returnValue; //操作方法返回值 + private Long costTime; //操作耗时 +} diff --git a/tlias-web-management/src/main/java/com/inmind/service/impl/DeptServiceImpl.java b/tlias-web-management/src/main/java/com/inmind/service/impl/DeptServiceImpl.java index f89e51f..c4a550e 100644 --- a/tlias-web-management/src/main/java/com/inmind/service/impl/DeptServiceImpl.java +++ b/tlias-web-management/src/main/java/com/inmind/service/impl/DeptServiceImpl.java @@ -1,5 +1,6 @@ package com.inmind.service.impl; +import com.inmind.anno.Log; import com.inmind.mapper.DeptMapper; import com.inmind.mapper.EmpMapper; import com.inmind.pojo.Dept; @@ -35,6 +36,7 @@ public class DeptServiceImpl implements DeptService { //根据id删除部门 @Transactional(rollbackFor = Exception.class)//让当前方法,处于事务管理下(在方法调用前,执行start transaction) @Override + @Log public void delete(Integer id) throws Exception { try { //不仅删除对应部门数据 @@ -42,9 +44,9 @@ public class DeptServiceImpl implements DeptService { //进行一些业务逻辑代码,假设业务出现了异常 // int a = 1/0; //抛出一个编译时异常 - if (true) { + /* if (true) { throw new Exception("出错了..."); - } + }*/ //还要删除该部门下的员工数据(根据部门ID删除相关的员工) empMapper.deleteByDeptId(id); } catch (Exception e) { @@ -60,6 +62,7 @@ public class DeptServiceImpl implements DeptService { //新增部门 @Override + @Log public void add(Dept dept) { //补充基础属性,创建时间和更新时间 dept.setCreateTime(LocalDateTime.now()); @@ -75,6 +78,7 @@ public class DeptServiceImpl implements DeptService { } @Override + @Log public void update(Dept dept) { //补充更新时间数据 dept.setUpdateTime(LocalDateTime.now());