Skip to content

Tomcat容器架构 ​

深入理解Tomcat的容器架构,掌握Engine、Host、Context、Wrapper等容器的实现,理解容器生命周期、请求分发、类加载机制等核心功能。

📋 容器架构概览 ​

Tomcat采用分层的容器架构,每个容器负责不同的功能。

🎯 一、容器层次 ​

1.1 容器接口 ​

Container接口:

java
public interface Container extends Lifecycle {
    void setName(String name);
    Container getParent();
    void setParent(Container container);
    void addChild(Container child);
    Container findChild(String name);
    Container[] findChildren();
    void removeChild(Container child);
    void addContainerListener(ContainerListener listener);
    void removeContainerListener(ContainerListener listener);
    void invoke(Request request, Response response) throws IOException, ServletException;
}

1.2 容器层次结构 ​

容器层次:

Server
  └── Service
      └── Engine
          └── Host
              └── Context
                  └── Wrapper
                      └── Servlet

🎯 二、容器生命周期 ​

2.1 Lifecycle接口 ​

Lifecycle:

java
public interface Lifecycle {
    void start() throws LifecycleException;
    void stop() throws LifecycleException;
    LifecycleState getState();
    void addLifecycleListener(LifecycleListener listener);
    void removeLifecycleListener(LifecycleListener listener);
}

2.2 生命周期管理 ​

LifecycleBase:

java
@Override
public final synchronized void start() throws LifecycleException {
    if (LifecycleState.STARTING_PREP.equals(state) || 
            LifecycleState.STARTING.equals(state) || 
            LifecycleState.STARTED.equals(state)) {
        return;
    }
    
    if (state.equals(LifecycleState.NEW)) {
        init();
    } else if (state.equals(LifecycleState.FAILED)) {
        stop();
    } else if (!state.equals(LifecycleState.INITIALIZED) && 
            !state.equals(LifecycleState.STOPPED)) {
        invalidTransition(Lifecycle.BEFORE_START_EVENT);
    }
    
    try {
        setStateInternal(LifecycleState.STARTING_PREP, null, false);
        startInternal();
        if (state == null || 
                !state.equals(LifecycleState.STARTING)) {
            invalidTransition(Lifecycle.AFTER_START_EVENT);
        }
        setStateInternal(LifecycleState.STARTED, null, false);
    } catch (Throwable t) {
        handleSubClassException(t, "lifecycleBase.startFail", toString());
    }
}

🎯 三、请求分发 ​

3.1 请求分发流程 ​

请求分发:

3.2 StandardHostValve ​

StandardHostValve.invoke:

java
@Override
public final void invoke(Request request, Response response) 
        throws IOException, ServletException {
    Context context = request.getContext();
    if (context == null) {
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                sm.getString("standardHost.noContext"));
        return;
    }
    if (request.isAsyncSupported()) {
        request.setAsyncSupported(context.getPipeline().isAsyncSupported());
    }
    context.getPipeline().getFirst().invoke(request, response);
}

🎯 四、类加载机制 ​

4.1 WebappClassLoader ​

WebappClassLoader:

java
public class WebappClassLoader extends URLClassLoader {
    
    @Override
    public Class<?> loadClass(String name, boolean resolve) 
            throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            Class<?> clazz = null;
            
            clazz = findLoadedClass0(name);
            if (clazz != null) {
                if (resolve) {
                    resolveClass(clazz);
                }
                return clazz;
            }
            
            if (clazz == null) {
                try {
                    clazz = findClass(name);
                if (clazz != null) {
                    if (resolve) {
                        resolveClass(clazz);
                    }
                    return clazz;
                }
            } catch (ClassNotFoundException e) {
                // ...
            }
            
            if (clazz == null) {
                if (delegate || filter(name, true)) {
                    clazz = Class.forName(name, false, parent);
                    if (clazz != null) {
                        if (resolve) {
                            resolveClass(clazz);
                        }
                        return clazz;
                    }
                }
            }
            
            throw new ClassNotFoundException(name);
        }
    }
}

📖 学习资源 ​

视频教程 ​

书籍推荐 ​

  • 《Tomcat架构解析》 - 刘光瑞

网站资源 ​

✅ 学习检查清单 ​

  • [ ] 已理解容器层次结构
  • [ ] 已理解容器生命周期
  • [ ] 已理解请求分发机制
  • [ ] 已理解类加载机制
  • [ ] 已绘制容器架构图
  • [ ] 已总结核心知识点

上一章节:Tomcat连接器
返回目录:Mybatis和Tomcat源码深度解析