【发布时间】:2017-08-02 13:39:36
【问题描述】:
每当我尝试分析以了解弹簧范围时,我都会卡在某个地方。以下是我对分析的理解,在得出结论之前,我想与您确认一下。如果我的理解有误,请纠正我。
<bean id="signupController" class="com.crp.controller.SignupController"
scope="">
如果范围是“请求”,那么对于来自客户端的每个新请求,无论会话如何,spring 容器都会生成新实例。一旦请求完成,spring容器将设法关闭实例的生命周期。
如果范围是“会话”,那么对于会话的第一个请求,spring 容器将生成一个新实例,并为该特定会话的所有客户端请求维护它。一旦会话超时,spring 容器将设法关闭实例的生命周期。
如果范围是“原型”,则无论会话如何,只要请求 bean,spring 容器都会生成新实例。开发者应该管理实例的生命周期,因为 Spring 容器不会管理原型范围的生命周期。
如果范围是“单例”,则只有一个实例由 spring 容器生成并保持它可用于所有请求,而与会话无关。对于每个会话,都会维护一个单例实例的副本,以便一个会话单例对象不会被另一个会话共享,并且 Spring 容器将管理单例实例副本的生命周期并在会话超时时将其关闭。
注意:我相信你们中的大多数人可能对我对单例范围的理解有不同的看法。甚至我也对单例范围的行为感到困惑,并在分析过程中获得不同的信息。请分享你的想法
谢谢。
对于单例范围,容器如何在以下实现中为多个用户(会话)同时发送请求。
登录.java:
public class Login {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
LoginController.java:
public class LoginController extends MultiActionController {
private Login login;
public ModelAndView submitLogin(HttpServletRequest request,
HttpServletResponse response) {
String userName = request.getParameter("username");
String password= request.getParameter("password");
getLogin().setUserName(userName);
getLogin().setPassword(password);
// TODO send login bean to DAO for executing further business logic.
}
public Login getLogin() {
return login;
}
public void setLogin(Login login) {
this.login = login;
}
}
context.xml:
<bean id="login" class="com.crp.bean.Login" scope="singleton">
</bean>
<bean id="loginController" class="com.crp.controller.LoginController" scope="singleton">
<property name="login" ref="login"></property>
</bean>
【问题讨论】:
标签: spring spring-mvc