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