Tomcat 中的 Spring @Autowired 和 WebApplicationContext

发布于 2024-08-31 21:16:25 字数 478 浏览 9 评论 0原文

@Autowired 只能工作一次。

怎样才能让它在每次重新创建 Servlet 时都连接 bean?

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

它们的 setter 标记为 @Autowired

在 init 方法中我使用

WebApplicationContextUtils
...
autowireBean(this);

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

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

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

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

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

@Autowired works only once.

What to do to make it wire the bean every time the Servlet is recreated?

My web-app (Tomcat6 container) consists of 2 Servlets. Every servlet has private fields.

Their setters are marked with @Autowired

In the init method I use

WebApplicationContextUtils
...
autowireBean(this);

It autowires the properties marked with @Autowired once - during the initialization of the Servlet.

Any other session will see these fields values, they will not be rewired after the previous session is destroyed.

What to do to make them rewire them each time a Servlet constructor is called?

a) Put the autowiring into the constructor?

Or better 2) get a web app context and extract a bean from there?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夢归不見 2024-09-07 21:16:25

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

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

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

There seems to be some misunderstanding about how the container works. Servlets are essentially singletons, you don't get a new servlet everytime someone calls the server. Storing state in private fields on a servlet is pretty much an error.

What is the scope and life-cycle of the stateful part of your request processing? If it's just the life of the request then you can take whatever on your servlet is stateful and move it into another class. Then you can define a prototype bean for that class and use getBean at the start of the request to get a new one. If you want to start getting fancy you could write a filter that puts a new bean into a ThreadLocal at the start of each request.

If your state needs to span multiple requests, you need to start keeping state or a key that points to the state storage on the web session, or look into using a conversation framework.

半步萧音过轻尘 2024-09-07 21:16:25

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

Try using scope as prototype for that bean @Scope("prototype")

叫思念不要吵 2024-09-07 21:16:25

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

You may try to use @Scope("session")

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文