Spring Boot项目的内嵌容器

时间:2022-08-03 08:54:06

一、关于容器

刚才开始使用spring boot的开发者会有种很直观的感觉,servlet容器“不见了”。之前开发web项目,都是把程序写完后部署到servlet容器(比如Tomcat),但是使用spring boot开发项目,写完程序后直接就能运行了,觉得些许奇怪! 其实呢,这是因为Spring Boot中内嵌了Tomcat、Jetty和Undertow服务器。之所以开发者在默认情况下不需要做任何配置,是因为spring boot提供了一个名为EmbeddedServletContainerAutoConfiguration的配置类 (@Configuration注解的类),spring boot能实现“零配置”,是因为spring定义了好多这样的配置类(配置没有少,只是以前由开发者自己的工作交由spring完成了),这种情况下大多数开发人员将只需使用适当的“启动器”来获得一个完全配置的实例。spring-boot-starter-web默认使用嵌套式的Tomcat作为Web容器对外提供HTTP服务,默认端口8080对外监听和提供服务。但同样可以使用spring-boot-starter-jetty或者spring-boot-starter-undertow作为Web容器。

注意:如果您选择在CentOS上使用Tomcat,默认情况下临时目录是用于存储已编译的jsp、文件上传等。当应用程序运行导致失败时,该目录可以就被tmpwatch删除。为了避免这一点,您可能需要定制您的tmpwatch配置。通过使用server.tomcat.basedir来配置内嵌的Tomcat。

1)内嵌容器选择

  • 在pom文件中排除tomcat的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
  • 增加Jetty依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

 

2)改变默认的配置端口,可以在application.properties中指定:

server.port = 9000(the port number you want)

3)类似的配置还有:

server.address
server.ssl.*
server.tomcat.*

如果上诉仍然没有办法满足要求,springBoot支持对嵌入式的Web容器实例进行定制,可以通过向IoC容器中注册一个EmbeddedServletContainerCustomizer类型的组件来对嵌入式的Web容器进行定制

public class UnveilSpringEmbeddedTomcatCustomizer implements EmbeddedServletContainer{
public void customize(ConfigurableEmbeddedServletContainer container){
container.setPort(9999);
container.setContextPath("C\\hello");
...
}
}

二、关于servlet、 Filters、listeners

在使用嵌入式servlet容器时,您可以注册servlet、 Filters、listeners 。Servlet规范要么使用Spring bean,要么通过扫描Servlet组件。

1.通过Spring Bean注册servlet、 Filters、listeners

默认情况下,如果上下文只包含一个Servlet,它将被映射到/。在多个情况下。Servlet bean bean的名称将用作路径前缀。过滤器将映射到/*。

如果基于约定的映射不够灵活,可以使用ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean类进行完全控制。

Spring Boot附带了许多可以定义过滤器bean的自动配置。下面是一些过滤器的例子和它们各自的顺序(低order value意味着更高的优先级):

Servlet Filter Order
OrderedCharacterEncodingFilter
Ordered.HIGHEST_PRECEDENCE
WebMvcMetricsFilter
Ordered.HIGHEST_PRECEDENCE + 1
ErrorPageFilter
Ordered.HIGHEST_PRECEDENCE + 1
HttpTraceFilter
Ordered.LOWEST_PRECEDENCE - 10

通常,让过滤bean处于无序状态是安全的。

如果需要特定的顺序,您应该避免筛选器程序读取请求的Ordered.HIGHEST_PRECEDENCE值。因为它可能违背应用程序的字符编码配置。如果Servlet筛选器包装请求,它应该配置一个小于或等于FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER的顺序。