Java Spring单例范围是';web应用程序中的t工作

Java Spring单例范围是';web应用程序中的t工作,java,spring,Java,Spring,我试图在web上下文中理解spring中的作用域。 我在配置文件中定义了名为player的bean,如下所示: <bean id="playerBean" class="com.anvesh.model.Player" scope="singleton"/> XmlWebApplicationContext ctx = new XmlWebApplicationContext(); ctx.setConfigLocation("/WEB-INF/WebAppContext.xml"

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

<bean id="playerBean" class="com.anvesh.model.Player" scope="singleton"/>
XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml");
ctx.setServletContext(getServletContext());
ctx.refresh();
<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>
这个servlet处理两种类型的请求 1) 登录验证 2) getFutureMatches

当调用“loginValidate”时,我正在创建playerbean,控件将转到PlayerHomePage.jsp(如下所示)

在PlayerHomePage.jsp中,我调用了“getFutureMatches”操作。所以,控制权将再次来到RequestController,在这里,我试图访问如下所示的播放器bean

player = ctx.getBean("playerBean",Player.class);
但我得到的球员为空

因为我已经将playerBean定义为singleton,一旦它被实例化,无论何时在其他地方调用它,都应该返回相同的bean。当我使用ApplicationContext时,这种情况是正确的。但是当我使用XmlWebApplicationContext时,不会维护单例bea

---当我将作用域用作会话/应用程序时,即使在“getFutureMatches”操作中,我的播放器bean也不会无效。我能够得到玩家对象,这是在前面的请求初始化。但我不明白为什么Singleion不这么做。请帮帮我

请注意,我没有使用SpringMVC。我的web.xml条目如下所示:

<bean id="playerBean" class="com.anvesh.model.Player" scope="singleton"/>
XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml");
ctx.setServletContext(getServletContext());
ctx.refresh();
<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>

org.springframework.web.context.request.RequestContextListener
请求控制器
com.anvesh.servlet.RequestController
请求控制器
/请求控制器

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

如果您创建一个新的
上下文,您将得到一个新的bean。只有在使用相同的上下文时,才会返回原始bean。实际上,bean不会被破坏,每次创建新上下文时都会得到新的bean。所以每次你都会得到新的豆子。与其自己加载,我建议删除该代码,只需在web.xml中注册一个加载配置的
ContextLoaderListener
。在代码中,您可以简单地查找上下文。另外,您的代码似乎有缺陷,因为
播放器
是一个单例,您网站的所有用户共享同一实例。我不认为这是您的预期用途。谢谢Deinum,我将使用您提到的ContextLoaderListener…上面的代码只是我为测试singleton请求和会话范围而编写的示例代码,这就是为什么我将player设置为singleton。它不是生产代码。