Tomcat源码阅读之StandardHost与HostConfig的分析

前面的文章分析了StandardEngine,这里来分析一下由Engine对象来管理的另外一种对象吧:Host。。

一般情况下,在tomcat中都是默认使用StandardHost类型。。。这里先来看看在catalina是如何配置创建StandardHost对象的吧:

//创建host对象
        digester.addObjectCreate(prefix + "Host",
                                 "org.apache.catalina.core.StandardHost",  //创建host对象的配置
                                 "className");
        digester.addSetProperties(prefix + "Host");
        digester.addRule(prefix + "Host",
                         new CopyParentClassLoaderRule());  //会将host的parentClassloader设置为engine的,engine被设置为sharedloader
        digester.addRule(prefix + "Host",   //为host设置配置的监听
                         new LifecycleListenerRule
                         ("org.apache.catalina.startup.HostConfig",   //这个算是比较重要的吧,在里面会具体的创建context啥的
                          "hostConfigClass"));
        digester.addSetNext(prefix + "Host",
                            "addChild",
                            "org.apache.catalina.Container");  // 在engine上面调用addChild方法,用于添加当前的host到engine上面去

这部分具体的涉及到Host对象的创建,第一个是具体的创建要用的host对象,也就是StandardHost对象,接着是指定为host设置的parentclassLoader为engine的parentClassLoader,在前面的文章中,我们知道engine的parentClassLoader会被设置为sharedLoader,所以这里host对象的parentClassLoader也会被设置为sharedLoader。。

然后还有比较重要的配置项吧,为StandardHost对象添加lifecycle的监听器,为HostConfig类型的对象。。它是比较重要的吧,因为它会具体的负责对context的创建,启动啥的。。这个一会再来说吧。。

然后就最后调用engine的addChild方法将当前host对象添加到engine上面去了。。。

好啦,到这里怎样创建host对象应该算是知道了吧。。。那么接下来来看看host接口是如何定义的吧:

public interface Host extends Container {

	//host的一些事件的定义,添加别名,移除别名啥的
    public static final String ADD_ALIAS_EVENT = "addAlias";

    public static final String REMOVE_ALIAS_EVENT = "removeAlias";

    public String getXmlBase(); //当前host对象的配置文件的路径,这个文件不一定存在吧   /conf/enginename/hostname/

    public void setXmlBase(String xmlBase);

    public File getConfigBaseFile();  //当前host的配置xml文件

    public String getAppBase();  //当前host的app在什么地方

    public File getAppBaseFile();   //获取app的放的目录的文件引用 

    public void setAppBase(String appBase);   //设置app存放的路径

    public boolean getAutoDeploy();  //是否自动部署

    public void setAutoDeploy(boolean autoDeploy);   //是否自动部署

    public String getConfigClass();   //用于监听context的listener的类型

    public void setConfigClass(String configClass);   

    public boolean getDeployOnStartup();  //启动的时候部署?

    public void setDeployOnStartup(boolean deployOnStartup);   


    public String getDeployIgnore();

    public Pattern getDeployIgnorePattern();  //context名字匹配用的正则表达式

    public void setDeployIgnore(String deployIgnore);


    public ExecutorService getStartStopExecutor();  //用于启动和停止子container(也就是context)的executor

    public boolean getCreateDirs();    //如果是ture的话,那么会尝试为应用程序和host的配置创建文件夹

    public void setCreateDirs(boolean createDirs);

    public boolean getUndeployOldVersions();  //是否自动卸载程序的老版本

    public void setUndeployOldVersions(boolean undeployOldVersions);

    public void addAlias(String alias);   //为当前host添加别名

    public String[] findAliases();  //获取当前host的所有别名

    public void removeAlias(String alias);   //移除一个别名
}

接口定义稍微长一些吧,不过也还挺简单的,主要是一些配置,别名什么的管理,这个具体看上面的注释应该能比较的清楚吧。

好啦,接下来来看看StandardHost是怎么实现的吧,先来看看简单的继承体系:


这个应该算是很简单的吧,首先也是一个容器。。。然后实现了host接口。。。这里来看看它的构造函数吧:

    public StandardHost() {

        super();
        pipeline.setBasic(new StandardHostValve());  //设置basic

    }

没做什么事情吧,无非是在pipeline上面添加了一个basic的valve对象。。。接下来再来看看一些重要的属性的定义吧:

    private String[] aliases = new String[0];  //当前host对象的别名的数组

    private final Object aliasesLock = new Object();  //锁

    private String appBase = "webapps";   //默认的app的路径是tomcat根路径下的webapps文件夹
    private volatile File appBaseFile = null;   //引用这个文件夹

    private String xmlBase = null;   //xml配置文件
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值