目录
一、嵌入式容器
1.1、自动配置原理
1.2、相关操作
二、切换服务器
一、嵌入式容器
Servlet容器:管理、运行Servlet组件(Servlet、Filter、Listener)的环境,一般指服务器
1.1、自动配置原理
1、SpringBoot 默认嵌入Tomcat作为Servlet容器。
2、自动配置类是
ServletWebServerFactoryAutoConfiguration,
EmbeddedWebServerFactoryCustomizerAutoConfiguration
@AutoConfiguration(after = SslAutoConfiguration.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass(ServletRequest.class) @ConditionalOnWebApplication(type = Type.SERVLET) @EnableConfigurationProperties(ServerProperties.class) @Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, ServletWebServerFactoryConfiguration.EmbeddedTomcat.class, ServletWebServerFactoryConfiguration.EmbeddedJetty.class, ServletWebServerFactoryConfiguration.EmbeddedUndertow.class }) public class ServletWebServerFactoryAutoConfiguration {}
①、ServletWebServerFactoryAutoConfiguration
自动配置了嵌入式容器场景②、绑定了
ServerProperties
配置类,所有和服务器有关的配置server。
③、
ServletWebServerFactoryAutoConfiguration
导入了 嵌入式的三大服务器Tomcat
、Jetty
、Undertow。
😊、
导入Tomcat
、Jetty
、Undertow
都有条件注解。系统中有这个类才行(也就是导了包)。😊、默认
Tomcat
配置生效。给容器中放 TomcatServletWebServerFactory。😊、都给容器中
ServletWebServerFactory
放了一个 web服务器工厂(造web服务器的)😊、web服务器工厂 都有一个功能,该类的
getWebServer
获取web服务器。😊、TomcatServletWebServerFactory 创建了 tomcat对象。
④、
ServletWebServerApplicationContext
ioc容器,启动的时候会调用创建web服务器。⑤、Spring容器刷新(启动)的时候,会预留一个时机,刷新子容器。
onRefresh()
@Override protected void onRefresh() { super.onRefresh(); try { createWebServer(); } catch (Throwable ex) { throw new ApplicationContextException("Unable to start web server", ex); } }
⑥、refresh() 容器刷新 十二大步的刷新子容器会调用
onRefresh()。
总结:
Web场景的Spring容器启动,在onRefresh的时候,会调用创建web服务器的方法。
Web服务器的创建是通过WebServerFactory搞定的。容器中又会根据导了什么包条件注解,启动相关的 服务器配置,默认
EmbeddedTomcat
会给容器中放一个TomcatServletWebServerFactory
,导致项目启动,自动创建出Tomcat。
1.2、相关操作
1、修改
server
下的相关配置就可以修改服务器参数。2、通过给容器中放一个
ServletWebServerFactory
,来禁用掉SpringBoot默认放的服务器工厂,实现自定义嵌入任意服务器。
二、切换服务器
<properties> <servlet-api.version>3.1.0</servlet-api.version> </properties> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- Exclude the Tomcat dependency --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- Use Jetty instead --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
切换服务器本身意义不大,并不能显著提高程序性能