當(dāng)客戶端的請求到達(dá)Tomcat,Tomcat會創(chuàng)建一個線程來接收、處理、響應(yīng)客戶端請求,客戶端在請求某個Servlet類時,線程需要通過這個Servlet類的實例來調(diào)用service方法、調(diào)用doGet/doPost..方法來處理響應(yīng)請求,這個Servlet類的實例是何時創(chuàng)建、何時銷毀的呢?
Servlet實例的生命周期指的是一個Servlet類的實例從創(chuàng)建到銷毀的過程。
Servlet類是單實例多線程的,一個Servlet類自始至終只會創(chuàng)建一個對象;
如果當(dāng)前Servlet類沒有配置
當(dāng)客戶端第一次請求Servlet時,創(chuàng)建當(dāng)前Servlet類的實例,然后使用這個實例調(diào)用service(ServletRequest, ServletResponse)方法——service(HttpServletRequest, HttpServletResponse)方法——doGet/doPost處理客戶端請求;當(dāng)客戶端請求再次到達(dá)時將不會重新創(chuàng)建Servlet實例,直接使用第一次創(chuàng)建的實例調(diào)用方法進(jìn)行響應(yīng);
如果當(dāng)前Servlet類配置了
當(dāng)服務(wù)器啟動時就會創(chuàng)建Servlet類的實例,無論客戶端第一次請求這個Servlet類,還是再次請求都不會創(chuàng)建Servlet類實例,直接使用服務(wù)器啟動時創(chuàng)建的Servlet實例來接收、處理、響應(yīng)客戶端請求;
當(dāng)服務(wù)器關(guān)閉時,Serlvet類的實例會被銷毀。
配置load-on-startup的兩種方式:
xml配置
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.qfedu.servlets.TestServlet</servlet-class>
<!--如果有多個Servlet都配置了load-on-startup,里面的數(shù)字就是在服務(wù)器中創(chuàng)建實例的順序-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
注解配置