《精通Spring MVC 4》——1.8 嵌入式Servlet容器(Tomcat)的配置

    xiaoxiao2024-09-30  99

    本节书摘来自异步社区《精通Spring MVC 4》一书中的第1章,第1.8节,作者:【美】Geoffroy Warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看

    1.8 嵌入式Servlet容器(Tomcat)的配置

    默认情况下,Spring Boot在打包和运行应用时,会使用Tomcat嵌入式API(Tomcat embedded API)。

    我们来看一下EmbeddedServletContainerAutoConfiguration:

    @Order(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplication @Import(EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar. class) public class EmbeddedServletContainerAutoConfiguration { /** * Nested configuration for if Tomcat is being used. */ @Configuration @ConditionalOnClass({ Servlet.class, Tomcat.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory. class, search = SearchStrategy.CURRENT) public static class EmbeddedTomcat { @Bean public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() { return new TomcatEmbeddedServletContainerFactory(); } } /** * Nested configuration if Jetty is being used. */ @Configuration @ConditionalOnClass({ Servlet.class, Server.class, Loader.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory. class, search = SearchStrategy.CURRENT) public static class EmbeddedJetty { @Bean public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() { return new JettyEmbeddedServletContainerFactory(); } } /** * Nested configuration if Undertow is being used. */ @Configuration @ConditionalOnClass({ Servlet.class, Undertow.class, SslClientAuthMode.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory. class, search = SearchStrategy.CURRENT) public static class EmbeddedUndertow { @Bean public UndertowEmbeddedServletContainerFactory undertowEmbeddedServletContainerFactory() { return new UndertowEmbeddedServletContainerFactory(); } } }

    上面的代码非常简单直接,这个代码包含了3个不同的配置,哪一个会处于激活状态要取决于类路径下哪些内容是可用的。

    可以将Spring Boot与Tomcat、tc-server、Jetty或者Undertow结合使用。服务器可以很容易地进行替换,只需将spring-boot-starter-tomcat JAR依赖移除掉,并将其替换为Jetty或Undertow对应的依赖即可。如果你想这样做的话,请参考相关的文档。

    对Servlet容器(Tomcat)的所有配置都会在TomcatEmbeddedServletContainerFactory中进行。尽管你应该读一下这个类,它为嵌入式Tomcat提供一个非常高级的配置(为其查找文档会非常困难),但是在这里我们不会直接查看这个类。

    我会为读者介绍配置Servlet容器时不同的选项。

    1.8.1 HTTP端口通过在application.properties文件中定义server.port属性或者定义名为SERVER_PORT的环境变量,我们可以修改默认的HTTP端口。

    通过将该变量设置为−1,可以禁用HTTP,或者将其配置为0,这样的话,就会在随机的端口上启动应用。对于测试,这是很便利的。

    1.8.2 SSL配置配置SSL是一项很麻烦的事情,但是Spring Boot有一项很简单的解决方案。我们只需一点属性就能保护服务器了:

    server.port = 8443 server.ssl.key-store = classpath:keystore.jks server.ssl.key-store-password = secret server.ssl.key-password = another-secret

    不过,为了使上面的例子运行起来,我们需要生成一个keystore文件。

    我们将会在第 6 章中,深入介绍安全的可选方案。当然,我们还可以通过添加自己EmbeddedServletContainerFactory来进一步自定义TomcatEmbeddedServletContainerFactory的功能。1.8.3 其他配置在配置中,我们可以通过简单地声明@Bean 元素来添加典型的 Java Web 元素,如Servlet、Filter和ServletContextListener。

    除此之外,Spring Boot还为我们内置了3项内容:

    在JacksonAutoConfiguration中,声明使用Jackson进行JSON序列化;在HttpMessageConvertersAutoConfiguration中,声明了默认的HttpMessageConverter;在JmxAutoConfiguration中,声明了JMX功能。我们将会在第5章中,更详细地了解Jackson的配置。关于JMX配置,我们可以在本地通过jconsole连接应用之后进行尝试,如图1-9所示。

    图1-9

    通过将org.springframework.boot:spring-boot-starter-actuator添加到类路径下,我们可以添加更多有意思的MBean。我们甚至可以定义自己的MBean,并通过Jolokia将其暴露为HTTP。另一方面,我们也可以禁用这些端点,只需在配置中添加spring.jmx.enabled=false即可。

    最新回复(0)