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因此失效
相关推荐
寻星探路3 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧5 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7256 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎6 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄6 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿6 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds6 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹6 小时前
【Java基础】多态 | 打卡day2
java·开发语言