拦截器&线程变量副本(ThreadLocal)

拦截器是spring提供的一种技术,他的功能类似与过滤器Filter, 他会在进入控制层Controller之前,离开Controller之后以及渲染完毕之后进行拦截

拦截器对比过滤器:

  1. 二者规范不同: filter是在规范中定义,用于servlet容器中.拦截器是spring框架提供的,用于spring容器内
  2. 使用范围不同: filter是servlet规定的,只能用于web工程中.拦截器没有限制

拦截器使用步骤:

  1. 自定义一个类实现HandlerInterceptor接口
  2. 实现HandlerInterceptor接口中的三个方法
    1. preHandle() : 在目标方法之前执行,一般用于预处理
    2. postHandle() : 在目标方法执行之后执行,用于后处理
    3. afterCompletion() : 整个请求处理完毕,在视图渲染完毕时回调,用于资源的清理或性能的统计
  3. 在SpringBoot中注册拦截器并使用: 可以创建一个类作为web注册拦截器实现WebMvcConfigurer接口,注入自定义的拦截器,配置拦截和过滤拦截的路径

拦截器&线程变量副本(ThreadLocal)

 

ThreadLocal---线程变量副本: ---面试

每个线程用于本地变量的副本,各个线程之间的变量互不干扰.

ThreadLocal实现在多线程环境下 保存变量的安全

作用:

  1. 通过线程内的局部变量,这种变量只在线程的生命周期内起作用
  2. 提供一个线程内的公共变量(比如本次请求的用户信息),减少同一个线程内多个函数或者组件之间的一些公共变量传递的复杂度,或者为线程提供一个私有的变量副本,这样每一个线程都可以随意修改自己的变量副本,而不会对线程产生影响

Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。

采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。

ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。

ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。

Spring中绝大部分Bean都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了。

拦截器&线程变量副本(ThreadLocal)

 

上一篇:ThreadLocal的介绍+经典应用场景


下一篇:ThreadLocal详解