自定义注解使用SPEL表达式记录日志
一、SPEL表达式
SPEL(Spring Expression Language)即Spring表达式语言,它是一种类似jsp的EL表达式,但是又比后者更强大的表达式语言。
例如,经常使用的@Value注解,比如:
@Value("${saas.baseUrl}") private String baseUrl;
其中参数可以为常量字符串,如:@Value("https://a.valueonline.cn/")
也可以为#{},在大括号类可以为bena的属性、环境变量,
也可以为{saas.baseUrl}")
二、自定义注解,
我们的目的是需要记录操作的日志,需要具体到某个业务,所以业务的id为动态变化的,如果在每个业务代码里面加入日志会使得业务代码变得更为复杂,所以我们需要自定义注解并且配合使用SPEL表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @ interface IrLog { /** * 模块名称 */ ModuleType moduleType(); /** * 关联业务主键 */ String businessId() default "" ; /** * 日志内容 */ String content() default "" ; enum ModuleType { BASE_INFO( "基本信息" , "01" ), LAW_FILE( "相关文件" , "02" ), ; private final String moduleName; private final String moduleValue; ModuleType(String moduleName, String moduleValue) { this .moduleName = moduleName; this .moduleValue = moduleValue; } public String getModuleName() { return moduleName; } public String getModuleValue() { return moduleValue; } } } |
三、日志切面类
@Aspect @Component public class IrLogAspect { private static Logger logger = LoggerFactory.getLogger(IrLogAspect.class); private final ExpressionParser expressionParser = new SpelExpressionParser(); private DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer(); @Around("@annotation(log)") public Object invoked(ProceedingJoinPoint joinPoint, IrLog log) throws Throwable { String businessId = log.businessId(); String moduleValue = log.moduleType().getModuleValue(); String content = log.content(); Log logDto = new Log(); MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); String[] paramNames = nameDiscoverer.getParameterNames(method); Expression expression = expressionParser.parseExpression(businessId); EvaluationContext context = new StandardEvaluationContext(); Object[] args = joinPoint.getArgs(); for (int i = 0 ; i < args.length ; i++) { context.setVariable(paramNames[i], args[i]); } String parseBusinessId = expression.getValue(context, String.class); // logger.info("businessId: {}, moduleValue: {}, dbTime: {}", parseBusinessId, moduleValue, dbTime); return joinPoint.proceed(); } }
使用:
@PostMapping("/issueRegulations") @IrLog(moduleType = IrLog.ModuleType.PUBLISH, businessId = "#regulationsId") public void issueRegulations(String regulationsId) { }
标签:
java
, Annotation
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix