前言
遇到一个问题
@Autowired
public HttpServletRequest request;
这样从容器中取出bean是否有问题
1:struct 和 spring 中的默认
- structs1的action是单例的,一个Action的实例处理所有的请求。在Struts1里,当有多个请求访问,每个都会分配一个新线程,在这些线程,操作的都是同一个action对象,每个用户的数据都是不同的,而action却只有一个
- structs2的action是一个请求对应一个实例(每次请求都新new出一个对象),没有线程安全方面的问题
- 跟spring整合是我们需要显性的配置多例@Scope(“prototype”),因为在和Spring一起使用的时候,Action交给Spring进行管理,默认的就是单例
2:讨论单例时注入request的线程安全性问题
(想说的是,线程安全的) 成员域注入的时候注入的是1个代理对象.是 AutowireUtils.ObjectFactoryDelegatingInvocationHandler的实例. 方法注入的就是一般tomcat原生的requestFacade对象.是jdk动态代理对象 在发起请求时初始化容器时,方法注入方式会将request放入ThreadLocal中,并在每次获取request时都从ThreadLocal对象中取
有的地方我们可能是这么用的:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
其实方法注入时底层就是用了这种方式:RequestContextHolder
引用: