本文不討論 Spring 的
@Autowired
懶加載(lazy-init)問題。
今天突然發現一個問題。
在Tomcat啓動時,SpringMVC並沒有加載,而是第一次請求到來時才進行加載。
因爲SpringMVC加載較慢, 導致 httpClient 客戶端 超時而報錯。
Tomcat的 catalina.out
日誌信息如下:
05-Dec-2017 12:11:14.878 INFO
[main] org.apache.catalina.startup.Catalina.start Server startup in 21508 ms
[2017-12-05 12:14:06 DEBUG
org.springframework.web.servlet.DispatcherServlet:118 ]
Initializing servlet 'SpringMVC'
[2017-12-05 12:14:06 DEBUG
org.springframework.web.context.support.StandardServletEnvironment:109 ]
Adding [servletConfigInitParams] PropertySource with lowest search precedence
可以看到, 12:11 分 Tomcat啓動成功。 而 12:14 分才初始化 DispatcherServlet, 簡單排查了一下, 在 web.xml
中加上 load-on-startup
即可。
<!-- SpringMVC核心分發器 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然後重新啓動應用,一切正常。
因爲加載速度大多較快,所以多數應用都沒配置該參數。 但對於調用量較小的純API來說可能就會有一些影響。
load-on-startup
配置一般是大於0的數值,表示啓動順序。 如果相同,則表明這兩個Servlet啓動順序隨意。
如果是SpringBoot項目,則使用以下配置:
spring.mvc.servlet.load-on-startup=1
日期: 2017年12月05日
作者: 鐵錨: http://blog.csdn.net/renfufei