声明:以下代码等都默认已经引入相应的包,还有配置的包扫描范围已经弄好,这里只是作为一个示例,对于没有对应环境的情况,可以先百度,当然相应的之后这边博客也会加上相应配置的教程。
自定义注解–方法注解
1.创建对应自定义注解
/**
* 模拟日志自定义注解
* @author xcf
* @Description
* @date $ $
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnnotation {
/**
* 模块名称
* @return
*/
public String title() default "";
/**
* 功能
* @return
*/
public String bussinessType() default "other";
/**
* 操作级别
* @return
*/
public String operatorType() default "other";
}
这里使用元注解:Target和Retention。
其中,Target里面声明为ElementType.METHOD,代表的意思是:注解的作用目标是方法
Retention声明为RetentionPolicy,代表的意思是:注解的保留位置是:注解会在class字节码文件中存在,在运行时可以通过反射获取到
关于这两个元注解的含义等,可以参照
https://blog.youkuaiyun.com/xcy1193068639/article/details/81464165
这里拷贝了主要内容如下:
–以上只是图片,作为对来源作者的尊重,如果需要请移步到原创那边拷贝
2.创建对应的切面类
/**
* @author xcf
* @Description
* @date $ $
*/
@Aspect
@Component
public class MethodAspect {
@Pointcut("@annotation(com.project.xcfmodel.annotation.MethodAnnotation)")
public void methodAspectAnno(){};
@After("methodAspectAnno()")
public void afterMethod(JoinPoint joinPoint){
System.out.println("进入After方法");
}
/**
* 在这个步骤处理日志的记录等
* @param joinPoint
* @param jsonResult
*/
@AfterReturning(pointcut = "methodAspectAnno()", returning = "jsonResult")
public void afterReturning(JoinPoint joinPoint, Object jsonResult){
System.out.println("进入afterReturning方法");
/*下面需要做两个事情:1.获取注解中的三个内置参数。2.获取调用的方法,类等等*/
//1.获取注解中的三个内置参数
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();//转为method对应的Signature
Method method = methodSignature.getMethod();//获取当前method对象
MethodAnnotation annotation = method.getAnnotation(MethodAnnotation.class);//获取method对象中对应的注解对象
System.out.println("模块名称" + annotation.title());
System.out.println("功能" + annotation.bussinessType());
System.out.println("操作级别" + annotation.operatorType());
//2.获取调用的方法,类等等
String name = joinPoint.getSignature().getName();
System.out.println("当前调用方法" + name);
String className = joinPoint.getTarget().getClass().getName();
System.out.println("当前调用类" + className);
System.out.println("返回参数" + jsonResult);
//以下就是将这些参数记录到日志文件中,这里就不演示了,需要的信息都在上面获取出来了
}
}
这里配置了对应切面类需要的参数并获取所需参数
3.在controller方法中调用当前定义的注释
/**
* @author xcf
* @Description
* @date $ $
*/
@RestController
public class TestController {
/**
* 这里添加了注释,声明了模块名称,功能,操作级别
* @return
*/
@MethodAnnotation(title = "test", bussinessType = "test", operatorType = "admin")
@GetMapping("/testMethod")
public String testMethod(){
return "testMethod";
}
}
可以看到,这个注解写在方法中,并且声明了对应的模块名称,功能,操作级别,
这样子就能在切面类中获取到对应声明的值。