SpElAndAop
自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DemoLog {
String name() default "demo";
String el();
}Aop 实现
@Slf4j
@Aspect
@Component
public class LogAspect {
@Pointcut(value = "@annotation(DemoLog)")
public void logAspect() {
}
/**
* 环绕处理
*
* @param joinPoint
* @throws Throwable
*/
@Around(value = "logAspect()")
public Object getAroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
Object proceed;
try {
//前置处理
saveLogAspect(joinPoint, null);
proceed = joinPoint.proceed();
return proceed;
} catch (Throwable throwable) {
saveLogAspect(joinPoint, throwable);
throw new RuntimeException(throwable.getMessage());
}
}
private void saveLogAspect(JoinPoint joinPoint, Throwable throwable) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
try {
// 获取自定义注解
DemoLog demoLog = methodSignature.getMethod().getAnnotation(DemoLog.class);
if (Objects.nonNull(demoLog)) {
Object spEl = AspectExpress.getSpEl(joinPoint, methodSignature, demoLog.el(), Object.class);
if (log.isInfoEnabled()) {
log.info(" SpelLog {}", spEl);
}
}
} catch (Exception e) {
log.error(e.getMessage());
}
}
}自定义 SpEl解析器
效果演示

Last updated