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日

相关文章

  • Jackson2的JsonSchema实现java实体类生成json方式

    当使用Jackson2进行Java对象的序列化和反序列化时,我们可以使用Jackson2的JsonSchema功能来生成Java实体类的JSON描述。这些描述包括属性的标识符、类型和其他约束。它们可以用于生成文档、验证和其他用途。 以下是使用Jackson2的JsonSchema生成Java实体类的步骤: 步骤1. 添加依赖 要使用Jackson2的Json…

    Java 2023年5月26日
    00
  • java常用工具类之DES和Base64加密解密类

    下面我将为您详细讲解“java常用工具类之DES和Base64加密解密类”的完整攻略。 1. 什么是DES和Base64加密解密算法 DES是一种对称加密算法,全称为数据加密标准(Data Encryption Standard),在安全性和效率方面都有不错的表现。而Base64是流行的编码方式,不是一种加密方式。它可以将任意字节序列编码成一种可用于文本通信…

    Java 2023年5月20日
    00
  • Java最简单的DES加密算法实现案例

    Java最简单的DES加密算法实现案例的攻略如下: 1. 什么是DES加密算法 DES加密算法是一种对称加密算法,全称为Data Encryption Standard,即数据加密标准。它是一种比较古老的加密算法,在现代加密算法中已经被更加安全和高效的加密算法所取代。但是,由于DES算法曾经是加密界最流行的算法之一,因此它仍然值得我们学习。 2. 实现步骤 …

    Java 2023年5月19日
    00
  • JavaWeb中struts2实现文件上传下载功能实例解析

    JavaWeb中struts2实现文件上传下载功能实例解析 在JavaWeb应用中,实现文件的上传下载是很常见的需求。而在struts2框架中,实现文件的上传下载也并不难。本文将详细介绍struts2框架中如何实现文件上传下载的功能。 1. 文件上传实现 在struts2框架中,文件上传的实现需要用到Commons-Fileupload和Commons-Io…

    Java 2023年5月20日
    00
  • Java的Struts框架报错“ViewHandlerException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ViewHandlerException”错误。这个错误通常由以下原因之一起: 视图处理器配置错误:如果配置文件中没有正确配置视图处理器,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 视图文件不存在:如果视图文件不存在,则可能会出现此错误。在这种情况下,需要检查文件路径以解决此问题。 以下是两个…

    Java 2023年5月5日
    00
  • Java后端真实、靠谱、强大的面试题网站:面试梯

    ​  本文分享一个给力的Java后端面试题网站:面试梯。 网址:https://offer.skyofit.com 这套题真实、高频、全面、有详细答案、保你稳过面试,让你成为offer收割机。题目包括:Java基础、多线程、JVM、数据库、Redis、Shiro、Spring、SpringBoot、MyBatis、MQ、ELK、分布式、SpringCloud…

    Java 2023年5月8日
    00
  • eclipse如何clean? java项目进行clean的技巧

    要进行clean操作,首先需要在Eclipse的菜单栏中找到“Project”选项,并在弹出菜单中选择“Clean”。 接下来,在弹出的窗口中选择需要clean的项目,并勾选“Start a build immediately”,最后点击“OK”按钮即可开始执行clean操作。 clean操作的主要作用是清理项目中的临时文件和缓存,以提高系统的稳定性和性能。…

    Java 2023年5月26日
    00
  • python读取json文件并将数据插入到mongodb的方法

    下面是详细的Python读取JSON文件并将数据插入到MongoDB的方法攻略。 1. 在Python中读取JSON文件 要在Python中读取JSON文件,我们需要使用json模块。json模块提供了几个功能,用于将JSON数据转换为Python对象和将Python对象转换为JSON数据。 以下是读取JSON文件的示例代码: import json # 读…

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