问题
在项目中,想记录用户的日志,如果每个方法都写一遍记录日志入库操作,那么代码肯定不优雅,我们可以通过AOP去记录日志入库操作,只需写一遍代码,通过自定义注解形式去识别哪些需要记录的日志!
Maven导包
<dependencies>
<!--spring核心依赖,会将spring-aop传递进来-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!--切入点表达式依赖,目的是找到切入点方法,也就是找到要增强的方法-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
</dependencies>
AOP记录日志注解代码
/**
* AOP记录日志
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAop {
String code() default "";
}
使用方式
在方法上声明注解 @LogAop(code = "USER_PWD_LOGIN")
AOP记录日志功能实现
/**
* 切入点表达式
*/
@Pointcut("execution(* cn.jufb.user.service.*.*(..))")
private void pt() {
}
/**
* 记录日志
*
* @param pjp
* @return
* @throws Throwable
*/
@Around("pt()")
public Object recordLog(ProceedingJoinPoint pjp) throws Throwable {
//方法返回结果
Object resultData = pjp.proceed();
//获取LogAop注解中的 日志类型编码
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method method = methodSignature.getMethod();
LogAop logAop = method.getAnnotation(LogAop.class);
if (null == logAop || StringUtils.isBlank(logAop.code())) {
return resultData;
}
String logType = logAop.code();
//...
}
效果
处理方案
此时我们已经拿到了,我们自定义的注解值,以上图为例: 此时拿到了USER_PWD_LOGIN这个值,我们可以进行入库或其他操作,如果想转译成中文或者是还想在库中记录详细信息,我们可以通过枚举,通过我们传过来的值进行获取其他信息等