- 第一步
org.springframework.boot spring-boot-starter-parent 2.4.3
- 第二步
org.springframework.boot spring-boot-starter-web 2.4.3
- 第三步
${project.artifactId} org.springframework.boot spring-boot-maven-plugin
图例:
3、@Log的注解类实现 3.1 Log注解类代码org.springframework.boot spring-boot-starter-aop 2.4.3
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
boolean request() default true;
boolean response() default true;
boolean runTime() default true;
boolean exceptionOnly() default false;
}
3.2 四个元注解
@Target: 描述注解的使用范围(类、方法、属性)!
@Retention:描述注解的声明周期! [SOURCE源代码 、CLASS 、RUNTIME运行]
@Document:说明该注解包含在javadoc中!
@Inherited:说明子类可以继承父类中的该注解!
4、 @Log的aop实现- 说明:一个方法的执行流程!
1、 先扫描该方法所属的类是否有@Log注解,如果有则直接进行logHandler()方法的调用;
2、 如果没有则进行pjp.proceed()方法的调用;
3、 扫描方法是否有@Log注解,如果有则进行logHandler()方法的调用;
@Aspect
@Component
public class LogAop {
private static final Logger logger = LoggerFactory.getLogger(LogAop.class);
@Around(value = "@annotation(log)")
public Object aroundMethod(ProceedingJoinPoint pjp, Log log) throws Throwable {
return logHandler(pjp, log);
}
@Around(value = "@annotation(log)")
public Object aroundClass(ProceedingJoinPoint pjp, Log log) throws Throwable {
MethodSignature ms = (MethodSignature) pjp.getSignature();
Method method = ms.getMethod();
//获取方法上的Log注解
Log methodLog = AnnotationUtils.findAnnotation(method, Log.class);
if(methodLog != null){
return pjp.proceed();
}
return logHandler(pjp, log);
}
public Object logHandler(ProceedingJoinPoint pjp, Log log) throws Throwable {
// 获得切点处的方法签名 有参方法:Hello.hello(..); 无参数方法:Hello.hello()
String signature = pjp.getSignature().toShortString();
//获取请求参数
String request = Arrays.toString(pjp.getArgs());
//打印请求参数(打印参数请求 + 非异常也进行参数打印)
if (Boolean.TRUE.equals(log.request()) && !Boolean.TRUE.equals(log.exceptionOnly())) {
logger.info("{}的请求参数为:{}", signature, request);
}
// 获取开始时的时间戳
long start_time = System.currentTimeMillis();
Object returnObject = null;
try {
returnObject = pjp.proceed(pjp.getArgs());
} catch (Throwable throwable) {
// 仅异常情况下进行参数打印
if (Boolean.TRUE.equals(log.request()) && Boolean.TRUE.equals(log.exceptionOnly())) {
logger.info("{}的请求参数为: {}", signature, request);
}
throw throwable;
}
if (Boolean.TRUE.equals(log.response()) && !Boolean.TRUE.equals(log.exceptionOnly())) {
logger.info("{}返回结果为:{}", signature, returnObject);
}
// 打印运行时间 (非异常情况打印)
if (Boolean.TRUE.equals(log.runTime()) && !Boolean.TRUE.equals(log.exceptionOnly())) {
logger.info("{}运行时间为:{}ms", signature, System.currentTimeMillis() - start_time);
}
return returnObject;
}
}
5、 测试类
- controller
@RestController
@RequestMapping("test")
@Log
public class TestController {
@Log
@GetMapping("testGet")
public String testGet(@RequestParam Long id) {
System.out.println("id ========= " + id);
return "id ============ " + id;
}
}
6、启动类
@SpringBootApplication
public class MyAopLoaderApplication {
public static void main(String[] args) {
SpringApplication.run(MyAopLoaderApplication.class);
}
}
7、测试结果
测试地址:http://localhost:8080/test/testGet?id=1111
- 测试结果
由此开启@Log的AOP实现!!!!!!!!!!



