tomcat類加載器深刻研究筆記

一、StandardClassLoader 繼承自URLClassLoader,和URLClassLoader相比沒有添加任務新的功能。這個類已經被tomcat7.x廢棄掉了,官方準備在tomcat8.x版本中去掉這個類java

二、BootStrapClassLoader是用本地代碼實現的,它負責加載核心的java class(即全部java.*開頭的類)。另外JVM還提供了兩個類加載器,ExtensionClassLoaderSystemClassLoader。都是用java編寫的,都是java.lang.ClassLoader的子類,由Bootstrap ClassLoader加載後才能使用。其中Extension ClassLoader負責加載擴展的java class(例如全部的javax.*開頭的類和存放在JRE的ext目錄下的類)System ClassLoader負責加載應用程序自身的類。web

三、URLClassLoader是SecureClassLoader的子類apache

四、URLClassLoader經過findClass方法來加載一個類。數組

五、Package的建立中會蒐集jar包中manifest中的一些描述信息。tomcat

六、要自定義類加載器,須要繼承 java.lang.ClassLoader 並要重寫其中的findClass方法,由於若是不重寫這個方法的話,默認是拋出ClassNotFoundException的app

七、Protected final Class<?>defineClass(String name,byte[] b,int off,int len);這個方法將一個字節數組轉換成一個Class並初始化。若是不能轉換的話,就會拋一個異常ClassFormatErrorjsp

八、New 是在編譯的時候檢查.class類型和路徑,class.forName(「xxx」).newInstance()是在運行時找到給路徑的類進行實例化,至關於先檢查路徑而後再進行實例化。函數

九、Class下的newInstance()的使用有侷限,由於它生成的對象只能調用無參的構造函數,而使用new關鍵字生成的對象沒有這個限制。spa

十、Q:爲何說servlet 只能訪問WEB-INF/classes下面的類線程

        A:其實這句話我理解錯了,這句話的意思不是說servlet去載入某些類,而是當載入servlet的時候,只能把servlet放到WEB-INF/classes或者WEB-INF/lib中

十一、當準備運行servlet的時候,必須把它存放到其中一個web應用程序的/WEB-INF/classes目錄中,這樣就能夠經過web程序的上下文路徑和該servlet名來調用該servlet了。

十二、WebappLoader的866行和918行指定了要加載的servlet類的範圍,是寫死的/WEB-INF/classes  /WEB-INF/lib

1三、WEB-INF\web.xml :<load-on-startup>1<load-on-startup> 代表在應用程序啓動的時候執行指定的servlet,這裏的1表明被加載的優先級數值越小,表明被加載的優先級越高

1四、$CATALINA_HOME/conf/ 下的web.xml 仍是須要好好研究一下的。

1五、$CATALINA_HOME/conf/web.xml 當中配置了一個默認的Servlet,叫做:org.apache.catalina.servlets.DefaultServlet,這個Servlet主要負責服務 圖片資源以及靜態資源,像jsp這種資源則不提供服務。

1六、Web.xml 的解析在ContextConfig這個類中完成。

1七、WebRuleSet 這個類負責定義瞭解析部署描述符web.xml涉及到的規則以及規則路徑的定義

1八、JSP的編譯器是org.apache.jasper.compiler.Compiler,負責將jsp文件編譯成servlet

1九、$WEB-INF_HOME/conf/web.xml 這個目錄下配置了兩個Servlet的,這兩個servlet都在啓動的時候去加載,一個是org.apache.catalina.servlets.DefaultServlet,另外一個是org.apache.jasper.servlet.JspServlet一個servlet主要負責靜態資源的訪問加載第二個Servlet主要負責JspServlet的編譯解析

20、Tomcat的容器實現熱部署使用了兩種機制:

  • ClassLoader重寫,經過自定義classloader加載相應的jsp編譯後的class到JVM中。

  • 經過動態的修改內存中的本身碼,將修改過的class再次裝在到JVM中。

2一、Tomcat中爲了加載jsp編譯好的類,實現了一個Jsp的一個類加載器,類的權限定名是:

org.apache.jasper.servlet.JasperLoader.

2二、對於jsp頁面tomcat都用了一個獨立的classloader來裝載,每次修改完jsp後,tomcat都將使用一個新的classloader來裝載它。(有疑問??)

2三、ContainerBase 當中有個backgroundProcess()方法,貌似是用來定時檢查文件的修改,實現熱部署的。

2四、在Container接口中,定義了backgroundProcess()方法,這個方法的目的是爲容器起一條後臺線程,在後臺定時的去作一些事情,好比說類的熱部署。

相關文章
相關標籤/搜索