Tomcat中的Spring @Autowired和WebApplicationContext

时间:2010-05-07 14:44:07

标签: java spring initialization autowired

@Autowired只工作一次。

每次重新创建Servlet时如何使bean连接?

我的网络应用程序(Tomcat6容器)由2个Servlet组成。每个servlet都有私有字段。

他们的二传手标有@Autowired

在init方法中我使用

WebApplicationContextUtils
...
autowireBean(this);

在Servlet初始化期间,它会自动装配标有@Autowired 的属性

任何其他会话都会看到这些字段值,在上一个会话被销毁后它们不会被重新连接。

每次调用Servlet构造函数时,如何使它们重新连接?

a)将自动装配放入构造函数中?

或者更好 2)获取一个Web应用程序上下文并从那里提取一个bean?

3 个答案:

答案 0 :(得分:1)

尝试使用scope作为该bean @Scope("prototype")

的原型

答案 1 :(得分:1)

似乎对容器的工作方式存在一些误解。 Servlet本质上是单例,每次有人调用服务器时都不会获得新的servlet。在servlet上的私有字段中存储状态几乎是一个错误。

请求处理的有状态部分的范围和生命周期是什么?如果它只是请求的生命,那么你可以把你的servlet中的任何内容都设置为有状态并将其移动到另一个类中。然后,您可以为该类定义原型bean,并在请求开始时使用getBean来获取新的bean。如果你想开始变得有趣,你可以编写一个过滤器,在每个请求开始时将一个新bean放入ThreadLocal。

如果您的州需要跨越多个请求,则需要开始保持指向Web会话中状态存储的状态或键,或者使用对话框架。

答案 2 :(得分:-1)

您可以尝试使用@Scope(“会话”)