每当我尝试分析以了解弹簧范围时,我就会被困在某个地方。以下是我对分析的理解,在结束自己之前,我想与您确认一下。如果我的理解是错误的,请纠正我。
<bean id="signupController" class="com.crp.controller.SignupController"
scope="">
如果范围是“请求”,则对于来自客户端的每个新请求而不管会话,spring容器将生成新实例。请求完成后,spring容器将设法关闭实例的生命周期。
如果scope是“session”,那么对于会话的第一个请求,spring容器将生成一个新实例,并为该特定会话的所有客户端请求维护它。一旦会话超时,spring容器将设法关闭实例的生命周期。
如果scope是“prototype”,则无论session何时请求bean,spring容器都会生成新实例。开发人员应该管理实例的生命周期,因为spring容器不会管理原型范围的生命周期。
如果范围是“singleton”,则只有一个实例由spring容器生成并保持其可用于所有请求,而不管会话如何。对于每个会话,将维护单个实例的副本,以便一个会话单例对象不会被另一个会话共享,并且spring容器将管理单例实例副本的生命周期,并在会话超时时关闭它。
注意:我相信大多数人对我对单身范围的理解可能有不同意见。甚至我也对单例范围的行为感到困惑,并在分析过程中获取不同的信息。请分享您的想法
谢谢。
对于单例范围,容器如何同时为多个用户(会话)发送请求的以下实现工作。
Login.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>
答案 0 :(得分:1)
不,那不完全正确。
如果范围是&#34;请求&#34;,那么对于来自客户端的每个新请求而不管会话,spring容器都将生成新实例。
没有。只有当代码调用bean上的方法时(即在包装实际bean实例的作用域代理上),才会创建bean实例。但你是对的,每个请求都有一个与其他请求不同的bean实例,并且bean在请求结束时被销毁(即它的生命周期钩子,如果它们存在,则在请求结束)。
如果范围是&#34; session&#34;,那么对于会话的第一个请求,spring容器将生成一个新实例,并为该特定会话的所有客户端请求维护它。
与请求范围相同:bean实例是按需创建的。
如果范围是&#34; prototype&#34;,无论会话是什么,只要请求bean,spring容器就会生成新实例。
右。但请注意,您需要向spring上下文请求bean实例以获取新实例。如果你将一个原型注入一个单独的bean,那么单例bean将在其生命周期中保持对这个bean的引用,因此每次单例bean调用它时都会使用相同的原型bean。
如果范围是&#34; singleton&#34;,则只有一个实例由spring容器生成并保持其可用于所有请求,而不管会话如何。对于每个会话,将维护单个实例的副本,以便一个会话单例对象不会被另一个会话共享,并且spring容器将管理单例实例副本的生命周期,并在会话超时时关闭它。
没有。那是完全错误的。根本没有副本。创建单个实例,在任何地方注入,并在任何地方同时使用。只有在应用程序本身结束时才会销毁bean。