一、创建注解文件
文件内容如下:
/**
* 自定义操作日志记录注解
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
/**
* 模块
*/
public String title() default "";
/**
* 功能
*/
public BusinessType businessType() default BusinessType.OTHER;
/**
* 操作人类别
*/
public OperatorType operatorType() default OperatorType.MANAGE;
/**
* 是否保存请求的参数
*/
public boolean isSaveRequestData() default true;
}
@Documented :注解表明制作javadoc时,是否将注解信息加入文档。
@Target:约束了该注解能在哪些地方使用
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Retention:决定了注解能被保留多久
source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
二、创建切面类
创建一个新的类作为注解的AOP配置
/**
* 操作日志记录处理
*/
@Aspect
@Component
public class LogAspect {
private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
// 配置织入点
@Pointcut("@annotation(com.my.annotation.Log)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object Interceptor(ProceedingJoinPoint joinPoint){
System.out.println("====Interceptor====");
System.out.println("通知之开始");
Object retmsg=null;
try {
retmsg = joinPoint.proceed();
System.err.println("++++++++"+retmsg);
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("通知之结束 +retmsg+" + retmsg);
Object result = null;
Object[] args = joinPoint.getArgs();
if (args != null && args.length > 0) {
String deviceId = (String) args[0];
if (!"03".equals(deviceId)) {
return "no anthorization";
}
}
try {
result = joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
return result;
}
@Before("logPointCut()")
public void before(JoinPoint joinPoint){
MethodSignature sign = (MethodSignature)joinPoint.getSignature();
Method method = sign.getMethod();
Log annotation = method.getAnnotation(Log.class);
System.out.println("打印:" + annotation.value() + " 开始前");
//System.out.println("===before===");
}
@After("logPointCut()")
public void after() {
System.out.println("after方法执行后");
}
}
三、使用
在方法上加上注解,并添加相应属性
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysUser user) {
//TODO
}