Springboot Aop–对请求方法返回参数进行拦截
我们常知spring一共有两大核心技术:Aop, IOC。
Aop面向切面,IOC控制反转,在平常开发项目我们也经常用的到
最近楼主在开发一个日志模块的时候需要拿到每个方法的请求返回结果。
使用spring boot项目对请求方法的结果进行拦截。在每个方法执行完之后使用Aop的面向切面进行拦截,获取返回结果。
功能描述:
@Before在每个方法执行之前可以对入参的参数进行修改或者将参数进行替换。
@AfterReturning在方法执行完毕后也可以对参数进行拦截并进行修改。
@Around环绕通知,环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,
我写了一个例子使用postman亲测有效:
先准备一个实体类,也是需要返回的实体内容,代码如下:
@Data
public class User {
private String name;
private int age;
public User(){
}
public User(String name, int age){
this.name = name;
this.age = age;
}
}
在写一个入口controller,给个提示表示进入了该方法,代码如下:
@Slf4j
@RestController
public class HelloController implements HandlerInterceptor {
@RequestMapping("/hello")
public User Helloshow(){
User user = new User("小龙",23);
log.info("先进方法");
return user;
}
}
注入Aop的依赖,代码如下:
<!-- AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
接着定义一个Aspect,并指定一个切入点,配置需要拦截的方法
我这里对整个controller进行拦截
@Slf4j
@Aspect
@Configuration
public class ServiceAspect {
private final String ExpGetResultDataPonit = "execution(* com.haylion.demo.controller..*.*(..))";
/**
* 后置返回通知
* 这里需要注意的是:
* 如果参数中的第一个参数为JoinPoint,则第二个参数为返回值的信息
* 如果参数中的第一个参数不为JoinPoint,则第一个参数为returning中对应的参数
* returning 限定了只有目标方法返回值与通知方法相应参数类型时才能执行后置返回通知,否则不执行,对于returning对应的通知方法参数为Object类型将匹配任何目标返回值
*/
@AfterReturning(value = ExpGetResultDataPonit, returning = "keys")
public