SpringBoot2--嵌入式Servlet容器

前言

本文讨论Springboot2的嵌入式Servlet容器,Springboot2默认自带Tomcat嵌入式Servlet容器,无需打包成war包也能运行
在这里插入图片描述

一、嵌入式Servlet容器自动配置原理

嵌入式Servlet容器(WebServer)在项目启动时会创建并且自动配置,通过自动配置类ServletWebServerFactoryAutoConfiguration来实现,在这个类中会通过WebServer工厂组件生成相应的WebServer实例,并通过WebServerFactoryCustomizer来给WebServer配置参数

@Configuration(proxyBeanMethods = false)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)

// 仅在类 ServletRequest 存在于 classpath 上时才生效
@ConditionalOnClass(ServletRequest.class)

// 仅在当前应用是 Servlet Web 应用时才生效
@ConditionalOnWebApplication(type = Type.SERVLET)

// 确保前缀为 server 的配置参数加载到 bean ServerProperties
@EnableConfigurationProperties(ServerProperties.class)


// 1. 导入 ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar 以注册
//WebServerFactoryCustomizerBeanPostProcessor 
// 2. 导入 EmbeddedTomcat/EmbeddedJetty/EmbeddedUndertow 这三个属于
// ServletWebServerFactoryConfiguration 的嵌套配置类,这三个配置类会分别检测
// classpath上存在的类,从而判断当前应用使用的是 Tomcat/Jetty/Undertow,
// 从而决定定义哪一个 Servlet Web服务器的工厂 bean :
// TomcatServletWebServerFactory/JettyServletWebServerFactory/UndertowServletWebServerFactory
@Import({
    ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
		ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
		ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
		ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
   

    //将全局配置文件的相关配置转化成定制器来处理
	@Bean
	public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {
   
		return new ServletWebServerFactoryCustomizer(serverProperties);
	}
   
    // 针对当前Servlet容器是Tomcat时定义该 bean,用于定制化 TomcatServletWebServerFactory
	@Bean
	@ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
	public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(
			ServerProperties serverProperties) {
   
		return new TomcatServletWebServerFactoryCustomizer(serverProperties);
	}
   //静态类,后置处理器注册器
	public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
   

1.工厂生成WebServer
1)工厂类

在ServletWebServerFactoryAutoConfiguration类中导入了ServletWebServerFactoryConfiguration类的三个类,他们就是WebServer工厂类,它通过检测对应的依赖,判断是否生成一个工厂,以上三个实现类都继承自抽象基类AbstractServletWebServerFactory,实现了接口WebServerFactory,ErrorPageRegistry。该特征会被WebServerFactoryCustomizerBeanPostProcessor和ErrorPageRegistrarBeanPostProcessor使用,用于对WebServerFactory进行定制化,以及设置相应的错误页面。

@Configuration(proxyBeanMethods = false)
class ServletWebServerFactoryConfiguration {
   

		@Configuration(proxyBeanMethods = false)
		//判断当前是否引入了Tomcat依赖;
		@ConditionalOnClass({
    Servlet.class, Tomcat.class, UpgradeProtocol.class })
		//判断当前容器没有用户自己定义EmbeddedServletContainerFactory
		@ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
		static class EmbeddedTomcat {
   
		@Bean
		TomcatServletWebServerFactory tomcatServletWebServerFactory(
		
		}
	}

		@Bean
		JettyServletWebServerFactory JettyServletWebServerFactory(

		@Bean
		UndertowServletWebServerFactory undertowServletWebServerFactory(
		
		}
	}

2)以TomcatServletWebServerFactory为例,看看这个工厂如何创建WebServer

它有一个getWebServer方法会创建一个tomcat对象并调用getTomcatWebServer方法,在getTomcatWebServer方法中,只要得到端口号大于0的tomcat对象就默认启动一个TomcatWebServer

public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
		implements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {
   

	@Override
	public WebServer getWebServer(ServletContextInitializer... initializers) {
   
		if (this.disableMBeanRegistry) {
   
			Registry.disableRegistry();
		}
		Tomcat tomcat = new Tomcat();
		File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");
		tomcat.setBaseDir(baseDir.getAbsolutePath());
		Connector connector = new Connector(this.protocol);
		connector.setThrowOnFailure(true);
		tomcat.getService().addConnector(connector);
		customizeConnector(connector);
		tomcat.setConnector(connector);
		tomcat.getHost().setAutoDeploy(false);
		configureEngine(tomcat.getEngine());
		for (Connector additionalConnector : this.additionalTomcatConnectors) {
   
			tomcat.getService().addConnector(additionalConnector);
		}
		prepareContext(tomcat.getHost(), initializers);
		return getTomcatWebServer(tomcat);
	}

	protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值