Spring最重要的有个知识点就是切面编程AOP
@Aspect注解将表示它是一个切面
@Component表示它是一个Spring的组件
切面有很多种写法,可以在Spring的官网的11章点击查看Spring官网官方文档 本文将用@Around进行切面。
package com.yhn.web.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
* Created by yhn on 2017/12/3.
*/
@Aspect
@Component
public class TimeAspect {
@Around("execution(* com.yhn.web.controller.UserController.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint pjp)throws Throwable{
System.out.println("TimeAspect filter start");
Object[] objs = pjp.getArgs();
for(Object obj:objs){
System.out.println("获得参数:"+obj);
}
Object object = pjp.proceed(); //拿到方法返回值的对象
System.out.println("获得返回对象:"+object);
System.out.println("TimeAspect filter end");
return null;
}
}
通过ProceedingJoinPoint对象的getArgs()我们可以得到传进来的参数。
通过ProceedingJoinPoint对象的proceed()我们可以得到拿到切面方法返回值的对象。
既然是拦截服务的完结篇,我当然要简单说下各自的区别和使用场景;
过滤器Filter可以拿到原始的HTTP请求和响应的信息,但是拿不到你真正处理请求方法的信息,也就是方法的信息。
拦截器Interceptor可以拿到原始的HTTP请求和响应的信息,也可以拿到你真正处理请求方法的信息,但是拿不到传进参数的那个值。
切片Aspect,既然Spring那么支持AOP,就肯定都能拿。有人会问如何拿原始的HTTP请求和响应的信息,通过以下代码应该拿得到啊哈哈哈哈
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();