【问题标题】:Lazy Instantiation of the Spring MVC DispatcherServlet?Spring MVC DispatcherServlet 的延迟实例化?
【发布时间】:2010-01-21 22:02:13
【问题描述】:

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

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

大约 2 秒的 DispatcherServlet 实例化很重要,因为我使用的是 Google App Engine,这可能最终导致用户必须额外等待 2 秒。

我试过了

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

但是我在 init 调用中得到了这个异常:

[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");

【问题讨论】:

  • 您能详细说明您的方法吗?我(我想还有相当数量的其他人)使用过 GAE + Spring,任何加快启动时间的方法都将不胜感激。

标签: java google-app-engine servlets spring-mvc


【解决方案1】:

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

【讨论】:

  • 嗯,效果很好,谢谢!顺便说一句,它的 init(ServletConfig)。调用 getServletConfig() 可以轻松获取 servlet 配置。
【解决方案2】:

除非 Google App Engine 做了一些非常奇怪的事情,否则 DispatcherServlet 只会在应用程序启动时实例化一次。

如果您想缓存您提到的页面响应,我建议将其实现为HandlerInterceptor(您可以将其应用于您喜欢的任何 URL 模式),它为您提供了在 pre- 或控制器的后调用。

【讨论】:

  • 使用谷歌应用引擎,它会启动和停止很多 JVM 实例。如果您的应用程序空闲了几分钟,它将停止 JVM,并且将有一个全新的应用程序启动下一个请求,包括 DispatcherServlet 实例化
  • 这听起来像具有大量启动逻辑/活动的应用程序对于 GAE 来说是一个糟糕的选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2016-05-05
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多