2010-01-21 88 views
1

有没有办法让我在代码中实例化Spring MVC DispatcherServlet,而不是将它放入web.xml中并让它由Web服务器实例化?Spring MVC DispatcherServlet的惰性实例化?

原因是我想检查一个memCache,看看我是否最近已经呈现了正在请求的页面,如果是这样,只需从memCache中返回,而不是通过Spring MVC和控制器。

DispatcherServlet的〜2秒实例化非常重要,因为我使用的是Google App Engine,并且可能最终需要等待2秒钟才能等待页面。

我已经试过

dispatcherServlet = new DispatcherServlet(); 
dispatcherServlet.init(); 
dispatcherServlet.service(request, response); 

,但我得到的初始化调用此异常:

[java] java.lang.NullPointerException 
[java]   at org.springframework.web.servlet.HttpServletBean$ServletConfigPropertyValues.<init>(HttpServletBean.java:196) 
[java]   at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:114) 

基本上,我正在寻找的是实例代码一个servlet,而不必办法在web.xml中指定它,而不必拨打电话

getServletConfig().getServletContext().getServlet("dispatcherServlet"); 
+0

你能详细阐述一下你的方法吗?我(并且我想象了其他一些重要的人)已经使用GAE + Spring,并且任何加快启动时间的方法都会受到好评。 – yincrash 2011-08-19 03:55:56

回答

1

DispatcherServlet是一个servlet,所以你应该调用init(ServletConfig)而不是init()来初始化它。

+0

那么,这完美谢谢! BTW其init(ServletConfig)。通过调用getServletConfig(),很容易获得servlet配置。 – Kyle 2010-01-21 22:51:35

0

除非Google App Engine执行了某些操作真的很奇怪,DispatcherServlet在应用程序启动时仅实例化一次。

如果您想缓存页面响应,我建议将其作为HandlerInterceptor(您可以将其应用于任何您喜欢的URL模式),这可以让您在插入前或插入后的逻辑 - 控制你的控制器。

+0

使用谷歌应用程序引擎,它启动和停止了很多JVM实例。如果您的应用程序闲置了几分钟,它将停止JVM,并且将有一个全新的应用程序启动,并提供下一个请求,包括DispatcherServlet实例化 – Kyle 2010-01-21 22:09:36

+0

这听起来像是具有相当启动逻辑/活动的应用程序对于GAE – 2010-01-22 00:47:51

相关问题