SpringBoot嵌入式容器详细介绍

开发 架构
任何Spring bean的Servlet、Filter或 *Listener实例都注册到嵌入式容器中。如果你想从应用程序中引用一个值,这可能特别方便。配置过程中的属性。

概述

Spring Boot支持嵌入式Tomcat、Jetty和Undertow服务器。大多数开发人员使用适当的 “starter”来获得完全配置的实例。默认情况下,嵌入式服务器在端口8080上监听HTTP请求。

默认引入下面依赖使用Tomcat服务器。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

如需要使用其它如Undertow作为服务器只需要如下依赖即可。

<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>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

Servlets, Filters, and listeners

当使用嵌入式servlet容器时,可以通过使用Spring bean或扫描servlet组件来注册servlet、filter和servlet规范中的所有监听器(如HttpSessionListener)。

Registering Servlets, Filters, and Listeners as Spring Beans

任何Spring bean的Servlet、Filter或 *Listener实例都注册到嵌入式容器中。如果你想从应用程序中引用一个值,这可能特别方便。配置过程中的属性。

默认情况下,如果上下文只包含单个Servlet,则将其映射到/。在有多个servlet bean的情况下,bean名用作路径前缀。Filter映射到/*。

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

通常情况下,将Filter Bean放置无序是安全的。如果需要特定的顺序,则应该使用@Order注释过滤器,或者让它实现Ordered。你不能通过给过滤器的bean方法加上@Order注解来配置它的顺序。如果不能更改过滤器类以添加@Order或实现Ordered,则必须为过滤器定义一个FilterRegistrationBean,并使用setOrder(int)方法设置注册bean的订单。避免配置按顺序读取请求体的过滤器。

注:要查看应用程序中每个过滤器的顺序,请为web日志组启用调试级别日志(logging.level.web=debug)。注册过滤器的详细信息,包括它们的顺序和URL模式,将在启动时记录下来。

Servlet Context Initialization

嵌入式servlet容器不会直接执行servlet 3.0+javax.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口。这样做是有意为之,目的是降低在war中运行的第三方库破坏Spring Boot应用程序的风险。

如果需要在Spring Boot应用程序中执行servlet上下文初始化,应该注册一个实现org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。单一的onStartup方法提供了对ServletContext的访问,如果有必要,可以很容易地将其用作现有WebApplicationInitializer的适配器。

扫描 Servlets, Filters, and listeners。

在使用嵌入式容器时,可以通过使用@ServletComponentScan​来启用自动注册带有@WebServlet@WebFilter@WebListener注解的类。

容器之ServletWebServerApplicationContext

在底层,Spring Boot使用了另一种类型的ApplicationContext来支持嵌入式servlet容器。ServletWebServerApplicationContext是一种特殊类型的WebApplicationContext,它通过搜索单个ServletWebServerFactory bean来引导自己。通常TomcatServletWebServerFactory、JetttyServletWebServerFactory或UndertowServletWebServerFactory都是自动配置的。

你通常不需要知道这些实现类。大多数应用程序都是自动配置的,并且创建适当的 ApplicationContext和ServletWebServerFactory。

在嵌入式容器设置中,ServletContext被设置为服务器启动的一部分,该启动发生在应用程序上下文初始化期间。因此,ApplicationContext中的bean不能可靠地用ServletContext进行初始化。解决这个问题的一种方法是注入ApplicationContext作为bean的依赖项,并仅在需要时访问ServletContext。另一种方法是在服务器启动后使用回调函数。这可以使用ApplicationListener来监听ApplicationStartedEvent,如下所示:

public class CustomServletContextListener implements ApplicationListener<ApplicationStartedEvent> {

private ServletContext servletContext;

@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
this.servletContext = ((WebApplicationContext) applicationContext).getServletContext();
}

}

自定义Servlet容器

可以使用Spring环境属性来配置公共servlet容器设置。application.properties或application.yaml文件。

常见的服务器设置包括:

  • 网络设置:监听传入的HTTP请求的端口(server.port),绑定到server.address。地址,等等。
  • Session设置:会话是否持久(server.servlet.session.persistent),会话超时(server.servlet.session.timeout),会话数据的位置(server.servlet.session.store-dir),以及会话cookie配置(server.servlet.session.cookie.*)。
  • 错误管理:错误页面的位置(server.error.path)等。
  • SSL
  • HTTP compression

编程方式自定义配置

如果需要以编程方式配置嵌入式servlet容器,可以注册一个实现WebServerFactoryCustomizer接口的Spring bean。WebServerFactoryCustomizer提供了对ConfigurableServletWebServerFactory的访问,其中包括许多自定义设置方法。示例:

@Component
public class MyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}

}

TomcatServletWebServerFactory,JetttyServletWebServerFactory和UndertowServletWebServerFactory是ConfigurableServletWebServerFactory的子类,它们分别为Tomcat, Jetty和Undertow提供了额外的自定义设置方法。示例:

@Component
public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

@Override
public void customize(TomcatServletWebServerFactory server) {
server.addConnectorCustomizers((connector) -> connector.setAsyncTimeout(Duration.ofSeconds(20).toMillis()));
}

}

JSP限制

当运行一个使用嵌入式servlet容器的Spring Boot应用程序(打包为可执行的归档文件)时,对JSP的支持有一些限制。

  • 使用Jetty和Tomcat,如果你使用war打包,它应该可以正常工作。当使用java -jar启动时,不支持jsp。
  • Undertow不支持jsp。
  • 创建自定义error.jsp页面不会覆盖错误处理的默认视图。应该使用自定义错误页面。
责任编辑:姜华 来源: 今日头条
相关推荐

2009-12-17 10:33:05

嵌入式Linux

2011-03-07 09:57:24

Perst嵌入式数据库

2009-12-28 17:54:49

WPF嵌入式资源

2011-06-21 11:30:31

嵌入式 Qt

2009-12-23 13:05:22

Linux嵌入式

2022-12-09 08:34:38

嵌入式Web容器

2009-06-11 11:09:02

Linux嵌入式开发环境

2013-09-22 10:39:00

MeayunDB

2011-01-14 13:13:23

嵌入式Linux开发

2011-01-14 13:05:25

Linux内核嵌入式

2009-12-16 15:41:40

嵌入式Linux入门

2011-04-18 11:34:34

嵌入式软件测试

2009-07-17 16:06:59

ARM嵌入式开发

2009-12-09 10:12:28

嵌入式Linux

2013-07-25 09:32:26

OpenGL ESAndroid4.3

2014-05-26 15:14:04

DIGIA嵌入式Qt

2010-09-25 15:05:49

LINUXJVM

2022-01-04 22:19:38

Linux开发嵌入式

2009-12-24 17:21:38

嵌入式Linux

2011-07-05 15:42:02

QT 嵌入式 Embedded
点赞
收藏

51CTO技术栈公众号