小菜鸟

java菜鸟号正在起航

Spring Boot 定制嵌入式 Servlet 容器详解:配置修改与容器替换实战

Spring Boot 内置了 Tomcat(默认)、Jetty、Undertow 三种主流 Servlet 容器,无需外置服务器即可通过 java -jar 直接启动应用。实际开发中,常需根据需求 “修改容器配置”(如端口、编码)或 “替换容器”(如用 Jetty 替代 Tomcat)。从 “容器配置修改(两种方式)→ 容器替换(Tomcat 转 Jetty/Undertow)→ 底层原理” 三个维度,系统讲解嵌入式 Servlet 容器的定制方法,帮你灵活掌控应用部署环境。

嵌入式 Servlet 容器简介

Spring Boot 嵌入式容器的核心价值是 “简化部署”—— 无需手动安装、配置外置服务器(如 Tomcat),应用打包为 JAR 包后可独立运行。三种内置容器的特点对比如下:

容器名称 核心特点 适用场景 默认依赖 artifactId
Tomcat 功能全面、兼容性好、社区活跃 绝大多数 Web 应用(默认选择) spring-boot-starter-tomcat
Jetty 轻量级、启动快、内存占用低 轻量级应用、微服务(如 Spring Cloud 服务) spring-boot-starter-jetty
Undertow 高性能、异步非阻塞、支持 HTTP/2 高并发场景(如秒杀、API 网关) spring-boot-starter-undertow

默认情况下,引入 spring-boot-starter-web 会自动依赖 Tomcat 容器,无需额外配置。

修改嵌入式 Servlet 容器配置

Spring Boot 提供两种方式修改容器配置(如端口、编码、连接超时),分别适用于 “简单配置” 和 “复杂定制” 场景。

方式一:配置文件修改(推荐,简单场景)

通过 application.propertiesapplication.yml 直接配置 server 前缀的属性,Spring Boot 会自动将配置映射到容器(底层通过 ServerProperties 类实现)。

1. 核心配置属性(常用)
配置项 作用描述 示例值 适用容器
server.port 应用端口(0 表示随机端口) 80810 所有
server.servlet.context-path 应用上下文路径(默认 / /demo 所有
server.tomcat.uri-encoding Tomcat 编码格式(避免中文乱码) UTF-8 Tomcat
server.tomcat.max-threads Tomcat 最大线程数(控制并发能力) 200 Tomcat
server.tomcat.connection-timeout Tomcat 连接超时时间(毫秒) 20000(20 秒) Tomcat
server.jetty.max-http-post-size Jetty 最大 POST 请求大小 10MB Jetty
server.undertow.io-threads Undertow IO 线程数(处理连接) 4(默认 CPU 核心数) Undertow
2. 配置示例(YML 格式)
阅读全文 »

Spring Boot 多环境配置详解:从文件分离到 Bean 按需加载

在实际开发中,项目通常需要适配多种环境(如开发、测试、生产),不同环境的配置(如端口、数据库连接、第三方服务地址)往往不同。Spring Boot 提供了灵活的多环境配置方案,支持通过 “多配置文件分离” 或 “单 YML 多文档块” 实现环境隔离,并通过 @Profile 注解实现 Bean 的按需加载。从 “多环境配置方式→激活策略→Bean 环境隔离→实战最佳实践” 四个维度,系统讲解 Spring Boot 多环境配置的实现逻辑与实用技巧。

多环境配置的核心思想

Spring Boot 多环境配置的核心是 “环境标识(Profile)+ 配置隔离”:

  1. 环境标识:用 dev(开发)、test(测试)、prod(生产)等标识不同环境;
  2. 配置隔离:为每个环境单独维护配置(或在同一文件中用文档块隔离),避免配置混杂;
  3. 按需激活:启动时指定要激活的环境,Spring Boot 自动加载对应配置,无需修改代码。

多环境配置的两种核心方式

Spring Boot 支持两种主流的多环境配置方式,分别适用于 “配置项较多” 和 “配置项较少” 的场景。

方式一:多配置文件分离(推荐,配置项较多时)

通过创建多个以 application-{profile}.properties/yml 命名的配置文件,为每个环境单独维护配置,默认配置文件(application.properties/yml)负责激活环境。

1. 配置文件命名规则
阅读全文 »

Spring Boot 配置文件详解:类型、加载顺序、自定义配置与实战指南

Spring Boot 的核心优势之一是 “约定大于配置”,但实际开发中仍需通过配置文件自定义参数(如端口、数据库连接、第三方服务密钥等)。Spring Boot 支持多种配置文件格式和加载策略,从 “配置文件类型→加载顺序→外部配置引入→自定义配置→bootstrap 与 application 区别→配置优先级” 六个维度,系统讲解 Spring Boot 配置文件的使用方法与底层逻辑,帮你彻底掌握配置管理技巧。

Spring Boot 配置文件的两种核心类型

Spring Boot 支持两种主流配置文件格式:application.properties(键值对格式)和 application.yml(YAML 格式),二者功能完全一致,仅语法风格不同,可根据团队习惯选择。

1. 格式对比与语法规则

(1)application.properties(传统键值对格式)
  • 语法:采用 key=value 结构,层级关系通过 . 分隔;
  • 优点:语法简单,兼容性好(所有 Spring 版本支持);
  • 缺点:层级嵌套时冗余(需重复写前缀)。

示例

# 服务器配置
server.port=8080
server.servlet.context-path=/demo

# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

# 自定义配置
custom.name=Spring Boot
custom.version=2.7.10
(2)application.yml(YAML 缩进格式,推荐)
  • 语法:采用 “缩进 + 冒号” 表示层级关系,键值对用 key: value(冒号后需加空格);
  • 优点:层级清晰,冗余少,支持列表、对象等复杂结构;
  • 缺点:对缩进敏感(必须用空格,不能用 Tab),低版本 Spring 需额外依赖(Spring Boot 1.2+ 已内置支持)。

示例(与上述 properties 配置等价):

# 服务器配置(层级通过缩进体现)
server:
  port: 8080
  servlet:
    context-path: /demo

# 数据库配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456

# 自定义配置(支持对象结构)
custom:
  name: Spring Boot
  version: 2.7.10
  features: [自动配置, 嵌入式容器, Starter依赖] # 列表格式

2. 两种格式的优先级

若同一目录下同时存在 application.propertiesapplication.yml

  • 优先级application.properties > application.yml(相同配置项,properties 会覆盖 yml);
  • 建议:项目中统一使用一种格式(推荐 yml,层级更清晰),避免混合使用导致配置冲突。

Spring Boot 配置文件的默认加载顺序

Spring Boot 启动时会自动扫描4 个默认位置application.properties/yml 文件,按 “优先级从高到低” 加载,高优先级配置会覆盖低优先级配置(若配置项重复),且所有位置的配置文件会合并生效(非重复项叠加)。

阅读全文 »

Spring Boot 主程序深度解析:@SpringBootApplication 与自动配置原理

Spring Boot 主程序是应用的 “入口点”,而 @SpringBootApplication 注解则是主程序的 “灵魂”—— 它并非单一注解,而是由多个核心注解复合而成,封装了 Spring Boot 自动配置、组件扫描、配置类声明的核心逻辑。从 “@SpringBootApplication 注解拆解→各子注解底层原理→自动配置流程→配置报告解读” 四个维度,彻底讲透 Spring Boot 主程序的工作机制,帮你理解 “约定大于配置” 的底层实现。

Spring Boot 主程序的核心结构

一个标准的 Spring Boot 主程序由 “主类” 和 “@SpringBootApplication 注解” 组成,主类的 main 方法通过 SpringApplication.run() 启动应用,示例如下:

// 主程序类:@SpringBootApplication 标注为入口,main 方法启动应用
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        // 启动 Spring Boot 应用,初始化 Spring 容器
        SpringApplication.run(DemoApplication.class, args);
    }
}

从源码可知,@SpringBootApplication复合注解,本质是三个核心注解的组合:

阅读全文 »

Spring Boot 详解:核心特性、优势、配置与实战指南

Spring Boot 是由 Pivotal 团队(后并入 VMware)开发的 Spring 生态子项目,其核心定位是 “简化 Spring 应用开发”。它基于 “约定大于配置”(Convention Over Configuration)理念,封装了 Spring 与 Spring MVC 的复杂配置,提供了自动配置、嵌入式服务器、starter 依赖等特性,让开发者能快速搭建可运行的生产级应用。从 “Spring 痛点分析→Spring Boot 核心特性→配置方式→实战入门→优缺点总结” 五个维度,系统讲解 Spring Boot 的核心价值与使用方法。

Spring 传统开发的痛点(Spring Boot 诞生背景)

在 Spring Boot 出现前,基于 Spring + Spring MVC 开发项目需要大量手动配置和繁琐步骤,这些痛点直接推动了 Spring Boot 的诞生:

1. 配置繁琐且冗余

传统 Spring 项目需维护多个 XML 配置文件,且配置逻辑复杂,例如:

  • Web 环境配置:需在 web.xml 中配置 DispatcherServlet(Spring MVC 核心控制器)、ContextLoaderListener(Spring 容器初始化监听器);
  • Spring 容器配置:需在 applicationContext.xml 中配置组件扫描(context:component-scan)、注解驱动(mvc:annotation-driven)、视图解析器(InternalResourceViewResolver);
  • 第三方集成配置:集成 MyBatis 需配置 SqlSessionFactoryDataSource;集成 Redis 需配置 RedisTemplate,且需手动处理版本兼容性。

2. 依赖管理复杂

传统 Spring 项目需手动在 pom.xml 中引入所有依赖(如 Spring Core、Spring MVC、Servlet API、数据库驱动),且需精确匹配版本(例如 Spring 5.x 需搭配 Servlet 3.1+,否则会出现兼容性错误),版本冲突是常见问题。

3. 部署流程繁琐

传统 Spring 项目需打包为 WAR 包,并部署到外置 Servlet 容器(如 Tomcat、Jetty)中,步骤包括:

  1. 配置 pom.xml 打包类型为 war
  2. 排除 Spring Boot 内置容器(若使用);
  3. 将 WAR 包上传到服务器,部署到 Tomcat 的 webapps 目录;
  4. 启动 Tomcat 服务,若端口冲突需手动修改配置。

4. 入门门槛高

新手需理解 Spring 核心概念(IOC、AOP)、Spring MVC 流程(请求映射、拦截器、视图解析),同时掌握 XML 配置语法,入门周期长,不利于快速开发原型。

Spring Boot 核心特性(解决 Spring 痛点的关键)

Spring Boot 并非替代 Spring,而是对 Spring 生态的 “封装与增强”,其核心特性直接针对传统 Spring 的痛点设计:

1. 自动配置(Auto-Configuration):约定大于配置

自动配置是 Spring Boot 的 “灵魂”,它通过 条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean)自动判断项目依赖,并生成默认配置,无需手动编写 XML 或 Java 配置。

示例:Web 应用自动配置
阅读全文 »
0%