b Spring MVC 如何内嵌 tomcat & 流程分析

文章目录

  • 一、基本机制
    • 1.1 starter 的结构
    • 1.2 `autoconfigure` 自动装配模块
    • 1.3 `dependency` 依赖模块
  • 二 、Spring MVC装配tomcat 分析
    • 2.1 pom 分析
      • 2.2.1 jar包的依赖
      • 2.2.1 自动装配逻辑
    • 2.2 tomcat 的自动装配&mvc自动装配
      • 2.2.1 tomcat的装配逻辑: `TomcatWebServerFactoryCustomizer`
      • 2.2.2 回调函数加载 tomcat :`WebServerFactoryCustomizerBeanPostProcessor`
      • 2.2.3 加载WebServerFactoryCustomizerBeanPostProcessor:`ServletWebServerFactoryAutoConfiguration `
      • 2.2.4 `ServletWebServerFactoryConfiguration`
      • 2.2.5 准备DispatcherServlet
      • 2.2.6 WebMvcAutoConfiguration :mvc的最终装配
  • 三、一个请求的调用
    • 3.1 一个简单的演示

一、基本机制

starter官方文档
编写starter 中文
spring boot 的starter是spring 的核心模型。一个spring boot 工程是由很多个starter组成。新建spring boot 工程时,starter提供装配的逻辑和依赖。比如放入

<dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
dependency>

其中包含tomcat starter,这个依赖包含tomcat jar包

 <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-tomcatartifactId>
      <version>2.3.1.RELEASEversion>
      <scope>compilescope>
    dependency>

那么自动装配就会实例化tomcatServer

1.1 starter 的结构

starter的结构是有两个模块组成:autoconfiguredependency

  • autoconfigure模块负责按照一定的条件实例化bean,放入spring context
  • dependency模块就是依赖的配置

1.2 autoconfigure 自动装配模块

  1. 对于一个starter,autoconfigure自动装配 不是必须的。如果确实需要实例化Bean,那么需要编写自动装配逻辑+ 配置文件(spring.factories)。下面是spring-boot-starter对spring官方starter自动装配设置。

自定义的starter,它的autoconfiguredependency都在一个项目下。spring-boot-starter比较庞大,使用专门的jar,来保留自动装配逻辑。官方starter

  • 结构
    b Spring MVC 如何内嵌 tomcat & 流程分析_第1张图片
  • 自动装配逻辑
    对于spring mvc 的自动装配逻辑

图片中bean的注解比较好理解,就是来实例化的。一堆Condition就是用来判断,装配的条件是否满足。比如@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }),意思就是类的路径下只要有DispatcherServlet.class,等就实例化该bean。

  • 配置文件 spring.factories
    位于META_INF/spring.factories。将自动装配类逻辑配置到如下属性,会被扫描装载
    b Spring MVC 如何内嵌 tomcat & 流程分析_第2张图片

1.3 dependency 依赖模块

依赖是必须的,starter可以只是单纯提供依赖的jar,是一个空的jar。比如spring.boot.starter.tomcat

这里是tomcat starter 的依赖,可以看到这个starter,把必要的依赖都引入了。

  <dependencies>
    <dependency>
      <groupId>jakarta.annotationgroupId>
      <artifactId>jakarta.annotation-apiartifactId>
      <scope>compilescope>
    dependency>
    <dependency>
      <groupId>org.apache.tomcat.embedgroupId>
      <artifactId>tomcat-embed-coreartifactId>
      <scope>compilescope>
      <exclusions>
        <exclusion>
          <artifactId>tomcat-annotations-apiartifactId>
          <groupId>org.apache.tomcatgroupId>
        exclusion>
      exclusions>
    dependency>
    <dependency>
      <groupId>org.glassfishgroupId>
      <artifactId>jakarta.elartifactId>
      <scope

你可能感兴趣的:(b Spring MVC 如何内嵌 tomcat & 流程分析)