【发布时间】:2017-01-12 05:46:43
【问题描述】:
嵌入在可执行jar Tomcat 存档中的提取物在哪里?
在内存中还是在硬盘上的某个文件夹中?
与普通的Tomcat相比需要多少资源?
【问题讨论】:
标签: tomcat spring-boot embedded-tomcat-7
嵌入在可执行jar Tomcat 存档中的提取物在哪里?
在内存中还是在硬盘上的某个文件夹中?
与普通的Tomcat相比需要多少资源?
【问题讨论】:
标签: tomcat spring-boot embedded-tomcat-7
这可能不是一个完整的答案,但我可以解释一下。我也想知道,所以我做了一点挖掘。
tomcat-embed-core
对于spring boot,我们通常包括spring-boot-starter-tomcat(通过spring-boot-starter-web),其中包括tomcat-embed-core。
如果你要创建一个普通的 main 方法,并将 tomcat-embed-core-x.y.z.jar 添加到你的类路径,你可以简单地这样做(来源:http://people.apache.org/~markt/presentations/2010-11-04-Embedding-Tomcat.pdf):
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
// Create a context
File docBase = new File(System.getProperty("java.io.tmpdir"));
Context ctxt = tomcat.addContext("",docBase.getAbsolutePath());
// Add a Servlet
Tomcat.addServlet(ctxt, "HelloWorld", new HelloWorldServlet());
ctxt.addServletMapping("/*", "HelloWorld");
// Start the instance
tomcat.start();
// Loop to serve requests
while(true) {
Thread.sleep(5000);
}
所以,当spring-boot-maven-plugin 打包 uber-jar 时,它会在 jar 中包含 tomcat-embed-core。
自动配置 - 新的 Tomcat()
Spring Boot 通过自动配置启动其功能,其中之一是EmbeddedServletContainerAutoConfiguration:
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication
@Import(EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class)
public class EmbeddedServletContainerAutoConfiguration {
...
@Configuration
@ConditionalOnClass({ Servlet.class, Tomcat.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
public static class EmbeddedTomcat {
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory();
}
}
如果在类路径中找到tomcat 和Servlet,TomcatEmbeddedServletContainerFactory 将被实例化,然后一切就开始了..
在 spring-boot (EmbeddedWebApplicationContext.refresh) 的某个地方,通过调用 TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer() 创建一个 Tomcat 实例,它执行 new Tomcat();
从现在开始
从这一点上,我可以联系到简单的 main 方法,做一个简单的new Tomcat()。
对我来说,这就是 Spring Boot 所做的,然后注册所有的 Servlet。剩下的就是好老春天了。
显然,Spring Boot 提供了大量的 AutoConfiguration 和属性来配置几乎所有内容!
这是否有点帮助,也许你知道这一点并希望得到更多?
【讨论】: