在多线程中使用RequestScope的bean【最佳实践】
RequestScope确实很好用,你只要像下面的DefaultContext一样,写一个pojo类,然后加上这3个注解。
@Data
@Component
@ReuqestScope
public class DefaultContext {/*** 用户ID**/private Integer userId;/*** userAgent**/private String userAgent;
}
那么,你就可以在到处注入使用它了。
@Service
public class FooService {// 注入它private final DefaultContext context;public void barMethod() {log.info(context.userId);}
}
但是ReuqestScope的Bean在Spring中是一个由ThreadLocal持有的对象,仅在请求的线程中可用,存在以下2点局限性:
- 如果直接在请求线程的子线程中使用此Bean时,会产生No Thread-bound的错误。
- 即使你通过一定手段复用了请求主线程的上下文(RequestAttributes),一旦你的子线程还在运行,而请求已经完成,那么请求线程的RequestAttributes会失效,导致无法获取此Bean。
为了解决以上ReuqestScope的问题,在不侵入业务代码的情况下,可以采用如下方案。
// 太晚了,明天再写
