网站首页 > 技术文章 正文
Spring Boot Web容器
Web应用开发是企业开发的重要领域,Spring Boot 1.X的Web容器管理方式基于Servlet容器技术栈。Servlet容器主要基于同步阻塞I/O架构,HTTP请求和线程是一对一的关系,主要是TPR模型,即一个请求对应一个线程。主要的业务逻辑也是基于命令式的编程模式。以Spring MVC框架为主,Web容器方面以Tomcat为主,也可以通过自动配置功能改为Jetty/UnderTow容器。
Spring Boot 2.X主要基于异步非阻塞I/O架构,HTTP请求基于收敛的线程模型,网络层使用基于Reactor的I/O多路复用模式,业务逻辑基于函数式编程模式,以Spring WebFlux为主要框架。在Web容器方面可以基于Servlet 3.0的异步模式,默认情况下使用Netty作为容器。本节我们主要以Spring Boot 1.X讲解嵌入式Web容器的启动和加载原理,在进阶篇的响应式编程中将介绍Spring 5及Spring Boot 2.X的响应式框架WebFlux对Web应用服务的支持。
Spring Boot Web容器配置
Spring Boot对Web项目的支持主要是Spring Boot对Spring MVC框架的继承。Spring MVC框架是一个基于Servlet容器标准的Web容器框架实现,Spring Boot向Spring MVC提供开箱即用的Starter:springboot-starter-web。
Spring Boot应用中利用自动配置功能,只需要在pom.xml文件中加入下面的Web依赖,就可以直接启动一个Web服务:
Spring Web MVC 框 架 使 用 特 定 的 @Controller 或 者@RestController 注 解 的 Bean 作 为 处 理 HTTP 请 求 的 端 点 , 通 过@RequestMapping注解将控制器中的方法与HTTP请求进行映射,示例如下:
Spring Boot为Spring MVC提供了自动配置功能,包含如下主要配置特性。
● 自动配置ViewResolver引入ContentNegotiatingViewResolver组件功能。示例:在应用中添加ViewResolver组件用来匹配HTML静态页面,如果没有匹配成功,则返回false,由其他ViewResolver继续尝试匹配。ContentNegotiatingViewResolver会组合所有的视图解析器,代码如下。
● 自动注册Converter、GenericConverter、Formatter Bean。
示例:将页面提交数据转化为后台数据,实现格式化,代码如下。
● 对HttpMessageConverters的支持。
示例:Spring Boot可以为HttpMessageConverters类添加自定义转换类,通过这种方式可以将所有的HttpMessageConverters的Bean添加到Converter列表,覆盖默认的转换器列表,代码如下。
● 自动注册MessageCodeResolver。
● 自动使用ConfigurableWebBindingInitializer Bean。
● 使用WebMvcConfigurerAdapter类型的Bean来定制化配置。
默认情况下,Spring Boot会以/src/main/resources/static作为查找静态资源的文件路径,如果想自定义静态资源映射目录,需要重写addResourceHandlers来添加指定路径,重写addResourceLocations来指定静态资源路径。
总之,我们可以根据自己的意愿,对默认的Spring MVC的组件配置加以修改,方法也很简单,通过在IoC容器中注册新的同类型Bean来替换即可。如果你希望完全接管Spring MVC的所有相关配置,可以添加自己的@Configuration,并使用@EnableWebMvc注解实现定制化配置。
JAX-RS和Jersey框架
如果你喜欢JAX-RS和REST风格的编程模型,可以使用下面的Starter替代Spring MVC框架,Spring支持Jersey 1.X和Jersey 2.X等技术框架。这里我们只介绍Spring Boot对Jersey 2.X的支持,在pom.xml文件中加入下面的依赖:
Spring Boot对Jersey的配置有三种主要方式。在开始不同的配置方式前,我们注册一个端点对象资源,示例代码如下:
● 第一种方式,创建一个自定义的ResourceConfig:
● 第二种方式,返回一个ResourceConfig类型的@Bean:
● 第三种方式,配置一组ResourceConfigCustomizer对象。
Spring Boot提供了ResourceConfigCustomizer接口,让我们更灵活地对ResourceConfig对象进行配置。要使用该接口,我们需要先注释掉前面两节中提到的相关代码,然后创建一个类:
默 认 情 况 下 , Jersey 将 以 Servlet 的 形 式 注 册 一 个
ServletRegistrationBean 类 型 的 @Bean 。 它 的 名 字 为
jerseyServletRegistration,该Servlet默认会延迟初始化。
你可以通过spring.jersey.servlet.load-on-startup自定义配置
Jersey组件。通过创建相同名字的Bean,可以禁用或覆盖框架默认的
Bean。设置spring.jersey.type=filter可以使用Filter的形式代替
Servlet , 相 应 的 @Bean 类 型 变 为 jerseyFilter-Registration , 该
Filter有一个@Order属性,你可以通过spring.jersey.filter.order
设 置 该 属 性 。 Servlet 和 Filter 在 注 册 时 都 可 以 使 用
spring.jersey.init.*定义一个属性集合并将其传递给init参数进行
初始化。
内嵌容器的配置
Spring Boot 的 另 一 大 特 性 就 是 支 持 内 嵌 的 Web 容 器 , 包 括Tomcat、Jetty和UnderTow服务器,大多数开发者只需要使用合适的Starter来获取一个完全配置好的实例即可,内嵌服务器默认监听8080端口的HTTP请求。spring-boot-starter-web默认使用Tomcat作为Web容器,你可以在pom.xml中去除spring-boot-starter-tomcat依赖,然后 引 入 spring-boot-starter-jetty 或 者 spring-boot-starterundertow模块作为替代Web容器方案。Starter还提供了以“server.”为前缀的配置项对嵌入式容器配置进行修改。配置项的加载和定制化钩子加载过程如下。
1.自动化配置嵌入式容器
2.初始化TomcatEmbeddedServletContainerFactory的Bean对象
3.定制化Bean扩展逻辑
EmbeddedServletContainerCustomizerBeanPostProcessor在加载Bean后开始初始化配置项PostProcessor的处理逻辑:
4.配置文件加载
从配置文件中,你可以加载配置文件对象的配置值。如果配置文件中没有相关配置项,将使用默认代码设定配置。
5.Web容器定制化
如果你需要对Web容器进行更深入的定制,可以使用对应的Factory自动化配置Tomcat容器,它是初始化的关键流程和步骤,代码示例如下:
下图是Spring Boot启动过程中Tomcat容器完成自动配置的类图结构。我们在最新的Spring Boot下查看Tomcat的相关配置,发现有两个自动装配类,分别包含了三个定制器,还有一个工厂类。
本文给大家讲解的内容是SpringBootWeb容器配置:JAX-RS和Jersey框架、内嵌容器的配置
- 下篇文章给大家讲解的是Spring Boot嵌入式Web容器原理
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!
猜你喜欢
- 2024-09-23 Kubernetes笔记(五):了解Pod(容器组)
- 2024-09-23 一次性教你彻底理解 Spring容器和应用上下文
- 2024-09-23 互联网Web服务容器:Tomcat8解析及性能优化
- 2024-09-23 Servlet容器:在Web应用程序中的关键组件
- 2024-09-23 容器和虚拟机到底有啥区别?(容器和虚拟机利用的实现方式是一样的)
- 2024-09-23 Springboot实战实践:从基础到源码深入了解springboot(PDF版)
- 2024-09-23 1Panel docker容器版-1分钟部署 WEB在线版Telnet SSH工具sshwifty
- 2024-09-23 互联网WEB容器性能优化(web应用性能优化思路)
- 2024-09-23 Spring源码探究:容器(spring容器组成模块)
- 2024-09-23 大厂都在玩的容器技术到底是什么?
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 569℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 511℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 468℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 447℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 445℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)