我有一个使用spring和hibernate和struts的Web应用程序(它在Tomcat上运行)
通话顺序是这样的......
Struts动作调用spring服务bean,后者又调用Spring DAO bean.DAO实现是一个Hibernate实现.
问题是 我的所有春豆都会在同一个线程中运行吗?我可以在ThreadLocal中存储一些内容并将其放入另一个bean中吗?
我很确定这在无状态会话Bean中不起作用.EJB容器可以(或将)为每次调用会话bean生成一个新线程
弹簧容器会这样做吗?即在同一个线程中运行所有bean?
当我尝试JUnit测试时 - 我通过测试用例中的Thread.currentThread().getId()和两个bean获得相同的id - 这使我相信只有一个线程在运行
或者这种行为是不可预测的?或者在Tomcat服务器上运行时会改变吗?
澄清 我不希望在两个线程之间交换数据.我想将数据放在ThreadLocal中,并能够从调用堆栈中的所有bean中检索它.仅当所有bean都在同一个线程中时,这才有效
Spring不会产生线程.Tomcat呢.Spring只是为您创建和连接对象.
来自浏览器的每个请求都在一个请求中处理.是Tomcat处理请求.Tomcat创建了处理请求的线程.
假设您刚刚在Spring中创建了一个名为"X"的单例bean.然后,所有请求都使用相同的X实例.
Spring bean不存在于一个线程中.它们只是在堆上分配.