网站首页 > java教程 正文
日志记录是一件很有意义的事情,通过日志可以记录当前用户做了哪些操作。对当前所做的操作进行描述以及记录。
可以发现记录用户当前做了哪些操作是一个公共方法,是否单独写一个工具类,然后每次调用该工具类中的方法呢?显然这种方式不太友好,可扩展性不强。我们可以有更好的设计,可以利用Spring的AOP特性,在某一点进行方法增强。
具体的实现:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.PARAMETER})
public @interface LogOpt {
String desc() default "";
}
@Component
@Slf4j
@Aspect
public class LogAspect {
@Autowired
private LogDescPoMapper iLogMapper;
/***
* 定义一个连接点
*/
@Pointcut("execution(* cn.zdm.demo2.auth.controller.*.*(..)) && @annotation(cn.zdm.demo2.common.log.LogOpt)")
public void log() {
}
/***
* 前置通知:在我们目标方法执行之前
*/
@Before("log()")
public void before(JoinPoint joinPoint) {
log.info("执行了LogOptAspect的前置通知");
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
save(method);
}
/***
* 后置通知:无论是否发生异常,都将会收到通知
*/
@After("log()")
public void after() {
log.info("执行了目标方法的后置通知");
}
/***
* 返回通知:在我们正常执行后通知
*/
@AfterReturning("log()")
public void afterReturn() {
log.info("执行正常");
}
/***
* 异常通知
*/
@AfterThrowing("log()")
public void afterThrowing() {
log.error("执行异常");
}
/***
*目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,joinPoint.procced()就是执行目标方法的代码 。环绕通知可以控制返回对象
*/
@Around("log()")
public void around() {
log.info("====>环绕通知");
return;
}
@Async
public void save(Method method) {
//判断方法上的注解
if (!method.isAnnotationPresent(LogOpt.class)) {
return;
}
//获取注解上的参数值
LogOpt logOpt = method.getAnnotation(LogOpt.class);
LogDescPO optLog = LogDescPO.builder()
.id(UUID.randomUUID().toString())
.userName("test")
.description(logOpt.desc())
.visitTime(new Date()).build();
iLogMapper.insert(optLog);
return;
}
}
@ApiOperation(value = "批量添加app信息")
@RequestMapping(value = "/save/app", method = RequestMethod.GET)
@LogOpt(desc = "批量添加app信息")
public ResultObject<Object> saveApp() {
// List<IosAppPO> list = new ArrayList<>();
IosAppPO iosAppPO;
for (int i = 10; i < 20; i++) {
iosAppPO = new IosAppPO();
iosAppPO.setAppCreator("zhaodeman");
iosAppPO.setAppName("应用" + i);
iosAppPO.setAppLoseTime(new Date());
iosAppPO.setAppCreateTime(new Date());
iosAppService.saveIosApp(iosAppPO);
// list.add(iosAppPO);
}
return ResultResponse.success("批量添加app信息成功");
}
@ApiOperation("查询所有的日志记录")
@GetMapping("/log/queryAll")
public ResultObject<Object> queryAllLog() {
List<LogDescPO> result = logDescPoMapper.queryAllLog();
return ResultResponse.success("查询日志成功", result.size(), result);
}
这样就可以实现扩展的日志记录操作。
猜你喜欢
- 2024-09-27 在Spring Boot项目中创建和使用自定义注解
- 2024-09-27 这一篇 Java 注解,写得太好了(java注解使用)
- 2024-09-27 学习廖雪峰的JAVA教程---注解(定义注解@interface)
- 2024-09-27 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?
- 2024-09-27 Spring Boot 整合mybatis,使用注解的方式(自动生成注解)
- 2024-09-27 面试官:实际工作中哪里用到了自定义注解?
- 2024-09-27 使用自定义注解和切面AOP实现Java程序增强
- 2024-09-27 Java-注解有什么用?该怎么用?(java 注解的作用)
- 2024-09-27 Java 17中的元注解:自定义注解的行为
- 2024-09-27 自定义注解你真会用吗?(说说自定义注解的场景及实现)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)