嵌入式servlet容器自动配置原理
springboot中存在大量的自动配置类,了解它的工作原理有助于加深对代码的理解,实现自定义配置的修改,同时也方便以后借鉴其设计模式;本文通过研究EmbeddedServletContainerAutoConfiguration:嵌入式的Servlet容器自动配置类,并分析其中一种常用的Servlet容器,来理解嵌入式servlet容器自动配置的原理。
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication // 在web应用下才会生效
@Import(BeanPostProcessorsRegistrar.class) // 导入后置处理器组件
public class EmbeddedServletContainerAutoConfiguration {
/**
* Nested configuration if Tomcat is being used.
*/
@Configuration
// 判断当前是否引入tomcat依赖
// 按照此原理我们可以通过排除tomcat依赖,并引入jetty或undertow依赖,达到切换嵌入式容器的目的
@ConditionalOnClass({ Servlet.class, Tomcat.class })
// 判断当前容器中没有用户自己定义的嵌入式servlet容器工厂:EmbeddedServletContainerFactory;作用:创建嵌入式的servlet容器
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory();
}
}
1. 嵌入式servlet容器工厂(EmbeddedServletContainerFactory)
查看继承关系发现springboot已经为我们配置好了三个容器工厂,按照此原理我们可以通过排除tomcat依赖,并引入jetty或undertow依赖,就可以达到切换嵌入式容器的目的了。
public interface EmbeddedServletContainerFactory {
// 获取嵌入式的servlet容器
EmbeddedServletContainer getEmbeddedServletContainer(
ServletContextInitializer... initializers);
}