下面我将为您详细讲解“SpringBoot应用启动内置Tomcat的过程源码分析”。
SpringBoot应用启动流程
SpringBoot能够提供如此简单易用的开发体验,离不开对应用启动过程的封装和自动配置。下面是SpringBoot应用启动的大体流程:
- SpringBoot启动类加载:在启动类的main方法中触发SpringApplication.run()方法,通过实例化SpringApplication,完成对SpringBoot应用的初始化和启动。
- 加载SpringBoot配置:SpringApplication完成基本的初始化后,会根据classpath中的配置文件对应的配置,加载相应的配置信息,并应用到Spring Boot环境中。
- 创建Spring上下文:SpringBoot框架会自动创建一个Spring上下文(内部是使用AnnotationConfigApplicationContext实现),并加载应用的配置和自动配置Bean。容器启动过程中,会扫描bean的定义,并尝试创建它们,并把它们注入到Spring容器中。
- 执行Spring Boot自动配置:SpringBoot在启动过程中配置了一些常用的Bean,以及通过自动配置帮助开发者快速搭建应用框架所需要的Bean。
- 注册Servlet、Filter、Listener:SpringBoot能够帮助我们自动注册Servlet、Filter、Listener等Web组件。这些组件都被Tomcat支持,所以我们的应用需要启动Tomcat.
- 启动Tomcat:SpringBoot在启动时,默认内嵌了Tomcat作为Web容器。
SpringBoot内置Tomcat启动过程分析
当我们引入spring-boot-starter-web
依赖后,SpringBoot会默认使用内置的Tomcat作为Web容器,让我们来看一下Tomcat内嵌启动的过程:
- 配置Tomcat参数
在SpringBoot启动环节中,spring-boot-starter-web
依赖会自动配置Tomcat的启动参数。在org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer
中,会给Tomcat容器设置端口、上下文根、获取参数等一系列参数。
- 创建Tomcat Server
接下来,org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration
中,会创建并返回一个Tomcat的ServletWebServerFactory。
- 配置Tomcat Server
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryCustomizer
会配置Tomcat Server,为其注册Connector、Context、ErrorHandler、Executor等。其中,包括注册ServletContainerInitializer。
- 添加配置(Filter、Servlet等)
org.springframework.boot.autoconfigure.web.servlet.ServletContextInitializerBeans
为当前的WebApp添加Web组件,比如Filter、Servlet等。它会扫描当前classpath里的一些类,识别其中的ServletContextInitializer,通过RegistrationBean将其添加到Web容器中去。
- 启动Tomcat Server
在创建和配置完Tomcat Server对象之后,org.springframework.boot.web.embedded.tomcat.TomcatWebServer
调用Tomcat的start()方法启动Tomcat,启动完成后,自动打印出Tomcat的启动日志。
示例
接下来,我将提供两个示例:
示例1:使用内置Tomcat服务器
- 创建一个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
- 编写Controller
在src/main/java/com/demo/SampleController.java
文件中编写以下代码:
```java
@RestController
public class SampleController {
@RequestMapping("/")
String home() {
return "Hello World!";
}
}
```
- 启动SpringBoot应用
shell
$ ./mvnw spring-boot:run
然后,你将看到SpringBoot成功启动,浏览器访问 http://localhost:8080
访问,页面输出 Hello World!。
示例2:集成自定义Filter
- 添加Filter依赖
在pom.xml
的dependencies下,添加如下配置:
xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
- 添加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...");
}
}
- 注册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;
}
}
- 测试
最后编写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技术站