我试图在Web环境中理解spring中的范围。 我有一个名为player的bean,我在配置文件中定义如下:
<bean id="playerBean" class="com.anvesh.model.Player" scope="singleton"/>
然后我有一个servlet作为RequestController(来自jsps的所有提交请求都将通过这个servlet)。在这个servlet中,我正在初始化spring配置文件,如下所示:
XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml");
ctx.setServletContext(getServletContext());
ctx.refresh();
此servlet处理两种类型的请求 1)loginValidate 2)getFutureMatches
当调用“loginValidate”时我正在创建播放器bean并且控件将转到PlayerHomePage.jsp(如下所示)
player = ctx.getBean("playerBean",Player.class);
player.setName("Anveshan");
player.setExp(10);
player.setId(3175);
player.setQualification("B.Tech");
System.out.println("In the validate Login :"+player);
response.sendRedirect("/SpringRefernce_Scope/Jsp/PlayerHomePage.jsp");
在PlayerHomePage.jsp中,我调用了“getFutureMatches”动作。所以再次控制将来到RequestController,在这里,我试图访问下面的播放器bean
player = ctx.getBean("playerBean",Player.class);
但是我将玩家视为空。
由于我已经将playerBean定义为singleton,因此在实例化后,只要在其他地方调用它,就应该返回相同的bean。当我使用ApplicationContext时,这种情况正确发生。但是当我使用XmlWebApplicationContext时,不会维护单例bea。
---当我将范围用作会话/应用程序时,即使在“getFutureMatches”操作中,我的播放器bean也是非空的。我能够获得在普遍请求中被初始化的Player对象。但我无法理解为什么单一行为没有这样做。请帮帮我。
请注意,我没有使用spring-mvc。我的web.xml条目如下:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<servlet>
<servlet-name>requestController</servlet-name>
<servlet-class>com.anvesh.servlet.RequestController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>requestController</servlet-name>
<url-pattern>/RequestController</url-pattern>
</servlet-mapping>
答案 0 :(得分:0)
由于我在post方法中保留了配置文件代码的初始化,因此每次调用post方法时都会初始化XmlWebApplicationContext。由于每次调用refresh()时都会丢失单个对象。我已将下面的初始化代码移动到servlet的init()方法。现在每次调用post()时都不会调用refresh(),因此会保留singleton对象。
XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml");
ctx.setServletContext(getServletContext());
ctx.refresh();
即使每次都使用ctx.refresh(),我仍然不明白如何维护会话对象。