Tomcat组件梳理—Service组件

1.组件定义

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

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

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

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

Container用于封装和管理Servlet,以及具体处理reqeust请求
Tomcat组件梳理—Service组件_第1张图片
如上图,一个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.i

你可能感兴趣的:(java基础,java,tomcat,zookeeper,spring,servlet)