Tomcat组件梳理—Service组件

本文介绍了Tomcat中的Service组件,包括其组件定义、属性、启动、关闭和监听属性变化的过程。Service作为对外提供服务的组件,包含多个Connector和一个Container。在启动和关闭过程中,Service主要负责调用子组件的相关方法。同时,文章提到了使用PropertyChangeSupport进行属性监听的机制。
摘要由CSDN通过智能技术生成

1.组件定义

Tomcat中只有一个Server,一个Server可以用多个Service,一个Service可以有多个Connector和一个Container。

Server掌握着整个Tomcat的生死大权。

Service是对外提供服务的。一个Server可以有多个Service,只不过Cataina中只添加了一个,这一个就代表了Tomcat的所有服务。

Connector用于接收请求并将请求封装成Request和Response来具体处理

Container用于封装和管理Servlet,以及具体处理reqeust请求
在这里插入图片描述
如上图,一个Service包含多个Connector和一个Engine,两者的关联关系使用Mapper来做映射,还有一个可选的线程池Executor。

2.属性

先把Service的属性代码摆出来:

   /**
     * service的名称
     */
    private String name = null;

    /**
     * Service所属的Server
     */
    private Server server = null;

    /**
     * 组件对属性改变的支持
     */
    protected final PropertyChangeSupport support = new PropertyChangeSupport(this);

    /**
     * 跟这个Service相关联的Connector集合
     */
    protected Connector connectors[] = new Connector[0];

    /**
     * Connector的锁
     */
    private final Object connectorsLock = new Object();

    /**
     * 线程池
     */
    protected final ArrayList<Executor> executors = new ArrayList<>();

    /**
     * Servlet的引擎
     */
    private Engine engine = null;

    /**
     * 类加载器
     */
    private ClassLoader parentClassLoader = null;

    /**
     * Mapper.
     */
    protected final Mapper mapper = new Mapper();

    /**
     * Mapper 监听器
     */
    protected final MapperListener mapperListener = new MapperListener(this);

解释一下这里面关键的几个点:

Connector connectors[]:多个连接器,一个Servlet服务接受两个不同的协议连接,只不过不同的协议通过对应的Connector都被处理成了一个Request对象,这样对于Engine来说,都是一样的请求。
Engine engine:Servlet引擎,就是专门用来处理请求的,其他的都不管。
Mapper mapper:mapper保存了一个映射关系,不同请求路径对应哪一个Servlet的API。
PropertyChangeSupport support:JDK自带的观察者模式,主要是观察Java Bean对象的属性更改的,等会拿出来单独说。

在Service属性中,主要就是这四个东西,主要的架构关系,在上面的图中有解析,就不再多介绍。

3.动作

Service的方法比较简单,因为只是包装,自己没有太多的一个功能,所有主要功能有:1.监听Service属性变化,2.启动,3.关闭。没了,就这三个,其他的都是对属性的setter和getter的具体实现,就不管了。

3.1.启动

在Server组件的分析中,我们已经知道了Server会调用Service的init()方法和start()方法来完成启动操作,那我们分别来看一下Service组件的init()和start()。

首先是init()方法:

protected void initInternal() throws LifecycleException {
   

    //1.父类执行init
    super.initInternal();

    //2.执行servlet的引擎engine的init
    if (engine != null) {
   
        engine.init()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值