spring单例作用域在web应用程序中不起作用

z9gpfhce  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(336)

我试图在web上下文中理解spring中的作用域。我在配置文件中定义了名为player的bean,如下所示:

<bean id="playerBean" class="com.anvesh.model.Player" scope="singleton"/>

然后我有一个servlet,它充当requestcontroller(来自jsp的所有提交请求都将通过这个servlet路由)。在这个servlet中,我正在初始化spring配置文件,如下所示:

XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml");
ctx.setServletContext(getServletContext());
ctx.refresh();

这个servlet处理两种类型的请求1)loginvalidate 2)getfuturematches
当“loginvalidate”被调用时,我正在创建playerbean,控件将转到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,在这里,我尝试访问playerbean,如下所示

player = ctx.getBean("playerBean",Player.class);

但我得到的球员为空。
因为我已经将playerbean定义为singleton,所以一旦它被示例化,无论何时在其他地方调用它,都应该返回相同的bean。当我使用applicationcontext时,这种情况是正确的。但是当我使用xmlwebapplicationcontext时,不会维护单例bea。
---当我使用scope作为会话/应用程序时,我的playerbean即使在“getfuturematches”操作中也不会被取消。我能够得到玩家对象,这是在前面的请求初始化。但我不明白为什么singletion不这么做。请帮帮我。
请注意,我没有使用springmvc。我的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>
68bkxrlz

68bkxrlz1#

因为我一直在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()。

相关问题