目录
1、分析
2、示例(可直接复制修改使用)
2.1、注解UserLog
2.2、被记录方法:
2.3、枚举类:
2.4、UserLogUtil:
2.5、切面
2.6、UserLogEvaluationContext
通过枚举类将每个方法需要记录的日志内容单独存储,降低了耦合度,增加了可扩展性。
通过注解的方式切入具体的方法,在返回成功后再进行日志记录。
将参数注入到StandardEvaluationContext上下文中,通过#name的方式来获取参数,进行必要参数的日志记录。
将自定义的增强方法注册到Spel上下文中,可以在Spel表达式中进行调用。
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Target(ElementType.METHOD)
public @interface UserLog {
UserLogEnum value();
}
@UserLog(UserLogEnum.NEW_ADJUST_TRADE_AUDIT)
public int insertAdjustTradeRequest(AdjustTradeRequest adjustTradeRequest, String methodName, String modelName)
NEW_ADJUST_TRADE_AUDIT(
"''",
"#modelName",
"(#aspectMethodName=='insertAdjustTradeRequest'?'新增':'修改')+'交易调整请求信息'+#convertDescription(',id: ',#adjustTradeRequest.getId())” )
private final String methodParams;
private final String modelName;
private final String description;
UserLogEnum(String methodParams, String modelName, String description) {
this.methodParams = methodParams;
this.modelName = modelName;
this.description = description;
}
#是Spel表达式中获取方法参数的意思,对于实体直接使用.即可获得其属性,
在Spel表达式中字符串要以’’单引号做为开始和结束,
编译器中换行的+号不包裹在枚举类属性的“”双引号中(此处因为使用了String做为其属性所以使用双引号
Spel中的表达式连接直接使用+
convertDescription是注册到Spel上下文中的方法
aspectMethodName 是通过上下文中的setVariables方法来注册的。
public class UserLogUtil {
private static UserLogEvaluationContext userLogEvaluationContext;
/**
* 获取单例的上下文
*/
public UserLogEvaluationContext getUserLogEvaluationContext() {
if (userLogEvaluationContext == null){
userLogEvaluationContext = new UserLogEvaluationContext();
}
return userLogEvaluationContext;
}
public UserLogUtil() throws NoSuchMethodException {
this.getUserLogEvaluationContext();
userLogEvaluationContext.registerFunction("convertDescription", this.getClass().getDeclaredMethod("convertDescription",String.class,Object.class));
}
public static String convertDescription(String description,T fieldValue) throws ParseException {
if (ObjectUtils.isEmpty(fieldValue)) {
return "";
}
if(fieldValue instanceof Date) {
return description + formatDate(fieldValue.toString());
}
return description + fieldValue ;
}
}
@AfterReturning(value = "@annotation(userLog)",returning = "res")
public void doUserLog(JoinPoint joinPoint, UserLog userLog,Object res){
modelName=null;
methodParams = null;
description = null;
Method method ;
Object[] args ;
try{
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
Method targetMethod = methodSignature.getMethod();
method = joinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes());
args = joinPoint.getArgs();
} catch (Exception e){
return;
}
String userName = SecurityContextHolder.getContext().getAuthentication().getName();
try {
parseExpression(method, args, userLog);
} catch (Exception e) {
return;
}
//记录日志
}
private void parseExpression(Method method, Object[] args, UserLog userLog) throws NoSuchFieldException, IllegalAccessException {
// 获取被拦截方法参数名列表
ParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
String[] parametersOfMethod = discoverer.getParameterNames(method);
List parametersList = new ArrayList<>(Arrays.asList(parametersOfMethod));
List
public class UserLogEvaluationContext extends StandardEvaluationContext {
public UserLogEvaluationContext() {
super();
}
public void setVariables(List names, List
往期精彩:
#2Vite+Vue3+SpringMVC前后端分离 解决跨域问题和session每次请求不一致问题-CSDN博客文章浏览阅读1.1k次,点赞37次,收藏15次。Vite+Vue3+SpringMVC前后端分离通过vite/nginx解决跨域问题和session一致性问题https://blog.csdn.net/weixin_42718399/article/details/135388463?spm=1001.2014.3001.5502
#3Jenkins(Windows环境)版本升级、迁移、负载均衡、双机器同步与备份-CSDN博客文章浏览阅读993次,点赞28次,收藏17次。Jenkins(Windows环境)版本升级、迁移、负载均衡、双机器同步与备份https://blog.csdn.net/weixin_42718399/article/details/135404525?spm=1001.2014.3001.5502
#4详解@RequestParam、@RequestBody和@PathVariable-CSDN博客文章浏览阅读933次,点赞26次,收藏19次。详解@RequestParam @RequestBody和@PathVariablehttps://blog.csdn.net/weixin_42718399/article/details/135475436?spm=1001.2014.3001.5502
#5解析filter为什么不能注入bean和解决办法以及filter、interceptor、aspect之间的执行顺序-CSDN博客文章浏览阅读961次,点赞35次,收藏7次。filter过滤器为什么不能注入bean以及解决办法https://blog.csdn.net/weixin_42718399/article/details/135517565?spm=1001.2014.3001.5502
#6解析@PreAuthorize以及其中的Spel-CSDN博客文章浏览阅读1.1k次,点赞41次,收藏18次。#6解析@PreAuthorize以及其中的Spelhttps://blog.csdn.net/weixin_42718399/article/details/135558235?spm=1001.2014.3001.5502