我试图在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>
1条答案
按热度按时间68bkxrlz1#
因为我一直在post方法中初始化配置文件代码,所以每次调用post方法时都会初始化xmlwebapplicationcontext。因为每次调用refresh()时,单例对象都会丢失。我已经将下面的初始化代码移到servlet的init()方法。现在,并不是每次调用post()时都调用refresh(),因此将保留singleton对象。
我仍然不明白会话对象是如何维护的,即使每次都是ctx.refresh()。