1

@Autowired 只工作一次。

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

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

他们的二传手标有@Autowired

在我使用的 init 方法中

WebApplicationContextUtils
...
autowireBean(这个);

它会在 Servlet 初始化期间自动装配一次用 @Autowired 标记的属性。

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

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

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

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

4

3 回答 3

1

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

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

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

于 2010-05-07T16:33:50.367 回答
1

尝试使用范围作为该 bean 的原型@Scope("prototype")

于 2010-05-07T14:51:00.633 回答
-1

您可以尝试使用 @Scope("session")

于 2011-06-29T09:06:50.540 回答