切面配置,实现自定义注解
package com.micvs.modular.system.annotation;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogValidate{
String module() default "";
}
配置加载
package com.micvs.modular.system.aspect;
import cn.stylefeng.roses.core.reqres.response.ResponseData;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.micvs.core.shiro.ShiroKit;
import com.micvs.core.util.RestService;
import com.micvs.core.util.UUIDUtils;
import com.micvs.modular.system.annotation.LogValidate;
import com.micvs.modular.system.entity.AopOperationLog;
import com.micvs.modular.system.service.OperationLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
@Aspect
@Component
public class SerurAspect {
@Resource
private OperationLogService operationLogService;
private static final Logger logger = LoggerFactory.getLogger(RestService.class);
@Pointcut("@annotation(com.micvs.modular.system.annotation.LogValidate)")
public void login() {
}
/**
* 前置通知:在目标方法执行前调用
*/
@Before("login()")
public void begin() {
}
/**
* 后置通知:在目标方法执行后调用,若目标方法出现异常,则不执行
*/
@AfterReturning("login()")
public void afterReturning() {
// System.out.println("==@AfterReturning== lingyejun blog logger : after returning");
}
/**
* 后置/最终通知:无论目标方法在执行过程中出现一场都会在它之后调用
*/
@After("login()")
public void after() {
// System.out.println("==@After== lingyejun blog logger : finally returning");
}
/**
* 异常通知:目标方法抛出异常时执行
*/
@AfterThrowing("login()")
public void afterThrowing() {
// System.out.println("==@AfterThrowing== lingyejun blog logger : after throwing");
}
/**
* 环绕通知:灵活自由的在目标方法中切入代码
*/
@Around("login()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
LogValidate annotation = method.getAnnotation(LogValidate.class);
// 获取目标方法的名称
String methodName = joinPoint.getSignature().getName();
// 获取方法传入参数
Object[] params = joinPoint.getArgs();
if (!StringUtils.isEmpty(methodName)){
Date date=new Date();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
AopOperationLog parm=new AopOperationLog();
parm.setId(UUIDUtils.getUUID());
parm.setCreatTime(format.format(date));
parm.setMethod(methodName);
parm.setOperationName(ShiroKit.getUser().getName());
// parm.setOperationName("admin");
if (annotation != null) {
parm.setOperationType(annotation.module());
}
if (params != null) {
parm.setParm(JSON.toJSONString(params));
}
String msg=operationLogService.saveOperationLog(parm);
logger.info(JSONObject.toJSONString(parm));
logger.info(JSONObject.toJSONString(msg));
}
// 执行源方法
return joinPoint.proceed();
}
}
切面引用
@LogValidate(module = "标题")
方法体 void(){
?????
}