spring aop通过注解实现日志记录
首先是几个概念:连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、切面(Aspect)
另外也要使用到注解。
需求:通过注解定义LogEnable。然后程序运行能够识别定义了LogEnable注解的方法记录日志。
1.定义注解
package cn.duanjt.util; import java.lang.annotation.*; /**
* 记录日志的注解类
* @author 段江涛
* @date 2018-11-08
*/
@Target(ElementType.METHOD)//表示用于标识方法
@Retention(RetentionPolicy.RUNTIME)//表示运行时保留
public @interface LogEnable {
/**
* 主要是标志日志的描述信息
* @return
*/
String note() default "";
}
2.定义需要监听的类和方法
package cn.duanjt.service; import org.springframework.stereotype.Service; import cn.duanjt.Pojo.Student;
import cn.duanjt.util.LogEnable; @Service
public class StudentService {
//定义注解,然后描述当前方法的作用
@LogEnable(note="获取学生信息")
public Student getStudent(int id) {
if (id == 0) {
throw new RuntimeException("编码不能为0");
}
Student stu = new Student();
stu.setId(id);
stu.setName("zhangsan");
stu.setAddr("重庆");
return stu;
} //未定义注解,将不会被监听
public int getId(int id) {
return id + 1;
}
}
3.定义切面,记录日志
package cn.duanjt.util; import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; @Aspect
@Component
public class LogHelper {
// 没有单独定义切点,直接在环绕方法里面处理[包cn.duanjt.service下面的所有类下面的所有方法,同时包含LogEnable注解的将被监听]
@Around("execution(* cn.duanjt.service.*.*(..)) && @annotation(LogEnable)")
public Object around(ProceedingJoinPoint point) {
MethodSignature signature = (MethodSignature) point.getSignature();
long time = System.currentTimeMillis(); //记录开始时间
String className = point.getTarget().getClass().getName(); // 类名
String method = className + "." + signature.getName(); //方法名
Object[] args = point.getArgs(); // 参数 LogEnable logEnable= signature.getMethod().getAnnotation(LogEnable.class);
String logNote=logEnable.note(); //日志信息
try {
Object result = point.proceed();
System.out.println("方法名:" + method);
System.out.println("参数:" + StringUtils.join(args));
System.out.println("返回值:" + result.toString());
System.out.println("日志功能:" + logNote);
System.out.println("耗时:" + (System.currentTimeMillis() - time) + "毫秒");
System.out.println("-----------------------");
return result;
} catch (Exception e) {
System.out.println("方法名1:" + method);
System.out.println("参数:" + StringUtils.join(args));
System.out.println("日志功能:" + logNote);
System.out.println("异常信息:" + e.getMessage());
System.out.println("耗时:" + (System.currentTimeMillis() - time) + "毫秒");
System.out.println("-----------------------");
return null;
} catch (Throwable e) {
return null;
} }
}
4.在主程序上要加上注解@EnableAspectJAutoProxy。我这里使用的是springboot,如下:
package cn.duanjt; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy; @SpringBootApplication
@ComponentScan("cn.duanjt")
@EnableAspectJAutoProxy //表示启用AOP
public class ServerDemoApplication { public static void main(String[] args) {
SpringApplication.run(ServerDemoApplication.class, args);
}
}
最后,运行结果如下:
方法名:cn.duanjt.service.StudentService.getStudent
参数:
返回值:Student [id=, name=zhangsan, addr=重庆]
日志功能:获取学生信息
耗时:毫秒
-----------------------
注意:
1. @EnableAspectJAutoProxy用于开启全局的AOP
2. LogHelper类上面的@Aspect和@Component是必须的,前者用于标注是切面,后者用于将对象注入到spring容器
3. 切面表达式@Around("execution(* cn.duanjt.service.*.*(..)) && @annotation(LogEnable)").一定需要execution。详细的可以下去再了解
spring aop通过注解实现日志记录的更多相关文章
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- spring AOP自定义注解 实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- 运用Spring Aop,一个注解实现日志记录
运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...
- spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- Spring Boot 2.X(八):Spring AOP 实现简单的日志切面
AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ...
- spring aop 使用注解方式总结
spring aop的注解方式:和xml的配置方式略有区别,详细如下: 1.首先还是建立需要的切面类:切面类里面定义好切点配置,以及所有的需要实现的通知方法. /** * */ package com ...
- Spring aop+自定义注解统一记录用户行为日志
写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...
- Spring AOP使用注解记录用户操作日志
最后一个方法:核心的日志记录方法 package com.migu.cm.aspect; import com.alibaba.fastjson.JSON; import com.migu.cm.do ...
随机推荐
- 非关系型数据库&&缓存
面试其他篇 目录: 1.1
- Codeforces Round #483 (Div. 2)题解
A. Game time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- 使用注释来解决关于inline-block元素换行问题
昨天群里有人问个问题:为什么button加了文字后,产生了对齐不一致的问题. 原因在于baseline的对齐问题. 然后就有人推荐了一篇文章:关于Vertical-Align你需要知道的事情 其中里面 ...
- bzoj 4008 亚瑟王 - 动态规划 - 概率与期望
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- UVa 12099 The Bookcase - 动态规划
题目大意 给定一些书,每个书有一个高度和宽度,然后将它们放到一个三层的书架里(要求每一层都不为空).定义书架的大小为每层最大的高度和 乘 每层宽度和的最大值.求最小的书架大小. 显然动态规划(直觉,没 ...
- overture里设置踏板标记
在学习如何设置踏板标记之前,我们先来了解什么是踏板标记.踏板标记一般是使用在乐谱上,众所周知,钢琴有三个踏板,每个踏板的作用都不一样:右边的踏板称为“延音踏板”,是用来延长琴弦振动的时间,使音延长的效 ...
- 使用Navicat for MySQL添加外键约束
转载:http://blog.csdn.net/u013215018/article/details/54981216 现在有两个表一张是Roles表(角色表),一张是RoleUser表(用户角色) ...
- 对html标签 元素 以及css伪类和伪元素的理解
标签:这应该都知道.<br/> .<a>.<p></p> 等都是标签. 元素:标签开始到结束.比如:<p>p之间的内容</p> ...
- 又是DataSnap的问题
最近在调试DataSnap的程序,突然发现TClientDataSet打不开了,报错为dsnap200.bpl的非法地址访问,如下图: 很是怪异,干脆新建工程,只有TSQLConnection.TSQ ...
- (转)WebSocket学习
石墨文档:https://shimo.im/docs/3UkyOPJvmj4f9EAP/ (二期)17.即时通讯技术websocket [课程17]java We...实现.xmind0.1MB [课 ...