gpt4 book ai didi

java - Tomcat 中的 Spring @Autowired 和 WebApplicationContext

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:45 25 4
gpt4 key购买 nike

@Autowired 只能工作一次。

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

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

他们的 setter 标记有 @Autowired

在我使用的init方法中

WebApplicationContextUtils...autowireBean(this);

它会 Autowiring 标有 @Autowired 的属性一次 - 在 Servlet 初始化期间

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

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

a) 将 Autowiring 放入构造函数中?

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

最佳答案

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

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

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

关于java - Tomcat 中的 Spring @Autowired 和 WebApplicationContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com