自定义注解使用SPEL表达式记录日志
生活随笔
收集整理的這篇文章主要介紹了
自定义注解使用SPEL表达式记录日志
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、SPEL表達(dá)式
SPEL(Spring Expression Language)即Spring表達(dá)式語言,它是一種類似jsp的EL表達(dá)式,但是又比后者更強(qiáng)大的表達(dá)式語言。
例如,經(jīng)常使用的@Value注解,比如:
@Value("${saas.baseUrl}")
private String baseUrl;
其中參數(shù)可以為常量字符串,如:@Value("https://a.valueonline.cn/")
也可以為#{},在大括號類可以為bena的屬性、環(huán)境變量,
也可以為${},這時候在大括號類里面的properties資源文件的配置項(xiàng),如:@Value("${saas.baseUrl}")
二、自定義注解,
我們的目的是需要記錄操作的日志,需要具體到某個業(yè)務(wù),所以業(yè)務(wù)的id為動態(tài)變化的,如果在每個業(yè)務(wù)代碼里面加入日志會使得業(yè)務(wù)代碼變得更為復(fù)雜,所以我們需要自定義注解并且配合使用SPEL表達(dá)式
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IrLog {
/**
* 模塊名稱
*/
ModuleType moduleType();
/**
* 關(guān)聯(lián)業(yè)務(wù)主鍵
*/
String businessId() default "";
/**
* 日志內(nèi)容
*/
String content() default "";
enum ModuleType {
BASE_INFO("基本信息", "01"),
LAW_FILE("相關(guān)文件", "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) {
}
總結(jié)
以上是生活随笔為你收集整理的自定义注解使用SPEL表达式记录日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s与云服务器之间服务互访之节点网络打
- 下一篇: js中call与apply用法