成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

TOMCAT-02-tomcat 啟動流程01

KavenFan / 3183人閱讀

摘要:反射創(chuàng)建對象,并設(shè)置設(shè)置對象為的成員變量是對象,該對象的屬性是也就是我們可以看到,其中的的聲明是類型的,降低了和的耦合,而且編譯時不用提供的依賴。

tomcat 啟動流程01

通過debug 分析tomcat啟動流程

1.tomcat啟動入口

2、初始化Catalina對象

1. 初始化內(nèi)容:反射實(shí)例話Catalina并添加ClassLoader

初始化入口

 public static void main(String args[]) {//args 參數(shù)是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個相關(guān)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者的配置都為空,網(wǎng)上說是shared.loader 是分享公共的,沒有配置的意義。
從上述的initClassLoaders 可以看出使用creatteClassLoader("","") 創(chuàng)建后兩者的loader時,都傳入了commonLoader, 這樣,配置為空,catalinaLoader 其實(shí)還是commonLoader.

備注:tomcat使用了org.apache.catalina.startup.CatalinaProperties封裝tomcat/conf/catalina.properties文件,其讀取配置文件的方式值得學(xué)習(xí),代碼如下:

    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");

學(xué)習(xí)之處:可以看到,第一步是判斷有沒有catalina.config 指定catalina.conf的配置路徑,沒有該-D參數(shù)才會使用tomcat/conf下的該配置。這個值得學(xué)習(xí)。

3、反射創(chuàng)建Catalina對象,并設(shè)置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、設(shè)置Catalina對象為BootStrap的catalinaDaemon 成員變量
    private Object catalinaDaemon = null;  //catalinaDaemon 是Catalina對象,該對象的parentClassLoader 屬性是sharedClassloader 也就是commonClassLoader

我們可以看到,其中的catalinaDaemon 的聲明是Object類型的,降低了tomcat和Catalina的耦合,而且編譯Bootstrap時不用提供Catalina的依賴。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69683.html

相關(guān)文章

  • gulp——用自動化構(gòu)建工具增強(qiáng)你的工作流程

    摘要:概念之前有寫了,現(xiàn)在重新寫感覺二者最終結(jié)果雖說相差無幾,但是側(cè)重點(diǎn)還是有所不同更偏向于工程化,側(cè)重于項(xiàng)目的整個流程控制,你可以二者結(jié)合,也可以分開取舍都有利于前端項(xiàng)目的工程化構(gòu)建安裝全局安裝作為項(xiàng)目的開發(fā)依賴安裝在項(xiàng)目根目錄下創(chuàng)建一 gulp概念 之前有寫了webpack, 現(xiàn)在重新寫gulp感覺二者最終結(jié)果雖說相差無幾,但是側(cè)重點(diǎn)還是有所不同 webpack更偏向于工程化,gulp側(cè)...

    geekidentity 評論0 收藏0
  • swoft| 源碼解讀系列二: 啟動階段, swoft 都干了些啥?

    摘要:源碼解讀系列二啟動階段都干了些啥閱讀框架源碼了解啟動階段的那些事兒小伙伴剛接觸的時候會感覺壓力有點(diǎn)大更直觀的說法是難開發(fā)組是不贊成難這個說法的的代碼都是實(shí)現(xiàn)的而又是世界上最好的語言的代碼閱讀起來是很輕松的之后開發(fā)組會用系列源碼解讀文章深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列二: 啟動階段, swoft 都干了些啥?descriptio...

    hqman 評論0 收藏0
  • swoft中Crontab定時器的坑

    摘要:我們項(xiàng)目使用的是框架,所以我就想到用框架的定時器。,以及的結(jié)構(gòu)注在定時器這塊使用到兩個一個是用于存儲任務(wù)的實(shí)例。 這兩天老大給了個需求想把商城熱點(diǎn)數(shù)據(jù)同步到redis緩存。我們項(xiàng)目使用的是swoft框架,所以我就想到用框架的Crontab定時器。但是在測試的時候發(fā)現(xiàn)把Table的size設(shè)置為1024時(實(shí)際上設(shè)置為任何大小都一樣,貼上swoole的解釋)發(fā)現(xiàn)內(nèi)存溢出了 showImg...

    CarterLi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<