笔记 - SpringAop和拦截器

1、AOP
@Before 方法执行前  @After 方法执行后
@Around 比较强大-在执行方法前后

  • 既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;
  • 它可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;
  • 它可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值;
  • 当需要改变目标方法的返回值时,只能使用Around方法;
定义pointCut: https://docs.spring.io/spring/docs/4.3.15.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#aop-pointcuts
Example:
@Aspect
@Component
@Order //不同aspect,advice的执行顺序  数值越低,表明优先级越高https://blog.csdn.net/qq_32331073/article/details/80596084
public class TimeAspect {

//配置切入点
@Pointcut(value = "execution(* com.imooc.web.controller.UserController.*(..))")
public void aopDemo() {
System.out.println("这是切入点");
}

//配置切面:把增强应用到具体(方法/切入点)上面
@Around(value = "TimeAspect.aopDemo()")//around
public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {

System.out.println("time aspect start");

//获取方法名
Signature names=pjp.getSignature();

//获取参数名数组
MethodSignature methodSignature = (MethodSignature) names;
String[] strings = methodSignature.getParameterNames();
System.out.println(Arrays.toString(strings));

//循环输出参数值
Object[] args=pjp.getArgs();
for(Object arg:args){
System.out.println("arg is"+arg);
}

long start=new Date().getTime();

//接受拦截方法的返回值
Object object=pjp.proceed(); //pjp.proceed 执行方法

System.out.println("time aspect:"+(new Date().getTime()-start));
System.out.println("time aspect end");

//return回拦截的方法的返回值 可以更改方法返回值
return object;
}
}

2、Interceptor:(无法拿到方法映射的参数值)

@Configuration//继承Interceptor配置 并重写addInterceptors方法
public class WebConfig extends WebMvcConfigurerAdapter{


@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
}


}}

@Component
public class TimeInterceptor  implements HandlerInterceptor {


    //处理前
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

        System.out.println("Interceptor处理前");

        //类名
        System.out.println("Interceptor获取类名"+((HandlerMethod)o).getBean().getClass().getName());
        //类的方法名
        System.out.println("Interceptor获取方法名"+((HandlerMethod)o).getMethod().getName());

        //request填入数据
        httpServletRequest.setAttribute("startTime",new Date().getTime());

        //若返回false 则不执行拦截的方法
        return true;
    }

    //若不被拦截后的处理(已运行完拦截的方法)
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

        System.out.println("Interceptor处理");

        System.out.println("tInterceptor处理中:");

    }

    //不管拦截与否都会执行
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

        //从处理前取得数据
        Long start=(Long) httpServletRequest.getAttribute("startTime");
        System.out.println("Interceptor处理后");
        //打印出基于basicErrorController抛出的异常
        System.out.println("Interceptor处理错误:"+e);//无法打印出@ControllerAdvice处理过的异常
        System.out.println("Interceptor处理时间:"+(new Date().getTime()-start));
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值