Tomcat是一个轻量级的web服务器,他可以来运行web程序。
与servlet是什么关系?
tomcat同时也是一个servlet容器(遵守servlet规范),所以他可以来运行servlet程序。servlet程序是web程序的一个组件,用来处理客户端的请求并生成响应。一个web程序里面可以有多个servlet小程序。
tomcat的自定义类加载器:
为什么tomcat需要自定义类加载器呢?
Tomcat实现自定义类加载器的原因主要包括以下几点:
1. **应用隔离**:Tomcat作为一个Web容器,能够同时部署和运行多个Web应用程序。每个应用可能依赖不同的库版本或者包含同名类,为了确保每个应用的类库相互独立,避免类冲突,Tomcat为每个Web应用提供了一个独立的类加载器实例,即`WebAppClassLoader`。这样,即使不同应用中存在相同的类名,它们也是被各自的应用类加载器加载,互不影响。
2. **热部署与热替换**:自定义类加载器支持热部署和类的热替换功能。当Web应用发生变化时,不需要重启整个Tomcat服务器,只需重新加载对应的Web应用即可。通过创建新的类加载器来加载更新后的类,旧的类加载器和旧的类可以被垃圾回收,实现类的平滑升级。
3. **遵循Servlet规范**:Servlet规范要求Web容器必须为每个Web应用提供独立的类加载器上下文,以满足应用的独立性和安全性需求。Tomcat的自定义类加载器体系结构正是对这一规范的实现。
4. **层次化加载机制**:Tomcat的类加载器体系采用分层设计,包括但不限于以下几个关键的类加载器:Bootstrap ClassLoader、Common/Shared ClassLoader、Catalina ClassLoader、WebAppClassLoader。这种分层设计允许在不同的应用程序之间实现类加载的隔离,同时也允许共享一些公共类库。
5. **隔离同类库不同版本**:一个Tomcat可以部署多个Web应用程序,那么多个应用程序可能依赖同一个类库的不同版本,应该隔离同一个类库的不同版本。Tomcat通过为每个应用分配一个独立的WebAppClassLoader类加载器,打破了JDK的双亲委派模型,用来隔离应用之间的jar包问题。
6. **共享同类库同版本**:多个应用程序如果依赖相同类库的相同版本,应该共享同类库的同版本,避免重复的类库被加载进JVM。Tomcat通过自定义的ShareClassLoader共享类加载器实现让多个应用程序的相同类库的相同版本进行共享。
7. **隔离Tomcat与应用程序的类库**:Tomcat也有自己依赖的类库,不能与应用程序的类库冲突,应该让容器的类库和程序的类库隔离开来。
通过这些自定义类加载器,Tomcat能够提供灵活、高效且安全的类管理机制,满足Web应用的多样化需求。
默认这里打破了双亲委派机制,应用中的类如果没有加载过。会先从当前类加载器加载,然后再交给父类加载器通过双亲委派机制加载。