@Autowired只工作一次。
每次重新创建Servlet时如何使bean连接?
我的网络应用程序(Tomcat6容器)由2个Servlet组成。每个servlet都有私有字段。
他们的二传手标有@Autowired
在init方法中我使用
WebApplicationContextUtils ... autowireBean(this);
在Servlet初始化期间,它会自动装配标有@Autowired 的属性。
任何其他会话都会看到这些字段值,在上一个会话被销毁后它们不会被重新连接。
每次调用Servlet构造函数时,如何使它们重新连接?
a)将自动装配放入构造函数中?
或者更好 2)获取一个Web应用程序上下文并从那里提取一个bean?
答案 0 :(得分:1)
尝试使用scope作为该bean @Scope("prototype")
答案 1 :(得分:1)
似乎对容器的工作方式存在一些误解。 Servlet本质上是单例,每次有人调用服务器时都不会获得新的servlet。在servlet上的私有字段中存储状态几乎是一个错误。
请求处理的有状态部分的范围和生命周期是什么?如果它只是请求的生命,那么你可以把你的servlet中的任何内容都设置为有状态并将其移动到另一个类中。然后,您可以为该类定义原型bean,并在请求开始时使用getBean来获取新的bean。如果你想开始变得有趣,你可以编写一个过滤器,在每个请求开始时将一个新bean放入ThreadLocal。
如果您的州需要跨越多个请求,则需要开始保持指向Web会话中状态存储的状态或键,或者使用对话框架。
答案 2 :(得分:-1)
您可以尝试使用@Scope(“会话”)