Spring单例范围在Web应用程序中不起作用

时间:2015-01-15 06:02:53

标签: java spring

我试图在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>

1 个答案:

答案 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(),我仍然不明白如何维护会话对象。

相关问题