SpringBoot应用启动内置Tomcat的过程源码分析

下面我将为您详细讲解“SpringBoot应用启动内置Tomcat的过程源码分析”。

SpringBoot应用启动流程

SpringBoot能够提供如此简单易用的开发体验,离不开对应用启动过程的封装和自动配置。下面是SpringBoot应用启动的大体流程:

  1. SpringBoot启动类加载:在启动类的main方法中触发SpringApplication.run()方法,通过实例化SpringApplication,完成对SpringBoot应用的初始化和启动。
  2. 加载SpringBoot配置:SpringApplication完成基本的初始化后,会根据classpath中的配置文件对应的配置,加载相应的配置信息,并应用到Spring Boot环境中。
  3. 创建Spring上下文:SpringBoot框架会自动创建一个Spring上下文(内部是使用AnnotationConfigApplicationContext实现),并加载应用的配置和自动配置Bean。容器启动过程中,会扫描bean的定义,并尝试创建它们,并把它们注入到Spring容器中。
  4. 执行Spring Boot自动配置:SpringBoot在启动过程中配置了一些常用的Bean,以及通过自动配置帮助开发者快速搭建应用框架所需要的Bean。
  5. 注册Servlet、Filter、Listener:SpringBoot能够帮助我们自动注册Servlet、Filter、Listener等Web组件。这些组件都被Tomcat支持,所以我们的应用需要启动Tomcat.
  6. 启动Tomcat:SpringBoot在启动时,默认内嵌了Tomcat作为Web容器。

SpringBoot内置Tomcat启动过程分析

当我们引入spring-boot-starter-web依赖后,SpringBoot会默认使用内置的Tomcat作为Web容器,让我们来看一下Tomcat内嵌启动的过程:

  1. 配置Tomcat参数

在SpringBoot启动环节中,spring-boot-starter-web依赖会自动配置Tomcat的启动参数。在org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer中,会给Tomcat容器设置端口、上下文根、获取参数等一系列参数。

  1. 创建Tomcat Server

接下来,org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration中,会创建并返回一个Tomcat的ServletWebServerFactory。

  1. 配置Tomcat Server

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryCustomizer会配置Tomcat Server,为其注册Connector、Context、ErrorHandler、Executor等。其中,包括注册ServletContainerInitializer。

  1. 添加配置(Filter、Servlet等)

org.springframework.boot.autoconfigure.web.servlet.ServletContextInitializerBeans为当前的WebApp添加Web组件,比如Filter、Servlet等。它会扫描当前classpath里的一些类,识别其中的ServletContextInitializer,通过RegistrationBean将其添加到Web容器中去。

  1. 启动Tomcat Server

在创建和配置完Tomcat Server对象之后,org.springframework.boot.web.embedded.tomcat.TomcatWebServer调用Tomcat的start()方法启动Tomcat,启动完成后,自动打印出Tomcat的启动日志。

示例

接下来,我将提供两个示例:

示例1:使用内置Tomcat服务器

  1. 创建一个SpringBoot项目:

shell
$ mkdir demo && cd demo
$ curl https://start.spring.io/starter.zip -d dependencies=web -o demo.zip
$ unzip demo.zip && rm demo.zip

  1. 编写Controller

src/main/java/com/demo/SampleController.java文件中编写以下代码:

```java
@RestController
public class SampleController {

   @RequestMapping("/")
   String home() {
       return "Hello World!";
   }

}
```

  1. 启动SpringBoot应用

shell
$ ./mvnw spring-boot:run

然后,你将看到SpringBoot成功启动,浏览器访问 http://localhost:8080 访问,页面输出 Hello World!。

示例2:集成自定义Filter

  1. 添加Filter依赖

pom.xml的dependencies下,添加如下配置:

xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>

  1. 添加Filter配置

src/main/java/com/demo/MyFilter.java文件中编写一个自定义Filter:

java
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Init MyFilter...");
}
@Override
public void destroy() {
System.out.println("Destroy MyFilter...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter starts...");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("MyFilter ends...");
}
}

  1. 注册Filter

src/main/java/com/demo/FilterConfig.java中编写以下代码:

java
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter> filterRegistrationBean() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<MyFilter>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}

  1. 测试

最后编写Controller测试一下,如下所示:

java
@RestController
public class SampleController {
@GetMapping("/hello")
public String hello() {
return "Hello World!";
}
}

启动应用后,在浏览器中访问 http://localhost:8080/hello,页面会输出 Hello World!,并且控制台会输出以下日志信息:

Initializing Spring embedded WebApplicationContext
Root WebApplicationContext: initialization completed in xxx ms
MyFilter starts...
MyFilter ends...

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot应用启动内置Tomcat的过程源码分析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 解决maven第一次创建项目太慢的问题

    解决 Maven 第一次创建项目太慢的问题的完整攻略: 1. 更换镜像源 Maven 默认下载项目的仓库为中央库(Central Repository),但是由于该仓库的服务器集群一般在海外,所以第一次下载可能会比较慢,经常会卡住不动。因此,更换镜像源可以显著提高 Maven 下载依赖速度。 1.1 修改 settings.xml 配置文件 在 Maven …

    Java 2023年5月19日
    00
  • Java操作redis设置第二天凌晨过期的解决方案

    下面就是Java操作redis设置第二天凌晨过期的解决方案的完整攻略。 准备工作 首先需要引入redis的Java客户端库,如Jedis,Lettuce等,具体可参考官方文档进行引入。 方案一:设置过期时间为当天凌晨 我们可以通过计算当前时间距离当天凌晨的秒数,将该秒数加上一天86400秒作为过期时间,在Redis中进行设置。 示例代码如下: // Jedi…

    Java 2023年5月20日
    00
  • 老生常谈onBlur事件与onfocus事件(js)

    一、简介: onBlur事件和onfocus事件是JavaScript中关于input、textarea等表单元素的两种常见事件。其中onBlur事件当元素失去焦点时触发,而onfocus事件当元素获得焦点时触发。 二、具体使用方法: onfocus事件 :当元素获得焦点时触发,即当鼠标点击input或者textarea的时候,触发该事件。 示例代码: &l…

    Java 2023年6月15日
    00
  • 解决fastjson泛型转换报错的解决方法

    解决fastjson泛型转换报错的解决方法 问题描述: fastjson是Java中一个非常常用的JSON处理库,其中序列化和反序列化功能特别强大,但在使用其进行泛型反序列化时,会出现“com.alibaba.fastjson.JSONException: parse error”等异常,这就涉及到fastjson泛型转换错误的问题。 解决方法: 解决这个问…

    Java 2023年5月26日
    00
  • SpringData JPA的常用语法汇总

    下面将详细讲解关于Spring Data JPA的常用语法汇总。 一、什么是Spring Data JPA Spring Data JPA是Spring框架的一个扩展模块,可以使用简单且统一的API,提供了CRUD操作,还支持基于方法名称的查询、@Query查询以及Specification查询等。它更加注重与实体类相关的持久化层操作,将封装JPA的强大功能…

    Java 2023年6月2日
    00
  • 利用JWT如何实现对API的授权访问详解

    JWT是一种用于认证和授权的开放标准,常用于Web应用程序和API的身份验证和授权。使用JWT进行API的授权访问可以帮助我们更加安全和可控地管理API资源。 以下是使用JWT实现对API的授权访问的详细攻略: 步骤一:生成JWT Token 在每次请求API的时候,需要使用服务器端生成的JWT Token来进行身份认证和授权。通常可以使用jsonwebto…

    Java 2023年5月20日
    00
  • JSP页面传值乱码过滤方法

    当我们使用JSP页面传输数据时,经常会遇到传输中文字符出现乱码的问题。这时候,我们就需要对传输数据进行过滤,以解决乱码问题。本文将详细讲解如何使用JSP页面传值乱码过滤方法。 什么是JSP页面传值乱码过滤方法 JSP页面传值乱码过滤方法,是一种对JSP传输数据进行编码、解码的方法。通过该方法,我们可以在数据传输的过程中进行字节编码,以避免造成字符编码的乱码现…

    Java 2023年6月15日
    00
  • java线程池中线程数量到底是几

    首先让我们来了解一下Java线程池。 线程池是一种线程使用方式的抽象,它可以优化多线程的资源使用情况。通过重复利用已创建的线程,降低线程创建和销毁的开销,提高响应速度。 而Java中的线程池主要由ThreadPoolExecutor类实现,该类有以下构造方法 public ThreadPoolExecutor(int corePoolSize, //核心线程…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部