Spring Boot 内嵌 Tomcat 原理:Tomcat ServletWebServerFactory 源码解析

Spring Boot 内嵌 Tomcat 原理:Tomcat ServletWebServerFactory 源码解析

版本说明:Spring Boot 3.2.x + Tomcat 10.1.x | JDK 17+

摘要

Spring Boot 通过"约定优于配置"的理念,极大地简化了 Web 应用的开发。其中最显著的特征之一就是将 Web 容器(如 Tomcat)内嵌到应用中,实现了"java -jar"直接启动的零部署模式。本文将从源码层面深度剖析 Spring Boot 3.x 如何通过 TomcatServletWebServerFactory 实现内嵌 Tomcat 的自动化配置与启动流程,揭示其背后的设计思想与技术细节。


目录

  1. 背景:为什么需要内嵌容器
  2. 核心架构设计
  3. [ServletWebServerFactory 接口体系](#ServletWebServerFactory 接口体系)
  4. [TomcatServletWebServerFactory 源码解析](#TomcatServletWebServerFactory 源码解析)
  5. [内嵌 Tomcat 启动流程](#内嵌 Tomcat 启动流程)
  6. 自定义配置与扩展
  7. 实战案例:构建生产级配置
  8. 总结与最佳实践

1. 背景:为什么需要内嵌容器

1.1 传统部署模式 vs 内嵌容器模式

传统部署模式的问题:

复制代码
graph LR
    A[开发人员] --> B[编写代码]
    B --> C[构建 WAR 包]
    C --> D[安装 Tomcat]
    D --> E[配置 server.xml]
    E --> F[部署 WAR 包]
    F --> G[启动 Tomcat]
    G --> H[应用运行]
    
    style D fill:#ff9999
    style E fill:#ff9999

传统模式下,运维人员需要: - 独立安装和配置 Tomcat 服务器 - 手动管理多个版本的环境兼容性 - 处理容器与应用的版本依赖冲突 - 复杂的部署和回滚流程

Spring Boot 内嵌容器的优势:

复制代码
graph LR
    A[开发人员] --> B[编写代码]
    B --> C[构建 Fat JAR]
    C --> D[java -jar 启动]
    D --> E[应用运行]
    
    style C fill:#99ff99
    style D fill:#99ff99

1.2 技术演进对比

特性 传统外置容器 Spring Boot 内嵌容器
部署方式 WAR 包部署到独立容器 Fat JAR 包含容器
启动速度 慢(需启动容器+应用) 快(容器即应用)
版本管理 容器版本与应用版本分离 版本绑定,避免冲突
配置复杂度 需配置 server.xml、web.xml 自动配置,application.yml
资源占用 多应用共享容器 每应用独立容器
隔离性 应用间可能互相影响 完全隔离
云原生支持 需额外适配 天然支持容器化

2. 核心架构设计

2.1 整体架构

Spring Boot 的内嵌容器设计采用了工厂模式 + 策略模式的组合:

复制代码
graph TB
    A[ServletWebServerFactory] --> B[TomcatServletWebServerFactory]
    A --> C[JettyServletWebServerFactory]
    A --> D[UndertowServletWebServerFactory]
    
    B --> E[TomcatWebServer]
    C --> F[JettyWebServer]
    D --> G[UndertowWebServer]
    
    H[WebServerFactoryCustomizer] --> B
    H --> C
    H --> D
    
    I[ConfigurableServletWebServerFactory] --> B
    
    style A fill:#e1f5ff
    style B fill:#ffe1e1
    style C fill:#e1ffe1
    style D fill:#ffffe1

核心接口与类关系:

java 复制代码
#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}// 最顶层抽象工厂接口`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}public interface ServletWebServerFactory {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    WebServer getWebServer(ServletContextInitializer... initializers);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}// 可配置的工厂接口(继承自上)`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}public interface ConfigurableServletWebServerFactory `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    extends ServletWebServerFactory, WebServerFactoryCustomizer {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    void setPort(int port);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    void setAddress(InetAddress address);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    void setContextPath(String contextPath);`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    // ... 更多配置方法`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}// Tomcat 具体实现`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}public class TomcatServletWebServerFactory `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    extends AbstractServletWebServerFactory `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    implements ConfigurableServletWebServerFactory {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    `
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    @Override`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    public WebServer getWebServer(ServletContextInitializer... initializers) {`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}        // 创建并配置 Tomcat`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}        // ...`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}    }`
`#// 最顶层抽象工厂接口
public interface ServletWebServerFactory {
    WebServer getWebServer(ServletContextInitializer... initializers);
}

// 可配置的工厂接口(继承自上)
public interface ConfigurableServletWebServerFactory 
    extends ServletWebServerFactory, WebServerFactoryCustomizer {
    
    void setPort(int port);
    void setAddress(InetAddress address);
    void setContextPath(String contextPath);
    // ... 更多配置方法
}

// Tomcat 具体实现
public class TomcatServletWebServerFactory 
    extends AbstractServletWebServerFactory 
    implements ConfigurableServletWebServerFactory {
    
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
        // 创建并配置 Tomcat
        // ...
    }
}}

2.2 自动配置机制

Spring Boot 通过 ServletWebServerFactoryAutoConfiguration 自动配置类实现容器的自动装配:

java 复制代码
#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}// Spring Boot 3.x 源码位置`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}@AutoConfiguration`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}@ConditionalOnWebApplication(type = Type.SERVLET)`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}@EnableConfigurationProperties(ServerProperties.class)`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}public class ServletWebServerFactoryAutoConfiguration {`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}    // 自动配置核心逻辑`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}    // 根据 classpath 中的容器类自动选择实现`
`#// Spring Boot 3.x 源码位置
// org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

@AutoConfiguration
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    // 自动配置核心逻辑
    // 根据 classpath 中的容器类自动选择实现
}}

自动配置决策流程:

复制代码
flowchart TD
    A[启动应用] --> B{classpath 存在<br/>Tomcat.class?}
    B -->|是| C[创建 TomcatServletWebServerFactory]
    B -->|否| D{classpath 存在<br/>Jetty.class?}
    D -->|是| E[创建 JettyServletWebServerFactory]
    D -->|否| F{classpath 存在<br/>Undertow.class?}
    F -->|是| G[创建 UndertowServletWebServerFactory]
    F -->|否| H[抛出异常:<br/>缺少 Web 容器]
    
    C --> I[注册为 Spring Bean]
    E --> I
    G --> I
    I --> J[完成自动配置]
    
    style C fill:#ffe1e1
    style E fill:#e1ffe1
    style G fill:#ffffe1
    style H fill:#ff9999

3. ServletWebServerFactory 接口体系

3.1 接口继承关系

复制代码
classDiagram
    class ServletWebServerFactory {
        <<interface>>
        +getWebServer(ServletContextInitializer...) WebServer
    }
    
    class ConfigurableServletWebServerFactory {
        <<interface>>
        +setPort(int port) void
        +setAddress(InetAddress address) void
        +setContextPath(String contextPath) void
    }
    
    class AbstractServletWebServerFactory {
        <<abstract>>
        #port int
        #address InetAddress
        #contextPath String
        #getSession() Session
    }
    
    class TomcatServletWebServerFactory {
        +getWebServer(ServletContextInitializer...) WebServer
        +setTomcatConnectorCustomizers(List) void
    }
    
    ServletWebServerFactory <|.. ConfigurableServletWebServerFactory
    ConfigurableServletWebServerFactory <|.. AbstractServletWebServerFactory
    AbstractServletWebServerFactory <|-- TomcatServletWebServerFactory
    ServletWebServerFactory <|.. TomcatServletWebServerFactory

3.2 核心方法签名

java 复制代码
#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}/**`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
} * ServletWebServerFactory 接口定义`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
} * Spring Boot 3.2.x`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
} */`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}@FunctionalInterface`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}public interface ServletWebServerFactory {`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    /**`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     * 获取 WebServer 实例`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     * @param initializers Servlet 上下文初始化器`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     * @return 配置好的 WebServer`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     */`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    WebServer getWebServer(ServletContextInitializer... initializers);`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}}`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}/**`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
} * WebServer 接口 - 所有内嵌容器的统一抽象`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
} */`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}public interface WebServer {`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    /**`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     * 启动 Web 服务器`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     */`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    void start() throws WebServerException;`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    /**`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     * 停止 Web 服务器`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     */`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    void stop() throws WebServerException;`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    /**`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     * 获取监听端口`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}     */`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}    int getPort();`
`#/**
 * ServletWebServerFactory 接口定义
 * Spring Boot 3.2.x
 */
@FunctionalInterface
public interface ServletWebServerFactory {

    /**
     * 获取 WebServer 实例
     * @param initializers Servlet 上下文初始化器
     * @return 配置好的 WebServer
     */
    WebServer getWebServer(ServletContextInitializer... initializers);
}

/**
 * WebServer 接口 - 所有内嵌容器的统一抽象
 */
public interface WebServer {

    /**
     * 启动 Web 服务器
     */
    void start() throws WebServerException;

    /**
     * 停止 Web 服务器
     */
    void stop() throws WebServerException;

    /**
     * 获取监听端口
     */
    int getPort();
}}

不同容器的实现对比:

容器类型 Factory 实现 WebServer 实现 核心特性
Tomcat TomcatServletWebServerFactory TomcatWebServer 成熟稳定,企业级首选
Jetty JettyServletWebServerFactory JettyWebServer 轻量级,长连接友好
Undertow UndertowServletWebServerFactory UndertowWebServer 高性能,低内存占用

4. TomcatServletWebServerFactory 源码解析

4.1 类结构与核心属性

java 复制代码
#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}/**`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
} * Tomcat ServletWebServerFactory 的完整实现`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
} * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
} * Spring Boot 3.2.x`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
} */`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    // ========== Tomcat 特定配置 ==========`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    `
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    /**`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     * Tomcat 基础目录 - 用于存放临时文件`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     * 默认值:系统临时目录`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     */`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private File baseDirectory;`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    /**`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     * 连接器定制器列表 - 允许自定义 Connector 配置`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     */`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    /**`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     * 上下文定制器列表 - 允许自定义 Context 配置`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     */`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    /**`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     * 协议升级列表(如 HTTP/2)`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     */`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    /**`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     * URI 编码 - 默认 UTF-8`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     */`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private Charset uriEncoding = StandardCharsets.UTF_8;`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    /**`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     * 后台处理器延迟 - 用于优雅关闭`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}     */`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private int backgroundProcessorDelay;`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    `
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    // 其他配置...`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private boolean disableMBeanRegistry = false;`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private List<Valve> engineValves = new ArrayList<>();`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private List<Valve> contextValves = new ArrayList<>();`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    `
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    // ResourceLoader 资源加载器(用于静态资源)`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}    private ResourceLoader resourceLoader;`
`#/**
 * Tomcat ServletWebServerFactory 的完整实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
 * Spring Boot 3.2.x
 */
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableServletWebServerFactory, ResourceLoaderAware {

    private static final Log logger = LogFactory.getLog(TomcatServletWebServerFactory.class);

    // ========== Tomcat 特定配置 ==========
    
    /**
     * Tomcat 基础目录 - 用于存放临时文件
     * 默认值:系统临时目录
     */
    private File baseDirectory;

    /**
     * 连接器定制器列表 - 允许自定义 Connector 配置
     */
    private final List<TomcatConnectorCustomizer> tomcatConnectorCustomizers = new ArrayList<>();

    /**
     * 上下文定制器列表 - 允许自定义 Context 配置
     */
    private final List<TomcatContextCustomizer> tomcatContextCustomizers = new ArrayList<>();

    /**
     * 协议升级列表(如 HTTP/2)
     */
    private final List<UpgradeProtocol> upgradeProtocols = new ArrayList<>();

    /**
     * URI 编码 - 默认 UTF-8
     */
    private Charset uriEncoding = StandardCharsets.UTF_8;

    /**
     * 后台处理器延迟 - 用于优雅关闭
     */
    private int backgroundProcessorDelay;
    
    // 其他配置...
    private boolean disableMBeanRegistry = false;
    private List<Valve> engineValves = new ArrayList<>();
    private List<Valve> contextValves = new ArrayList<>();
    
    // ResourceLoader 资源加载器(用于静态资源)
    private ResourceLoader resourceLoader;
}}

4.2 核心方法:getWebServer()

这是整个工厂模式的核心方法,负责创建和配置 Tomcat 实例:

java 复制代码
#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}/**`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
} * 创建并配置 Tomcat WebServer`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
} * 源码版本:Spring Boot 3.2.x`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
} * `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
} * @param initializers Servlet 上下文初始化器数组`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
} * @return 配置完成的 TomcatWebServer 实例`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
} */`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}@Override`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}public WebServer getWebServer(ServletContextInitializer... initializers) {`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 1: 创建 Tomcat 实例 ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    Tomcat tomcat = new Tomcat();`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 2: 配置基础目录 ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    File baseDir = (this.baseDirectory != null) ? this.baseDirectory `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}            : createTempDir("tomcat");  // 默认创建临时目录`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    tomcat.setBaseDir(baseDir.getAbsolutePath());`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 3: 创建 Connector 连接器 ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // Connector 负责处理 HTTP 请求`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    connector.setThrowOnFailure(true);`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // 应用端口和地址配置`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    if (getAddress() != null) {`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}        connector.setAddress(getAddress());`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    }`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 4: 配置 Engine(引擎)==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // Engine 是 Tomcat 的顶级容器,处理所有请求`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    tomcat.getService().addConnector(connector);`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    customizeConnector(connector);  // 应用连接器定制器`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    tomcat.setConnector(connector);  // 设置默认连接器`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 5: 创建并配置 Context ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // Context 代表一个 Web 应用`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    StandardContext context = new StandardContext();`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    context.setName(getContextPath());  // 设置上下文路径`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    context.setPath(getContextPath());`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // 配置资源加载`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    File docBase = new File(baseDir, "docbase");  // 文档基础目录`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    docBase.mkdirs();`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    context.setDocBase(docBase.getAbsolutePath());`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // 添加生命周期监听器`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 6: 应用自定义配置 ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    customizeContext(context);  // 应用上下文定制器`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 7: 创建 TomcatWebServer ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 8: 注册 ServletContextInitializer ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // 这些初始化器会在 Context 启动时被调用`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    for (ServletContextInitializer initializer : initializers) {`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}        context.addServletContainerInitializer(`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}            new ServletContextInitializerInitializer(initializer), `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}            null`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}        );`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    }`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    // ========== 步骤 9: 启动时自动部署 ==========`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    tomcat.getHost().addChild(context);`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    `
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}    return server;`
`#/**
 * 创建并配置 Tomcat WebServer
 * 源码版本:Spring Boot 3.2.x
 * 
 * @param initializers Servlet 上下文初始化器数组
 * @return 配置完成的 TomcatWebServer 实例
 */
@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
    // ========== 步骤 1: 创建 Tomcat 实例 ==========
    Tomcat tomcat = new Tomcat();
    
    // ========== 步骤 2: 配置基础目录 ==========
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory 
            : createTempDir("tomcat");  // 默认创建临时目录
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    
    // ========== 步骤 3: 创建 Connector 连接器 ==========
    // Connector 负责处理 HTTP 请求
    Connector connector = new Connector(this.protocol);  // 默认 protocol = "org.apache.coyote.http11.Http11NioProtocol"
    connector.setThrowOnFailure(true);
    
    // 应用端口和地址配置
    connector.setPort(getPort());  // 从 AbstractServletWebServerFactory 继承
    if (getAddress() != null) {
        connector.setAddress(getAddress());
    }
    
    // ========== 步骤 4: 配置 Engine(引擎)==========
    // Engine 是 Tomcat 的顶级容器,处理所有请求
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);  // 应用连接器定制器
    tomcat.setConnector(connector);  // 设置默认连接器
    
    // ========== 步骤 5: 创建并配置 Context ==========
    // Context 代表一个 Web 应用
    StandardContext context = new StandardContext();
    context.setName(getContextPath());  // 设置上下文路径
    context.setPath(getContextPath());
    
    // 配置资源加载
    File docBase = new File(baseDir, "docbase");  // 文档基础目录
    docBase.mkdirs();
    context.setDocBase(docBase.getAbsolutePath());
    
    // 添加生命周期监听器
    context.addLifecycleListener(new Tomcat.FixContextListener());  // 修复 Context 生命周期
    
    // ========== 步骤 6: 应用自定义配置 ==========
    customizeContext(context);  // 应用上下文定制器
    
    // ========== 步骤 7: 创建 TomcatWebServer ==========
    TomcatWebServer server = new TomcatWebServer(tomcat, getPort() >= 0);
    
    // ========== 步骤 8: 注册 ServletContextInitializer ==========
    // 这些初始化器会在 Context 启动时被调用
    for (ServletContextInitializer initializer : initializers) {
        context.addServletContainerInitializer(
            new ServletContextInitializerInitializer(initializer), 
            null
        );
    }
    
    // ========== 步骤 9: 启动时自动部署 ==========
    tomcat.getHost().addChild(context);
    
    return server;
}}

4.3 关键辅助方法

4.3.1 临时目录创建
java 复制代码
#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}/**`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
} * 创建临时目录用于存放 Tomcat 运行时文件`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
} * `
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
} * @param prefix 目录前缀`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
} * @return 创建的临时目录`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
} */`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}private File createTempDir(String prefix) {`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}    try {`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        // 在系统临时目录下创建子目录`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        File tempDir = File.createTempFile(prefix + ".", "." + getPort());`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        tempDir.delete();  // 删除临时文件,准备创建同名目录`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        tempDir.mkdirs();  // 创建目录`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        `
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        // 设置 JVM 退出时删除(对于正常关闭)`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        tempDir.deleteOnExit();`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        `
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        return tempDir;`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}    } catch (IOException ex) {`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}    }`
`#/**
 * 创建临时目录用于存放 Tomcat 运行时文件
 * 
 * @param prefix 目录前缀
 * @return 创建的临时目录
 */
private File createTempDir(String prefix) {
    try {
        // 在系统临时目录下创建子目录
        File tempDir = File.createTempFile(prefix + ".", "." + getPort());
        tempDir.delete();  // 删除临时文件,准备创建同名目录
        tempDir.mkdirs();  // 创建目录
        
        // 设置 JVM 退出时删除(对于正常关闭)
        tempDir.deleteOnExit();
        
        return tempDir;
    } catch (IOException ex) {
        throw new IllegalStateException("Failed to create Tomcat temp directory", ex);
    }
}}
4.3.2 连接器定制
java 复制代码
#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}/**`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
} * 应用所有连接器定制器`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
} * `
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
} * @param connector 待定制的连接器`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
} */`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}private void customizeConnector(Connector connector) {`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    // 遍历所有注册的定制器`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}        customizer.customize(connector);  // 委托给定制器处理`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    }`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    `
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    // 配置最大线程数(如果通过 ServerProperties 设置)`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    if (this.maxThreads != null) {`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}        ProtocolHandler protocolHandler = connector.getProtocolHandler();`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}        if (protocolHandler instanceof AbstractProtocol) {`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}        }`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    }`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    `
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    // 配置最小线程数`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    if (this.minSpareThreads != null) {`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}        ProtocolHandler protocolHandler = connector.getProtocolHandler();`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}        if (protocolHandler instanceof AbstractProtocol) {`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}        }`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    }`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    `
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}    // 其他配置...`
`#/**
 * 应用所有连接器定制器
 * 
 * @param connector 待定制的连接器
 */
private void customizeConnector(Connector connector) {
    // 遍历所有注册的定制器
    for (TomcatConnectorCustomizer customizer : this.tomcatConnectorCustomizers) {
        customizer.customize(connector);  // 委托给定制器处理
    }
    
    // 配置最大线程数(如果通过 ServerProperties 设置)
    if (this.maxThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMaxThreads(this.maxThreads);
        }
    }
    
    // 配置最小线程数
    if (this.minSpareThreads != null) {
        ProtocolHandler protocolHandler = connector.getProtocolHandler();
        if (protocolHandler instanceof AbstractProtocol) {
            ((AbstractProtocol<?>) protocolHandler).setMinSpareThreads(this.minSpareThreads);
        }
    }
    
    // 其他配置...
}}
4.3.3 上下文定制
java 复制代码
#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}/**`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
} * 应用所有上下文定制器`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
} * `
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
} * @param context 待定制的上下文`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
} */`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}private void customizeContext(StandardContext context) {`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    // 应用所有上下文定制器`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}        customizer.customize(context);`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    }`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    `
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    // 添加 Valve(阀门 - Tomcat 的拦截机制)`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    for (Valve valve : this.contextValves) {`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}        context.getPipeline().addValve(valve);`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    }`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    `
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    // 配置 Session 管理器`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    if (getSession() != null) {`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}        // 应用自定义 Session 配置`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}        // ...`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    }`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    `
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    // 配置资源处理`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}    // ...`
`#/**
 * 应用所有上下文定制器
 * 
 * @param context 待定制的上下文
 */
private void customizeContext(StandardContext context) {
    // 应用所有上下文定制器
    for (TomcatContextCustomizer customizer : this.tomcatContextCustomizers) {
        customizer.customize(context);
    }
    
    // 添加 Valve(阀门 - Tomcat 的拦截机制)
    for (Valve valve : this.contextValves) {
        context.getPipeline().addValve(valve);
    }
    
    // 配置 Session 管理器
    if (getSession() != null) {
        // 应用自定义 Session 配置
        // ...
    }
    
    // 配置资源处理
    // ...
}}

5. 内嵌 Tomcat 启动流程

5.1 完整启动时序图

复制代码
sequenceDiagram
    participant Main as main()
    participant App as SpringApplication
    participant Context as WebApplicationContext
    participant Factory as TomcatServletWebServerFactory
    participant Server as TomcatWebServer
    participant Tomcat as Tomcat
    
    Main->>App: run()
    App->>Context: refresh()
    Context->>Context: onRefresh()
    
    Note over Context: 创建 WebServer
    
    Context->>Factory: getWebServer(initializers)
    Factory->>Factory: 创建 Tomcat 实例
    Factory->>Factory: 配置 Connector
    Factory->>Factory: 创建 StandardContext
    Factory->>Factory: 应用定制器
    Factory->>Server: new TomcatWebServer(tomcat)
    
    Server-->>Context: 返回 WebServer
    
    Context->>Context: finishRefresh()
    Context->>Server: start()
    
    Server->>Tomcat: start()
    Tomcat->>Tomcat: 初始化 Engine
    Tomcat->>Tomcat: 启动 Connector
    Tomcat->>Tomcat: 启动 Context
    
    Note over Tomcat: Tomcat 开始监听端口
    
    Tomcat-->>Server: 启动完成
    Server-->>Context: WebServer 运行中
    Context-->>App: 上下文刷新完成
    App-->>Main: 应用启动完成

5.2 启动流程详解

5.2.1 触发点:ServletWebServerApplicationContext
java 复制代码
#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}/**`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
} * Servlet Web 应用上下文`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
} * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
} */`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}public class ServletWebServerApplicationContext extends GenericWebApplicationContext`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        implements ConfigurableWebServerApplicationContext {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    @Override`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    protected void onRefresh() {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        super.onRefresh();`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        `
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        // ========== 关键步骤:创建 WebServer ==========`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        try {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            createWebServer();`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        } catch (Throwable ex) {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            throw new ApplicationContextException("Unable to start web server", ex);`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    /**`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}     * 创建 WebServer 的核心逻辑`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}     */`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    private void createWebServer() {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        WebServer webServer = this.webServer;`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        ServletContext servletContext = getServletContext();`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        // 如果 WebServer 尚未创建`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        if (webServer == null && servletContext == null) {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            ServletWebServerFactory factory = getWebServerFactory();`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            // 包括:Servlet、Filter、Listener、错误页面等`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            selfInitialize();`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            // ========== 步骤 3: 通过工厂创建 WebServer ==========`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            this.webServer = factory.getWebServer(getSelfInitializer());`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        } else if (servletContext != null) {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            // 已存在 ServletContext(外部容器场景)`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            try {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}                getSelfInitializer().onStartup(servletContext);`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            } catch (ServletException ex) {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}                throw new ApplicationContextException("Cannot initialize servlet context", ex);`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        // 初始化属性`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        initPropertySources();`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    /**`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}     * 获取 WebServerFactory Bean`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}     */`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        `
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        if (beanNames.length == 0) {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}                "No ServletWebServerFactory bean was found in the context");`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        `
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        if (beanNames.length > 1) {`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}                "Multiple ServletWebServerFactory beans found in the context: " `
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}                + Arrays.toString(beanNames));`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        `
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}    }`
`#/**
 * Servlet Web 应用上下文
 * 源码位置:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext
 */
public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {

    @Override
    protected void onRefresh() {
        super.onRefresh();
        
        // ========== 关键步骤:创建 WebServer ==========
        try {
            createWebServer();
        } catch (Throwable ex) {
            throw new ApplicationContextException("Unable to start web server", ex);
        }
    }

    /**
     * 创建 WebServer 的核心逻辑
     */
    private void createWebServer() {
        WebServer webServer = this.webServer;
        ServletContext servletContext = getServletContext();

        // 如果 WebServer 尚未创建
        if (webServer == null && servletContext == null) {
            // ========== 步骤 1: 获取 ServletWebServerFactory Bean ==========
            ServletWebServerFactory factory = getWebServerFactory();

            // ========== 步骤 2: 获取所有 ServletContextInitializer ==========
            // 包括:Servlet、Filter、Listener、错误页面等
            selfInitialize();

            // ========== 步骤 3: 通过工厂创建 WebServer ==========
            this.webServer = factory.getWebServer(getSelfInitializer());
        } else if (servletContext != null) {
            // 已存在 ServletContext(外部容器场景)
            try {
                getSelfInitializer().onStartup(servletContext);
            } catch (ServletException ex) {
                throw new ApplicationContextException("Cannot initialize servlet context", ex);
            }
        }

        // 初始化属性
        initPropertySources();
    }

    /**
     * 获取 WebServerFactory Bean
     */
    private ServletWebServerFactory getWebServerFactory() throws NoSuchBeanDefinitionException {
        // 从 BeanFactory 中获取 ServletWebServerFactory 类型的 Bean
        // 这里会获取到 TomcatServletWebServerFactory(或 Jetty/Undertow)
        String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);
        
        if (beanNames.length == 0) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "No ServletWebServerFactory bean was found in the context");
        }
        
        if (beanNames.length > 1) {
            throw new NoSuchBeanDefinitionException(ServletWebServerFactory.class,
                "Multiple ServletWebServerFactory beans found in the context: " 
                + Arrays.toString(beanNames));
        }
        
        return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);
    }
}}
5.2.2 TomcatWebServer 的 start() 方法
java 复制代码
#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}/**`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
} * TomcatWebServer 实现`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
} * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
} */`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}public class TomcatWebServer implements WebServer {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    private final Tomcat tomcat;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    private final boolean autoStart;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    private volatile boolean started;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    /**`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}     * 构造函数`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}     * @param tomcat 配置好的 Tomcat 实例`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}     * @param autoStart 是否自动启动`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}     */`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        this.tomcat = tomcat;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        this.autoStart = autoStart;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        if (autoStart) {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // 构造时立即启动`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            start();`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    @Override`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    public synchronized void start() throws WebServerException {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        if (this.started) {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // 已启动,直接返回`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            return;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        try {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // ========== 步骤 1: 启动 Tomcat ==========`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // 这会触发 Engine、Host、Context 等所有容器的启动`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            this.tomcat.start();`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // ========== 步骤 2: 等待启动完成 ==========`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // Tomcat 启动是异步的,需要确保完全启动`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // 主要是确保 Connector 绑定端口成功`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // ...`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // ========== 步骤 3: 获取实际监听端口 ==========`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // 主要用于动态端口(port=0)场景`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            Connector connector = this.tomcat.getConnector();`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            int actualPort = connector.getLocalPort();`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            if (actualPort < 0) {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}                throw new WebServerException("Connector failed to start");`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // ========== 步骤 4: 发布启动事件 ==========`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            publishStartEvent();`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            this.started = true;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            logger.info("Tomcat started on port(s): " + actualPort `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}                + " with context path '" + getContextPath() + "'");`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        } catch (Exception ex) {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            throw new WebServerException("Unable to start embedded Tomcat", ex);`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    /**`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}     * 停止 WebServer`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}     */`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    @Override`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    public synchronized void stop() throws WebServerException {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        if (!this.started) {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            return;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        try {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            // 停止 Tomcat`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            this.tomcat.stop();`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            this.tomcat.destroy();`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            this.started = false;`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            logger.info("Tomcat stopped");`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            `
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        } catch (Exception ex) {`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}            throw new WebServerException("Unable to stop embedded Tomcat", ex);`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}        }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}    }`
`#/**
 * TomcatWebServer 实现
 * 源码位置:org.springframework.boot.web.embedded.tomcat.TomcatWebServer
 */
public class TomcatWebServer implements WebServer {

    private final Tomcat tomcat;
    private final boolean autoStart;
    private volatile boolean started;

    /**
     * 构造函数
     * @param tomcat 配置好的 Tomcat 实例
     * @param autoStart 是否自动启动
     */
    public TomcatWebServer(Tomcat tomcat, boolean autoStart) {
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        
        if (autoStart) {
            // 构造时立即启动
            start();
        }
    }

    @Override
    public synchronized void start() throws WebServerException {
        if (this.started) {
            // 已启动,直接返回
            return;
        }

        try {
            // ========== 步骤 1: 启动 Tomcat ==========
            // 这会触发 Engine、Host、Context 等所有容器的启动
            this.tomcat.start();
            
            // ========== 步骤 2: 等待启动完成 ==========
            // Tomcat 启动是异步的,需要确保完全启动
            // 主要是确保 Connector 绑定端口成功
            // ...

            // ========== 步骤 3: 获取实际监听端口 ==========
            // 主要用于动态端口(port=0)场景
            Connector connector = this.tomcat.getConnector();
            int actualPort = connector.getLocalPort();
            if (actualPort < 0) {
                throw new WebServerException("Connector failed to start");
            }

            // ========== 步骤 4: 发布启动事件 ==========
            publishStartEvent();

            this.started = true;
            
            logger.info("Tomcat started on port(s): " + actualPort 
                + " with context path '" + getContextPath() + "'");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to start embedded Tomcat", ex);
        }
    }

    /**
     * 停止 WebServer
     */
    @Override
    public synchronized void stop() throws WebServerException {
        if (!this.started) {
            return;
        }

        try {
            // 停止 Tomcat
            this.tomcat.stop();
            this.tomcat.destroy();
            
            this.started = false;
            
            logger.info("Tomcat stopped");
            
        } catch (Exception ex) {
            throw new WebServerException("Unable to stop embedded Tomcat", ex);
        }
    }
}}

5.3 启动流程关键节点

复制代码
flowchart TD
    A[SpringApplication.run] --> B[ApplicationContext.refresh]
    B --> C[onRefresh 触发]
    C --> D[createWebServer]
    
    D --> E[获取 ServletWebServerFactory Bean]
    E --> F{是否存在?}
    F -->|否| G[抛出异常]
    F -->|是| H[获取 ServletContextInitializers]
    
    H --> I[FilterRegistrationBean]
    H --> J[ServletRegistrationBean]
    H --> K[其他Initializer]
    
    I --> L[factory.getWebServer]
    J --> L
    K --> L
    
    L --> M[创建 Tomcat 实例]
    M --> N[配置 Connector]
    N --> O[创建 StandardContext]
    O --> P[应用定制器]
    P --> Q[返回 TomcatWebServer]
    
    Q --> R[finishRefresh]
    R --> S[webServer.start]
    S --> T[Tomcat.start]
    T --> U[Engine 启动]
    U --> V[Host 启动]
    V --> W[Context 启动]
    W --> X[Connector 启动]
    X --> Y[开始监听端口]
    
    style G fill:#ff9999
    style Y fill:#99ff99

6. 自定义配置与扩展

6.1 配置方式对比

配置方式 适用场景 优先级 示例
application.yml 常规配置(端口、线程等) server.port=8080
WebServerFactoryCustomizer 编程式定制 实现 Bean
TomcatConnectorCustomizer 连接器级定制 协议、SSL
TomcatContextCustomizer 上下文级定制 Valve、资源

6.2 方式一:application.yml 配置

复制代码
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false# application.yml
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: falseserver:
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false  # 基础配置
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false  port: 8080
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false  servlet:
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    context-path: /app
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    encoding:
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false      charset: UTF-8
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false      enabled: true
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false      force: true
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false  
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false  # Tomcat 特定配置
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false  tomcat:
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    # 线程池配置
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    threads:
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false      max: 200          # 最大工作线程数
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false      min-spare: 10     # 最小空闲线程数
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    # 连接配置
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    max-connections: 8192    # 最大连接数
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    accept-count: 100        # 等待队列长度
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    connection-timeout: 20000  # 连接超时(毫秒)
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    # 其他配置
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    uri-encoding: UTF-8
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    max-http-form-post-size: 2MB
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    redirect-context-root: true
# application.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /app
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  
  # Tomcat 特定配置
  tomcat:
    # 线程池配置
    threads:
      max: 200          # 最大工作线程数
      min-spare: 10     # 最小空闲线程数
    
    # 连接配置
    max-connections: 8192    # 最大连接数
    accept-count: 100        # 等待队列长度
    connection-timeout: 20000  # 连接超时(毫秒)
    
    # 其他配置
    uri-encoding: UTF-8
    max-http-form-post-size: 2MB
    redirect-context-root: true
    use-relative-redirects: false    use-relative-redirects: false

6.3 方式二:WebServerFactoryCustomizer Bean

java 复制代码
#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}/**`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
} * WebServerFactoryCustomizer 示例`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
} * 这是 Spring Boot 推荐的编程式定制方式`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
} */`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}@Configuration`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}public class TomcatCustomizationConfiguration {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}    /**`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}     * 定制 TomcatServletWebServerFactory`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}     */`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}    @Bean`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}            @Override`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}            public void customize(TomcatServletWebServerFactory factory) {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                // ========== 基础配置 ==========`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                factory.setPort(8080);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                factory.setContextPath("/myapp");`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                factory.setBaseDirectory(new File("/tmp/tomcat"));`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                // ========== 连接器定制 ==========`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                    @Override`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                    public void customize(Connector connector) {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 配置连接超时`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setConnectionTimeout(30000);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 配置最大线程数`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setMaxThreads(200);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setMinSpareThreads(20);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 配置最大连接数`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setMaxConnections(1000);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 启用压缩`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setCompression("on");`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 配置 Keep-Alive`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setKeepAliveTimeout(60000);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        protocol.setMaxKeepAliveRequests(100);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                    }`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                });`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                // ========== 上下文定制 ==========`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                factory.addContextCustomizers(new TomcatContextCustomizer() {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                    @Override`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                    public void customize(Context context) {`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 添加 Valve(类似 Filter,但更底层)`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        context.addValve(new AccessLogValve());`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 配置 Session 管理`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        StandardManager manager = new StandardManager();`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        manager.setSessionTimeout(30);  // 30 分钟超时`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        context.setManager(manager);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        // 配置资源`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        StandardRoot resources = new StandardRoot(context);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        resources.setCachingAllowed(true);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        resources.setCacheMaxSize(10240 * 1024);  // 10MB`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                        context.setResources(resources);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                    }`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                });`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                // ========== URI 编码 ==========`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                factory.setUriEncoding(StandardCharsets.UTF_8);`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                `
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                // ========== 后台处理器延迟 ==========`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}                factory.setBackgroundProcessorDelay(30);  // 30 秒`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}            }`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}        };`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}    }`
`#/**
 * WebServerFactoryCustomizer 示例
 * 这是 Spring Boot 推荐的编程式定制方式
 */
@Configuration
public class TomcatCustomizationConfiguration {

    /**
     * 定制 TomcatServletWebServerFactory
     */
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
        return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
            @Override
            public void customize(TomcatServletWebServerFactory factory) {
                
                // ========== 基础配置 ==========
                factory.setPort(8080);
                factory.setContextPath("/myapp");
                factory.setBaseDirectory(new File("/tmp/tomcat"));
                
                // ========== 连接器定制 ==========
                factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                        
                        // 配置连接超时
                        protocol.setConnectionTimeout(30000);
                        
                        // 配置最大线程数
                        protocol.setMaxThreads(200);
                        protocol.setMinSpareThreads(20);
                        
                        // 配置最大连接数
                        protocol.setMaxConnections(1000);
                        
                        // 启用压缩
                        protocol.setCompression("on");
                        protocol.setCompressionMinSize(1024);  // 1KB 以上压缩
                        
                        // 配置 Keep-Alive
                        protocol.setKeepAliveTimeout(60000);
                        protocol.setMaxKeepAliveRequests(100);
                    }
                });

                // ========== 上下文定制 ==========
                factory.addContextCustomizers(new TomcatContextCustomizer() {
                    @Override
                    public void customize(Context context) {
                        // 添加 Valve(类似 Filter,但更底层)
                        context.addValve(new AccessLogValve());
                        
                        // 配置 Session 管理
                        StandardManager manager = new StandardManager();
                        manager.setSessionTimeout(30);  // 30 分钟超时
                        context.setManager(manager);
                        
                        // 配置资源
                        StandardRoot resources = new StandardRoot(context);
                        resources.setCachingAllowed(true);
                        resources.setCacheMaxSize(10240 * 1024);  // 10MB
                        context.setResources(resources);
                    }
                });

                // ========== URI 编码 ==========
                factory.setUriEncoding(StandardCharsets.UTF_8);
                
                // ========== 后台处理器延迟 ==========
                factory.setBackgroundProcessorDelay(30);  // 30 秒
            }
        };
    }
}}

6.4 方式三:直接定制器 Bean(推荐)

java 复制代码
#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}/**`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * Spring Boot 3.x 推荐的简化方式`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 直接注册 Customizer Bean,无需嵌套`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} */`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}@Configuration`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}public class TomcatCustomizers {`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    /**`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     * 连接器定制器`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     */`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    @Bean`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    public TomcatConnectorCustomizer connectionCustomizer() {`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        return connector -> {`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 性能调优 ==========`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setConnectionTimeout(30000);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMaxThreads(200);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMinSpareThreads(10);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMaxConnections(8192);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setAcceptCount(100);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 优化参数 ==========`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setKeepAliveTimeout(60000);    // 60 秒`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMaxKeepAliveRequests(100);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 压缩配置 ==========`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setCompression("on");`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        };`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    }`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    /**`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     * 上下文定制器`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     */`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    @Bean`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    public TomcatContextCustomizer contextCustomizer() {`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        return context -> {`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 添加访问日志 Valve ==========`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            AccessLogValve accessLogValve = new AccessLogValve();`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setDirectory("logs");`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setPrefix("access_log");`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setSuffix(".txt");`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setRotatable(true);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            context.getPipeline().addValve(accessLogValve);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 添加错误报告 Valve ==========`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            ErrorReportValve errorReportValve = new ErrorReportValve();`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            context.getPipeline().addValve(errorReportValve);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== Session 配置 ==========`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            StandardManager manager = new StandardManager();`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            manager.setSessionTimeout(30);  // 30 分钟`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            context.setManager(manager);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 资源缓存配置 ==========`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            WebResourceRoot resources = context.getResources();`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            if (resources instanceof StandardRoot) {`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                StandardRoot standardRoot = (StandardRoot) resources;`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                standardRoot.setCachingAllowed(true);`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            }`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        };`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    }`
`#/**
 * Spring Boot 3.x 推荐的简化方式
 * 直接注册 Customizer Bean,无需嵌套
 */
@Configuration
public class TomcatCustomizers {

    /**
     * 连接器定制器
     */
    @Bean
    public TomcatConnectorCustomizer connectionCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 性能调优 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(10);
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(100);
            
            // ========== 优化参数 ==========
            protocol.setTcpNoDelay(true);           // 禁用 Nagle 算法
            protocol.setKeepAliveTimeout(60000);    // 60 秒
            protocol.setMaxKeepAliveRequests(100);
            
            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);   // 2KB 以上压缩
            protocol.setCompressableMimeType("text/html,text/xml,text/plain,text/css,application/json,application/javascript");
        };
    }

    /**
     * 上下文定制器
     */
    @Bean
    public TomcatContextCustomizer contextCustomizer() {
        return context -> {
            // ========== 添加访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern("%h %l %u %t \"%r\" %s %b %D");
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log");
            accessLogValve.setSuffix(".txt");
            accessLogValve.setRotatable(true);
            context.getPipeline().addValve(accessLogValve);
            
            // ========== 添加错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);  // 不显示详细错误信息(安全)
            context.getPipeline().addValve(errorReportValve);
            
            // ========== Session 配置 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            
            context.setManager(manager);
            
            // ========== 资源缓存配置 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}}

6.5 定制器执行顺序

复制代码
sequenceDiagram
    participant Factory as TomcatServletWebServerFactory
    participant Customizer1 as WebServerFactoryCustomizer
    participant Connector as ConnectorCustomizer
    participant Context as ContextCustomizer
    
    Factory->>Customizer1: customize(factory)
    
    Note over Customizer1: 1. 配置基础属性(端口、路径等)
    
    Customizer1->>Factory: addConnectorCustomizers()
    Customizer1->>Factory: addContextCustomizers()
    
    Factory->>Factory: getWebServer(initializers)
    Factory->>Factory: 创建 Connector
    Factory->>Connector: customize(connector)
    
    Note over Connector: 2. 配置连接器(线程、超时等)
    
    Factory->>Factory: 创建 Context
    Factory->>Context: customize(context)
    
    Note over Context: 3. 配置上下文(Valve、Session等)
    
    Factory->>Factory: 创建 TomcatWebServer

7. 实战案例:构建生产级配置

7.1 完整的生产级配置类

java 复制代码
#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}package com.example.demo.config;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.apache.catalina.Context;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.apache.catalina.Engine;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.apache.catalina.Valve;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.apache.catalina.connector.Connector;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.apache.catalina.valves.AccessLogValve;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.apache.catalina.valves.ErrorReportValve;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.apache.coyote.http11.Http11NioProtocol;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.springframework.boot.web.server.WebServerFactoryCustomizer;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.springframework.context.annotation.Bean;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.springframework.context.annotation.Configuration;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import org.springframework.core.Ordered;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import java.io.File;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}import java.nio.charset.StandardCharsets;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}/**`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 生产级 Tomcat 配置`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * `
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 功能点:`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 1. 性能调优(线程池、连接池、Keep-Alive)`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 2. 压缩优化`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 3. 访问日志`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 4. Session 管理`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 5. 安全加固`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} * 6. 资源缓存`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
} */`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}@Configuration`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}public class ProductionTomcatConfiguration {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    /**`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     * 顶级定制器 - 配置基础属性`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     */`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    @Bean`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        return factory -> {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 基础连接配置 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            factory.setPort(8080);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 上下文路径 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            factory.setContextPath("/api");`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== Tomcat 基础目录 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            File baseDir = new File("/var/opt/tomcat");`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            if (!baseDir.exists()) {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                baseDir.mkdirs();`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            }`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            factory.setBaseDirectory(baseDir);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            `
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== URI 编码 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            factory.setUriEncoding(StandardCharsets.UTF_8);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        };`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    }`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    /**`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     * 连接器性能定制器`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     */`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    @Bean`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    public TomcatConnectorCustomizer performanceConnectorCustomizer() {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        return connector -> {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 线程池配置 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMaxThreads(200);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMinSpareThreads(20);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 连接池配置 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMaxConnections(8192);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setAcceptCount(200);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 超时配置 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setConnectionTimeout(30000);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setKeepAliveTimeout(60000);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setMaxKeepAliveRequests(100);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== TCP 参数优化 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setTcpNoDelay(true);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            connector.setEnableLookups(false);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 压缩配置 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setCompression("on");`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setCompressionMinSize(2048);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            protocol.setCompressableMimeType(`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                "text/html,text/xml,text/plain,text/css," +`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                "text/javascript,application/javascript,application/json"`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            );`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        };`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    }`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    /**`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     * 上下文功能定制器`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}     */`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    @Bean`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    public TomcatContextCustomizer productionContextCustomizer() {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        return context -> {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 1. 访问日志 Valve ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            AccessLogValve accessLogValve = new AccessLogValve();`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setPattern(`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            );`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setDirectory("logs");`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setPrefix("access_log.");`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setSuffix(".log");`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            accessLogValve.setRotate(true);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            context.getPipeline().addValve(accessLogValve);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 2. 安全错误报告 Valve ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            ErrorReportValve errorReportValve = new ErrorReportValve();`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            errorReportValve.setShowReport(false);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            errorReportValve.setShowServerInfo(false);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            context.getPipeline().addValve(errorReportValve);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 3. Session 管理 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            StandardManager manager = new StandardManager();`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            manager.setSessionTimeout(30);  // 30 分钟`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            context.setManager(manager);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            // ========== 4. 静态资源缓存 ==========`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            WebResourceRoot resources = context.getResources();`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            if (resources instanceof StandardRoot) {`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                StandardRoot standardRoot = (StandardRoot) resources;`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                standardRoot.setCachingAllowed(true);`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}            }`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}        };`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}    }`
`#package com.example.demo.config;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Valve;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 生产级 Tomcat 配置
 * 
 * 功能点:
 * 1. 性能调优(线程池、连接池、Keep-Alive)
 * 2. 压缩优化
 * 3. 访问日志
 * 4. Session 管理
 * 5. 安全加固
 * 6. 资源缓存
 */
@Configuration
public class ProductionTomcatConfiguration {

    /**
     * 顶级定制器 - 配置基础属性
     * 优先级:最高(Ordered.HIGHEST_PRECEDENCE)
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> baseCustomizer() {
        return factory -> {
            // ========== 基础连接配置 ==========
            factory.setPort(8080);
            
            // ========== 上下文路径 ==========
            factory.setContextPath("/api");
            
            // ========== Tomcat 基础目录 ==========
            File baseDir = new File("/var/opt/tomcat");
            if (!baseDir.exists()) {
                baseDir.mkdirs();
            }
            factory.setBaseDirectory(baseDir);
            
            // ========== URI 编码 ==========
            factory.setUriEncoding(StandardCharsets.UTF_8);
        };
    }

    /**
     * 连接器性能定制器
     */
    @Bean
    public TomcatConnectorCustomizer performanceConnectorCustomizer() {
        return connector -> {
            Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

            // ========== 线程池配置 ==========
            protocol.setMaxThreads(200);
            protocol.setMinSpareThreads(20);

            // ========== 连接池配置 ==========
            protocol.setMaxConnections(8192);
            protocol.setAcceptCount(200);

            // ========== 超时配置 ==========
            protocol.setConnectionTimeout(30000);
            protocol.setKeepAliveTimeout(60000);
            protocol.setMaxKeepAliveRequests(100);

            // ========== TCP 参数优化 ==========
            protocol.setTcpNoDelay(true);
            connector.setEnableLookups(false);

            // ========== 压缩配置 ==========
            protocol.setCompression("on");
            protocol.setCompressionMinSize(2048);
            protocol.setCompressableMimeType(
                "text/html,text/xml,text/plain,text/css," +
                "text/javascript,application/javascript,application/json"
            );
        };
    }

    /**
     * 上下文功能定制器
     */
    @Bean
    public TomcatContextCustomizer productionContextCustomizer() {
        return context -> {
            // ========== 1. 访问日志 Valve ==========
            AccessLogValve accessLogValve = new AccessLogValve();
            accessLogValve.setPattern(
                "%h %l %u %t \"%r\" %s %b %D \"%{User-Agent}i\" \"%{Referer}i\""
            );
            accessLogValve.setDirectory("logs");
            accessLogValve.setPrefix("access_log.");
            accessLogValve.setSuffix(".log");
            accessLogValve.setRotate(true);
            context.getPipeline().addValve(accessLogValve);

            // ========== 2. 安全错误报告 Valve ==========
            ErrorReportValve errorReportValve = new ErrorReportValve();
            errorReportValve.setShowReport(false);
            errorReportValve.setShowServerInfo(false);
            context.getPipeline().addValve(errorReportValve);

            // ========== 3. Session 管理 ==========
            StandardManager manager = new StandardManager();
            manager.setSessionTimeout(30);  // 30 分钟
            context.setManager(manager);

            // ========== 4. 静态资源缓存 ==========
            WebResourceRoot resources = context.getResources();
            if (resources instanceof StandardRoot) {
                StandardRoot standardRoot = (StandardRoot) resources;
                standardRoot.setCachingAllowed(true);
                standardRoot.setCacheMaxSize(10 * 1024 * 1024);  // 10MB
                standardRoot.setCacheObjectMaxSize(512 * 1024);   // 512KB
            }
        };
    }
}}

7.2 配置参数对照表

配置项 默认值 推荐值(生产) 说明
maxThreads 200 200-500 最大工作线程数
minSpareThreads 10 20-50 最小空闲线程数
maxConnections 8192 8192-10000 最大连接数
acceptCount 100 200-500 等待队列长度
connectionTimeout 20000ms 30000ms 连接超时
keepAliveTimeout 60000ms 60000ms Keep-Alive 超时
maxKeepAliveRequests 100 100 单连接最大请求数
compression off on Gzip 压缩
compressionMinSize 2048 2048 最小压缩阈值

7.3 压测与调优建议

复制代码
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/# ========== Apache Bench 压测示例 ==========
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/# 1. 基础压测(1000 请求,100 并发)
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/ab -n 1000 -c 100 http://localhost:8080/api/health
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/# 2. 持续压测(10000 请求,200 并发)
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/ab -n 10000 -c 200 http://localhost:8080/api/users
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/# 3. POST 请求压测
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/# ========== JVM 参数建议 ==========
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/java -jar app.jar \
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/  -Xms4g \
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/  -Xmx4g \
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/  -XX:+UseG1GC \
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/  -XX:MaxGCPauseMillis=200 \
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/  -XX:+HeapDumpOnOutOfMemoryError \
# ========== Apache Bench 压测示例 ==========

# 1. 基础压测(1000 请求,100 并发)
ab -n 1000 -c 100 http://localhost:8080/api/health

# 2. 持续压测(10000 请求,200 并发)
ab -n 10000 -c 200 http://localhost:8080/api/users

# 3. POST 请求压测
ab -n 1000 -c 50 -p data.json -T application/json http://localhost:8080/api/users

# ========== JVM 参数建议 ==========

java -jar app.jar \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/app/  -XX:HeapDumpPath=/var/log/app/

8. 总结与最佳实践

8.1 核心要点回顾

复制代码
mindmap
  root((Spring Boot<br/>内嵌 Tomcat))
    核心设计
      工厂模式
        ServletWebServerFactory
        TomcatServletWebServerFactory
      策略模式
        多容器支持
        自动配置决策
    启动流程
      ApplicationContext.refresh
        onRefresh 触发
        createWebServer
      TomcatWebServer.start
        Tomcat.start
        Engine/Host/Context/Connector
    配置体系
      application.yml
        基础配置
        ServerProperties
      WebServerFactoryCustomizer
        编程式定制
        灵活扩展
      TomcatConnectorCustomizer
        连接器配置
        性能调优
      TomcatContextCustomizer
        上下文配置
        Valve/Session

8.2 最佳实践清单

✅ 配置层面
项目 建议 原因
端口配置 不要使用 80/443(需 root 权限) 安全性
线程池 maxThreads=200-500 避免上下文切换开销
Keep-Alive enable + timeout=60s 减少 TCP 握手开销
压缩 enable + minSize=2KB 节省带宽,提升响应速度
Session timeout=30min + HttpOnly 平衡用户体验与安全性
日志 AccessLogValve + 日期格式 便于问题排查与审计
✅ 性能优化
java 复制代码
#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)// ========== 性能优化 Top 5 ==========`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)1. 启用 Gzip 压缩(节省带宽 60-80%)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)2. 调整线程池大小(根据压测结果)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)3. 启用 Keep-Alive(减少 TCP 握手)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)4. 静态资源缓存(减少 IO)`
`#// ========== 性能优化 Top 5 ==========
1. 启用 Gzip 压缩(节省带宽 60-80%)
2. 调整线程池大小(根据压测结果)
3. 启用 Keep-Alive(减少 TCP 握手)
4. 静态资源缓存(减少 IO)
5. 禁用 DNS 反向查询(enableLookups=false)5. 禁用 DNS 反向查询(enableLookups=false)
✅ 安全加固
java 复制代码
#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)// ========== 安全加固 Top 5 ==========`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)1. 禁用 TRACE 方法(防止 XST 攻击)`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)2. 隐藏服务器版本信息(ErrorReportValve)`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)3. Session Cookie 设置 HttpOnly + Secure`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)4. 限制请求大小(maxPostSize)`
`#// ========== 安全加固 Top 5 ==========
1. 禁用 TRACE 方法(防止 XST 攻击)
2. 隐藏服务器版本信息(ErrorReportValve)
3. Session Cookie 设置 HttpOnly + Secure
4. 限制请求大小(maxPostSize)
5. 启用 HTTPS(生产环境必须)5. 启用 HTTPS(生产环境必须)
✅ 监控与诊断
java 复制代码
#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)// ========== 监控指标 ==========`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)1. 请求 QPS(每秒查询数)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)2. 响应时间(P50/P95/P99)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)3. 错误率(4xx/5xx)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)4. 线程池使用率`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)5. GC 暂停时间`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)// ========== 诊断工具 ==========`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- JConsole / JVisualVM(本地)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Prometheus + Grafana(生产环境)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Arthas(在线诊断)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Thread Dump(死锁分析)`
`#// ========== 监控指标 ==========
1. 请求 QPS(每秒查询数)
2. 响应时间(P50/P95/P99)
3. 错误率(4xx/5xx)
4. 线程池使用率
5. GC 暂停时间

// ========== 诊断工具 ==========
- JConsole / JVisualVM(本地)
- Prometheus + Grafana(生产环境)
- Arthas(在线诊断)
- Thread Dump(死锁分析)
- Heap Dump(内存泄漏)- Heap Dump(内存泄漏)

8.3 常见问题排查

问题现象 可能原因 排查方法
端口占用 8080 被其他进程占用 netstat -tunlp | grep 8080
OOM 内存泄漏或堆内存不足 Heap Dump 分析
CPU 100% 死循环或 GC 频繁 Thread Dump + GC 日志
响应慢 数据库/网络瓶颈 慢查询日志 + 压测
连接数满 maxConnections 太小 调整连接池大小

8.4 进阶阅读


附录:完整配置示例

application.yml 完整版

复制代码
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd# application-production.yml
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-ddserver:
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd  # 基础配置
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd  port: 8080
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd  servlet:
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    context-path: /api
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    encoding:
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      charset: UTF-8
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      enabled: true
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      force: true
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      force-request: true
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      force-response: true
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd  
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd  # Tomcat 配置
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd  tomcat:
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    # 基础目录
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    basedir: /var/opt/tomcat
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    # 线程池
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    threads:
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      max: 200
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      min-spare: 20
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    # 连接配置
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    max-connections: 8192
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    accept-count: 200
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    connection-timeout: 30s
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    # URI 编码
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    uri-encoding: UTF-8
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    # 最大 POST 大小
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    max-http-form-post-size: 10MB
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    # 访问日志
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd    accesslog:
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      enabled: true
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      directory: logs
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      prefix: access_log.
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      suffix: .log
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      rotate: true
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      rename-on-rotate: true
# application-production.yml
server:
  # 基础配置
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  
  # Tomcat 配置
  tomcat:
    # 基础目录
    basedir: /var/opt/tomcat
    
    # 线程池
    threads:
      max: 200
      min-spare: 20
      
    # 连接配置
    max-connections: 8192
    accept-count: 200
    connection-timeout: 30s
    
    # URI 编码
    uri-encoding: UTF-8
    
    # 最大 POST 大小
    max-http-form-post-size: 10MB
    
    # 访问日志
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D "%{User-Agent}i"'
      directory: logs
      prefix: access_log.
      suffix: .log
      rotate: true
      rename-on-rotate: true
      file-date-format: yyyy-MM-dd      file-date-format: yyyy-MM-dd

文末总结:

Spring Boot 的内嵌 Tomcat 机制通过优雅的工厂模式和自动配置,极大简化了 Web 应用的部署。理解其背后的 ServletWebServerFactory 体系,不仅能帮助我们更好地排查问题,更能根据业务需求进行精准的性能调优和安全加固。本文从源码层面剖析了整个启动流程,并提供了完整的生产级配置示例,希望能为您的 Spring Boot 应用提供有力支撑。

相关文章推荐:


标签: Spring Boot Tomcat 内嵌容器 WebServerFactory 源码解析 性能调优

相关推荐
dd向上2 小时前
【计算机毕设/课设】在职全栈开发工程师接单:Java(SpringBoot+Vue)/小程序/C++(Qt/MFC) 定制与辅导
java·spring boot·课程设计
曹牧3 小时前
Tomcat中间件能够提供的能力
java·中间件·tomcat
码农很忙3 小时前
Spring Boot 3.x 整合 Redis 实现高性能缓存的完整指南
java·spring boot·redis
fengtangjiang3 小时前
tomcat和国产web中间件区别和联系
前端·中间件·tomcat
DROm RAPS3 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
快乐柠檬不快乐3 小时前
基于Java+SpringBoot+SSM攻防靶场实验室平台
java·开发语言·spring boot
爱丽_3 小时前
Spring Boot 启动链路:自动装配、条件注解与排错方法论
java·spring boot·后端
霸道流氓气质3 小时前
Springboot集成Kafka入门流程及示例代码
spring boot·kafka
weixin_425023003 小时前
Spring Boot 2.7+JDK8+WebSocket对接阿里云百炼Qwen3.5-Plus 实现流式对话+思考过程实时展示
java·spring boot·websocket·ai编程