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因此失效
相关推荐
ywf121516 小时前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
大阿明1 天前
Spring Boot(快速上手)
java·spring boot·后端
哆啦A梦15881 天前
Springboot整合MyBatis实现数据库操作
数据库·spring boot·mybatis
bearpping1 天前
Java进阶,时间与日期,包装类,正则表达式
java
邵奈一1 天前
清明纪念·时光信笺——项目运行指南
java·实战·项目
sunwenjian8861 天前
Java进阶——IO 流
java·开发语言·python
sinat_255487811 天前
读者、作家 Java集合学习笔记
java·笔记·学习
皮皮林5511 天前
如何画出一张优秀的架构图?(老鸟必备)
java
百锦再1 天前
Java 并发编程进阶,从线程池、锁、AQS 到并发容器与性能调优全解析
java·开发语言·jvm·spring·kafka·tomcat·maven
森林猿1 天前
java-modbus-读取-modbus4j
java·网络·python