我们知道,springboot默认使用的是内嵌的tomcat作为web服务器,我们可以通过配置文件对tomcat的参数进行修改,比如server.port表示监听端口,server.contextPath表示上下文路径,server.tomcat.max-connections表示,完整配置可参考 https://docs.spring.io/spring-boot/docs/1.5.14.RELEASE/reference/htmlsingle/
spring-boot加载tomcat的过程如下:
(1) springboot的主函数有一个注解 @SpringBootApplication,而这个注解里有一个@EnableAutoConfiguration,所有的故事就从这里开始吧。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration //开启自动配置
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
(2) EnableAutoConfiguration会触发许多自动配置,其中就包括了EmbeddedServletContainerAutoConfiguration(至于EnableAutoConfiguration是怎么触发各个自动配置类的可以参考 spring-boot-autoconfigure)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication
@Import(BeanPostProcessorsRegistrar.class) //引入BeanPostProcessorsRegistrar,见下面的代码
public class EmbeddedServletContainerAutoConfiguration {
@Configuration
// 默认情况下,Servlet.class和Tomcat.class都在classpath中,因此这个条件满足
@ConditionalOnClass({ Servlet.class, Tomcat.class })
// 若用户没有自定义的EmbeddedServletContainerFactory,则继续往下
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {
// 如上面的@ConditionalOnClass和@ConditionalOnMissingBean,则实例化一个TomcatEmbeddedServletContainerFactory
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory();
}
}
// ... 省略无关代码 ...
// 通过上面的@Import会引入这个BeanPostProcessorsRegistrar
publi