Servlet什么时候初始化?
最近面试遇到了这样一道题,面试官问Servlet什么时候初始化?回答是:在web容器启动的时
候初始化,然后他笑了笑,我就一脸懵逼了。回来之后查了查资料,明白当时的回答是多么的傻! 所
以在这里总结大家之言,以提供给更多不解之人与之帮助,希望有所帮助!
一直一来都认为Servlet是在web容器启动的时候初始化,但仔细想想有很多地方可以推究。如
果有一万个servlet,那服务器启动的时候就要实例化一万个类,那就是要在内存(堆中)中创建一万
个对象,一次创建这么多对象,对于内存(堆中)而言负载量相当的大,有可能就会出现《内存溢出》
的异常,所以后来想想,应该是在请求的时候才去实例化的吧,这样的话,对于容器而言不用启动的时
候就加载那么多东西,感觉这就是请求时才加载的根本原因吧,纯属个人见解(以上是转自http://bl
og.csdn.net/wwhmj/article/details/51647063),希望各位有不同见解的
提出来,大家一起讨论。
如果没有设置loadOnStartup,则第一次请求的时候实例化
分三种情况:
loadOnStartup < 0
即负数的情况下,web容器启动的时候不做实例化处理,servlet首次被调用时做实例化
这种情况和没有设置loadOnStartup是一样的。
loadOnStartup > 0
web容器启动的时候做实例化处理,顺序是由小到大,正整数小的先被实例化
loadOnStartup = 0
web容器启动的时候做实例化处理,相当于是最大整数,因此web容器启动时,最后被实例化
配置 web.xml
配置一个普通的servlet
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.servlet.AServlet</servlet-class>
<load-on-startup>4</load-on-startup><!--加这个标签,tomcat启动时会自动加载
指定的servlet 值是servlet的加载顺序!!! 数字越小代表加载的优先级越高-->
</servlet>