Tomcat 中的 Spring @Autowired 和 WebApplicationContext
@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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对于容器的工作原理似乎存在一些误解。 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.
尝试使用作用域作为该 bean 的原型
@Scope("prototype")
Try using scope as prototype for that bean
@Scope("prototype")
您可以尝试使用 @Scope("session")
You may try to use @Scope("session")