嵌入式Tomcat提取的位置?

时间:2016-09-04 19:28:41

标签: tomcat spring-boot embedded-tomcat-7

嵌入在可执行jar中的Tomcat存档提取?

在内存或硬盘上的某个文件夹中?

与普通Tomcat相比,它需要多少资源?

1 个答案:

答案 0 :(得分:3)

这可能不是一个完整的答案,但正如我可以解释的那样。我也在想,所以我做了一点挖掘。

<强> Tomcat的嵌入芯

使用春季启动时,我们通常会添加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();
        }
    }

如果在类路径中找到tomcatServlet,则TomcatEmbeddedServletContainerFactory将被实例化,并且一切都会启动..

在spring-boot(EmbeddedWebApplicationContext.refresh)中的某个地方,通过调用TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer()创建一个Tomcat实例,该new Tomcat()执行new Tomcat();

从现在开始

从这一点来说,我可以与简单的主要方法相关,做一个简单的d.items()。 对我来说,这就是Spring Boot所做的事情,然后注册所有的Servlet。其余的都是好春天。 显然,Spring Boot提供了大量的AutoConfiguration和属性来配置几乎所有东西!

这有点帮助,也许你知道这一点并且希望更多吗?