SpringBoot-Web开发之嵌入式容器

切换嵌入式Servlet容器

  1. 默认支持的web服务器
  • Tomcat
  • Jetty
  • Undertow
  1. 切换服务器
  • 排除默认tomcat
XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 引入其他服务器
XML 复制代码
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

Servlet容器配置原理

  1. SpringBoot应用启动时,发现当前是Web应用
  • spring-boot-starter-web默认导入了tomcat
  1. web应用会创建一个web版的ioc容器
  • 启动的时候,ServletWebServerApplicationContext 寻找 ServletWebServerFactory
  • 也就是Servlet 的web服务器工厂 找 Servlet 的web服务器
  1. web服务器的自动配置类ServletWebServerFactoryAutoConfiguration
  • 导入了ServletWebServerFactoryConfiguration(配置类)
  1. ServletWebServerFactoryConfiguration配置类
  • 动态判断系统中到底导入了那个Web服务器的包
  • web-starter默认是导入tomcat包,容器中就有 TomcatServletWebServerFactory
  1. 获取到唯一确定的服务器factory,调用getWebServer()
  • 创建出Tomcat服务器
  • TomcatWebServer 的构造器进行初始化initialize()
  • 手动调用this.tomcat.start(),启动服务器

修改Servlet容器

  1. 配置文件中修改默认配置
  • server.xxx
  • 配置文件的值和ServletWebServerFactory是绑定的
  1. 自定义 ConfigurableServletWebServerFactory
  • 一般直接使用配置文件配置即可
java 复制代码
@Component
public class CustomizationBean implements 
        WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

    @Override
    public void customize(ConfigurableServletWebServerFactory server) {
        server.setPort(9000);
    }

}

定制化的常见方式

  1. 修改配置文件

  2. xxxxxCustomizer

  3. 编写自定义的配置类 xxxConfiguration

  4. Web应用编写一个配置类实现 WebMvcConfigurer

  • 如果配置类加@EnableWebMvc,全面接管SpringMVC,所有规则都需要自己重新配置
  • 慎用注解@EnableWebMvc
java 复制代码
/**
 * @EnableWebMvc:全面接管
 *      1、静态资源?视图解析器?欢迎页.....全部失效
 */
@EnableWebMvc
@Configuration
public class AdminWebConfig implements WebMvcConfigurer{

    /**
     * 定义静态资源行为
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * 访问  /aa/** 所有请求都去 classpath:/static/ 下面进行匹配
         */
        registry.addResourceHandler("/aa/**")
                .addResourceLocations("classpath:/static/");
    }
}

@EnableWebMvc原理

  • 一旦使用 @EnableWebMvc 、会 @Import(DelegatingWebMvcConfiguration.class)
  • DelegatingWebMvcConfiguration 的作用,只保证SpringMVC最基本的使用,然后搭配系统中所有的 WebMvcConfigurer
  • WebMvcAutoConfiguration因此失效
相关推荐
极客先躯2 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188962 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java
我命由我123452 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
aXin_ya2 小时前
微服务第八天 Sentinel 四种分布式事务模式
java·数据库·微服务
Halo_tjn2 小时前
Java Set集合相关知识点
java·开发语言·算法
Linsk2 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
许彰午2 小时前
我手写了一个 Java 内存数据库(二):B+ 树的插入与分裂
java·开发语言·面试
zhouwy1132 小时前
Java 快速入门笔记:从基础语法到 Spring Boot 实战
java
极创信息3 小时前
信创产品认证怎么做?信创产品测试认证的主要流程
java·大数据·数据库·金融·软件工程
SamDeepThinking3 小时前
并发量就算只有2,该上锁还得上呀
java·后端·架构