Constructor vs Init method in Servlet

在Java Servlet中我們能有構(gòu)造函數(shù)么?或者,如果已經(jīng)有一個(gè)init()方法來(lái)初始化Servlet,那在Servlet中為什么需要構(gòu)造函數(shù)?或者說(shuō),構(gòu)造函數(shù)和init()之間的區(qū)別是什么呢?
以上問(wèn)題都與Servlet實(shí)現(xiàn)class中,構(gòu)造函數(shù)和init()的角色有關(guān)。
首先,Servlet特別之處在于它們的生命周期由web容器管理,如Tomcat和Jetty。它們負(fù)責(zé)創(chuàng)建Servlet實(shí)例,以及在它們沒(méi)有足夠資源或需要支持更多Servlets實(shí)例的時(shí)候destroy它們。

  • 我們能在Servlet中創(chuàng)建constructor么?
    Servlet實(shí)現(xiàn)類(lèi)可以有constructor,但是它們應(yīng)該使用init()方法來(lái)初始化Servlet,因?yàn)橐韵聝蓚€(gè)原因:

    1. java中,你不能在接口里面聲明構(gòu)造函數(shù),也就是說(shuō)你不能對(duì)任何實(shí)現(xiàn)Servlet接口的類(lèi)強(qiáng)制這個(gè)要求。
    2. Servlet需要容器創(chuàng)建的ServletConfig對(duì)象來(lái)初始化,因?yàn)?em>ServletConfig有指向ServletContext object的引用。

    Servlet是一個(gè)定義在javax.servlet包中的接口,HttpServlet是一個(gè)類(lèi),并且像java中其它類(lèi)一樣,它可以有構(gòu)造函數(shù),但是你不能在接口中聲明構(gòu)造函數(shù)。如果你沒(méi)有顯示提供一個(gè)構(gòu)造函數(shù),編譯器會(huì)在Servlet實(shí)現(xiàn)類(lèi)中添加一個(gè)默認(rèn)無(wú)參構(gòu)造函數(shù)。另外一個(gè)原因是你不應(yīng)該使用構(gòu)造函數(shù)來(lái)初始化Servlet,因?yàn)镾ervlet并不直接被Java代碼實(shí)例化,而是由容器創(chuàng)建它們的實(shí)例,并且把它們保持在pool中。由于web server上的容器使用Java反射來(lái)創(chuàng)建Servlet實(shí)例,必須要有無(wú)參構(gòu)造函數(shù)。如果你提供了一個(gè)有參數(shù)的構(gòu)造函數(shù)并且沒(méi)有提供無(wú)參構(gòu)造函數(shù),web容器不能創(chuàng)建你的Servlet的實(shí)例。如果有一個(gè)有參數(shù)的構(gòu)造函數(shù),Java編譯器不能添加默認(rèn)無(wú)參構(gòu)造函數(shù)。這就是不建議在Servlet class中提供構(gòu)造函數(shù)的原因。

  • 為什么我們需要使用init()方法來(lái)初始化Servlet?

  • Constructor和init方法的區(qū)別
    在真實(shí)的應(yīng)用中,你最好使用init()來(lái)做初始化,因?yàn)?strong>init()方法接收一個(gè)ServletConfig參數(shù),它能包含web.xml中對(duì)應(yīng)Servlet的任意初始化參數(shù)。由于web.xml提供了有用的信息給web容器,比如實(shí)例化的Servlet名字。ServletConfig instance被用來(lái)提供初始化參數(shù)給Servlets。你能夠基于ServletConfig對(duì)象中提供的配置來(lái)設(shè)置你的Servlet。比如你能夠提供具體的環(huán)境設(shè)置:臨時(shí)目錄的路徑、數(shù)據(jù)庫(kù)連接參數(shù)以及其他配置參數(shù)。你能夠在一個(gè)環(huán)境中使用web.xml中不同設(shè)置來(lái)簡(jiǎn)單地deploy你的web應(yīng)用。請(qǐng)記住,init()不像構(gòu)造函數(shù)是鏈?zhǔn)降?,?gòu)造函數(shù)的super類(lèi)構(gòu)造函數(shù)會(huì)在子類(lèi)構(gòu)造函數(shù)執(zhí)行之前執(zhí)行,也叫做構(gòu)造器鏈。

    Paste_Image.png

    容器使用web.xml來(lái)獲取Servlet的名字來(lái)初始化,并且使用Java反射API(主要是class.newInstance())來(lái)創(chuàng)建Servlet實(shí)例,也就意味著Servlet必須需要一個(gè)默認(rèn)無(wú)參構(gòu)造函數(shù)。我們已經(jīng)看到為什么Servlet不能有用戶(hù)定義的構(gòu)造函數(shù),主要是因?yàn)镾ervlets作為接口不能保證它和web容器創(chuàng)建Servlet實(shí)例以及能夠訪(fǎng)問(wèn)Context和Config對(duì)象,開(kāi)發(fā)者不能訪(fǎng)問(wèn)到它們??偸莾?yōu)先使用init()方法來(lái)初始化Servlet,因?yàn)?strong>ServletConfig對(duì)象被用來(lái)給init()方法提供參數(shù)。

參考資料
javarevisited

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容