摘要:反射創建對象,并設置設置對象為的成員變量是對象,該對象的屬性是也就是我們可以看到,其中的的聲明是類型的,降低了和的耦合,而且編譯時不用提供的依賴。
tomcat 啟動流程01
通過debug 分析tomcat啟動流程
1.tomcat啟動入口 2、初始化Catalina對象1. 初始化內容:反射實例話Catalina并添加ClassLoader
初始化入口
public static void main(String args[]) {//args 參數是start, stop 等等 if (daemon == null) { // Don"t set daemon until init() has completed Bootstrap bootstrap = new Bootstrap(); try { bootstrap.init();//初始化Catalina對象,參考catalinaDaemon
bootstrap.init會初始化一個Catalina對象,并給其中的ClassLoader賦值
classLoader成員變量
/** * The shared extensions class loader for this server. */ protected ClassLoader parentClassLoader =Catalina.class.getClassLoader();
2、初始化Catalina的classloader
//tomcat 的3個相關classloader ClassLoader commonLoader = null; ClassLoader catalinaLoader = null; ClassLoader sharedLoader = null; // -------------------------------------------------------- Private Methods private void initClassLoaders() { try { commonLoader = createClassLoader("common", null); if( commonLoader == null ) { // no config file, default to this loader - we might be in a "single" env. commonLoader=this.getClass().getClassLoader(); } catalinaLoader = createClassLoader("server", commonLoader); sharedLoader = createClassLoader("shared", commonLoader);
上述initClassLoaders方法會讀取${TOMCAT_HOME}/conf/catalina.properties文件,讀取要loader的jar包配置
注意,tomcat在catalina.properties 配置文件中指定了:common.loader,catalina.loader,shared.loader但是后2者的配置都為空,網上說是shared.loader 是分享公共的,沒有配置的意義。
從上述的initClassLoaders 可以看出使用creatteClassLoader("","") 創建后兩者的loader時,都傳入了commonLoader, 這樣,配置為空,catalinaLoader 其實還是commonLoader.
備注:tomcat使用了org.apache.catalina.startup.CatalinaProperties封裝tomcat/conf/catalina.properties文件,其讀取配置文件的方式值得學習,代碼如下:
private static void loadProperties() { InputStream is = null; Throwable error = null; try { String configUrl = System.getProperty("catalina.config"); if (configUrl != null) { is = (new URL(configUrl)).openStream(); } } catch (Throwable t) { handleThrowable(t); } if (is == null) { try { File home = new File(Bootstrap.getCatalinaBase()); File conf = new File(home, "conf"); File propsFile = new File(conf, "catalina.properties");
學習之處:可以看到,第一步是判斷有沒有catalina.config 指定catalina.conf的配置路徑,沒有該-D參數才會使用tomcat/conf下的該配置。這個值得學習。
3、反射創建Catalina對象,并設置classLoader
public void init() throws Exception { initClassLoaders(); Thread.currentThread().setContextClassLoader(catalinaLoader); SecurityClassLoad.securityClassLoad(catalinaLoader); // Load our startup class and call its process() method if (log.isDebugEnabled()) log.debug("Loading startup class"); **Class> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");** Object startupInstance = startupClass.getConstructor().newInstance(); // Set the shared extensions class loader if (log.isDebugEnabled()) log.debug("Setting startup class properties"); **String methodName = "setParentClassLoader";** Class> paramTypes[] = new Class[1]; paramTypes[0] = Class.forName("java.lang.ClassLoader"); Object paramValues[] = new Object[1]; paramValues[0] = sharedLoader; Method method = startupInstance.getClass().getMethod(methodName, paramTypes); method.invoke(startupInstance, paramValues); catalinaDaemon = startupInstance; }3、設置Catalina對象為BootStrap的catalinaDaemon 成員變量
private Object catalinaDaemon = null; //catalinaDaemon 是Catalina對象,該對象的parentClassLoader 屬性是sharedClassloader 也就是commonClassLoader
我們可以看到,其中的catalinaDaemon 的聲明是Object類型的,降低了tomcat和Catalina的耦合,而且編譯Bootstrap時不用提供Catalina的依賴。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69683.html
摘要:概念之前有寫了,現在重新寫感覺二者最終結果雖說相差無幾,但是側重點還是有所不同更偏向于工程化,側重于項目的整個流程控制,你可以二者結合,也可以分開取舍都有利于前端項目的工程化構建安裝全局安裝作為項目的開發依賴安裝在項目根目錄下創建一 gulp概念 之前有寫了webpack, 現在重新寫gulp感覺二者最終結果雖說相差無幾,但是側重點還是有所不同 webpack更偏向于工程化,gulp側...
摘要:源碼解讀系列二啟動階段都干了些啥閱讀框架源碼了解啟動階段的那些事兒小伙伴剛接觸的時候會感覺壓力有點大更直觀的說法是難開發組是不贊成難這個說法的的代碼都是實現的而又是世界上最好的語言的代碼閱讀起來是很輕松的之后開發組會用系列源碼解讀文章深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列二: 啟動階段, swoft 都干了些啥?descriptio...
摘要:我們項目使用的是框架,所以我就想到用框架的定時器。,以及的結構注在定時器這塊使用到兩個一個是用于存儲任務的實例。 這兩天老大給了個需求想把商城熱點數據同步到redis緩存。我們項目使用的是swoft框架,所以我就想到用框架的Crontab定時器。但是在測試的時候發現把Table的size設置為1024時(實際上設置為任何大小都一樣,貼上swoole的解釋)發現內存溢出了 showImg...
閱讀 1265·2021-09-27 13:35
閱讀 2563·2021-09-06 15:12
閱讀 3380·2019-08-30 15:55
閱讀 2830·2019-08-30 15:43
閱讀 432·2019-08-29 16:42
閱讀 3446·2019-08-29 15:39
閱讀 3062·2019-08-29 12:28
閱讀 1239·2019-08-29 11:11