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源码深度解析