springboot_aop
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、创建注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Print {
String value() default "";
}
3、创建切面aspect
@Aspect
@Component
//lombok日志
@Slf4j
public class LogPrint {
//切点 print是自定义注解
@Pointcut("@annotation(print)")
public void pointcut(Print print){}
@Around("pointcut(print)")//pointcut即切点方法
public Object around(ProceedingJoinPoint pjp, Print print) throws Throwable {
//获取请求方法
Signature sig = pjp.getSignature();
String method = pjp.getTarget().getClass().getName() + "." + sig.getName();
//获取请求的参数
Object[] args = pjp.getArgs();
//fastjson转换
String params = JSONObject.toJSONString(args);
//打印请求参数
log.info("参数:" + method + ":" + params);
System.out.println("参数:" + method + ":" + params);
//执行方法
Object result = pjp.proceed();
//打印返回结果
log.info("返回结果:" + method + ":" + result);
System.out.println("返回结果:" + method + ":" + result);
return result;
}
}
4、测试
创建controller 将注解@Print写在方法上
@RestController
public class AspectController {
@GetMapping("get")
@Print(value = "hello")
public String get(String name,int age){
return "ok";
}
}
5、execution
有时候我们不想在每个方法上都加注解,想让某个包下面的类的方法都执行aop,可以用execution,
只需将切点方法上改为下面代码
@Pointcut("execution(* com.epay..*.*(..))")
public void pointCut(){}
符号 | 含义 |
---|---|
执行() | 表达式的主体; |
第一个” *“符号 | 表示返回值的类型任意; |
com.sample.service.impl | AOP所切的服务的包名,即,我们的业务部分 |
包名后面的” ..“ | 表示当前包及子包 |
第二个” *“ | 表示类名,*即所有类。此处可以自定义,下文有举例 |
。*(..) | 表示任何方法名,括号表示参数,两个点表示任何参数类型 |
网友评论