Spring Boot 快速入门与核心原理详解
引言
在上一篇文章中,我们详细探讨了 Spring 框架中的事件监听与发布机制。本文将转向 Spring Boot,介绍如何快速入门 Spring Boot,并深入探讨其核心原理。Spring Boot 是由 Pivotal 团队提供的全新框架,旨在简化 Spring 应用的初始搭建以及开发过程。它通过约定大于配置的理念,极大地减少了配置的工作量,使得开发者可以更专注于业务逻辑的实现。
1. Spring Boot 快速入门
1.1 什么是 Spring Boot?
Spring Boot 是 Spring 框架的一个扩展,旨在简化新 Spring 应用的初始搭建和开发过程。它通过自动配置、起步依赖和生产就绪功能,使得开发者可以快速创建独立的、生产级别的基于 Spring 框架的应用程序。
1.2 创建第一个 Spring Boot 应用
1.2.1 使用 Spring Initializr
Spring Initializr 是一个 web 工具,可以帮助开发者快速生成 Spring Boot 项目的初始结构。以下是使用 Spring Initializr 创建项目的步骤:
- 访问 Spring Initializr。
- 选择项目的基本信息,如项目类型(Maven 或 Gradle)、语言(Java、Kotlin 或 Groovy)、Spring Boot 版本等。
- 添加所需的依赖,如 Web、Thymeleaf、JPA 等。
- 点击“Generate”按钮下载项目压缩包。
- 解压项目压缩包,并使用 IDE 打开项目。
1.2.2 项目结构
生成的项目结构通常如下所示:
my-spring-boot-app/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ ├── application.properties
│ │ └── static/
│ │ └── templates/
│ └── test/
│ └── java/
│ └── com/example/demo/
│ └── DemoApplicationTests.java
├── pom.xml (或 build.gradle)
1.2.3 编写一个简单的 REST API
在 DemoApplication.java
中添加一个简单的 REST 控制器:
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@RestControllerpublic class HelloController {@GetMapping("/hello")public String hello() {return "Hello, Spring Boot!";}}
}
运行 DemoApplication
类中的 main
方法,启动 Spring Boot 应用。访问 http://localhost:8080/hello
,你应该会看到 "Hello, Spring Boot!" 的响应。
2. Spring Boot 核心原理
2.1 自动配置
Spring Boot 的自动配置功能是其最强大的特性之一。它通过扫描类路径中的 jar 包,自动配置 Spring 应用所需的各种 Bean。自动配置的实现主要依赖于 @SpringBootApplication
注解和 @EnableAutoConfiguration
注解。
2.1.1 @SpringBootApplication
注解
@SpringBootApplication
注解是一个组合注解,包含了以下几个注解:
@Configuration
:标记当前类为配置类。@EnableAutoConfiguration
:启用自动配置。@ComponentScan
:启用组件扫描,自动发现并注册 Bean。
2.1.2 @EnableAutoConfiguration
注解
@EnableAutoConfiguration
注解会触发 Spring Boot 的自动配置机制。Spring Boot 会根据类路径中的 jar 包和 application.properties
文件中的配置,自动配置各种 Bean。例如,如果类路径中存在 H2 数据库的 jar 包,Spring Boot 会自动配置一个嵌入式的 H2 数据库。
2.2 起步依赖
起步依赖(Starter Dependencies)是 Spring Boot 提供的一组依赖管理工具,旨在简化依赖管理。每个起步依赖都包含了一组常用的依赖,开发者只需在项目中声明所需的起步依赖,即可快速引入一组相关的依赖。
例如,要创建一个 Web 应用,只需在 pom.xml
中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
这将自动引入 Spring MVC、Tomcat、Jackson 等依赖。
2.3 生产就绪功能
Spring Boot 提供了一系列生产就绪功能,如外部化配置、健康检查、度量指标等,这些功能可以帮助开发者更好地管理和监控应用。
2.3.1 外部化配置
Spring Boot 支持多种外部化配置方式,如 application.properties
文件、环境变量、命令行参数等。通过外部化配置,开发者可以轻松地在不同环境中切换配置。
例如,在 application.properties
文件中配置数据库连接:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2.3.2 健康检查
Spring Boot Actuator 是一个生产就绪功能模块,提供了多种监控和管理端点。通过启用 Actuator,开发者可以轻松地监控应用的健康状况、度量指标等。
例如,启用健康检查端点:
import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpoint;
import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.boot.actuate.health.HealthEndpointGroup;
import org.springframework.boot.actuate.health.HealthEndpointGroups;
import org.springframework.boot.actuate.health.HealthEndpointWebExtension;
import org.springframework.boot.actuate.health.ReactiveHealthContributorRegistry;
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
import org.springframework.boot.actuate.health.StatusAggregator;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.http.MediaType;
import org.springframework.util.Assert;import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
@ConditionalOnClass({ ReactiveHealthContributorRegistry.class, HealthEndpoint.class })
@ConditionalOnProperty(prefix = "management.health", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties({ HealthEndpointProperties.class, WebEndpointProperties.class, CorsEndpointProperties.class })
public class HealthEndpointConfiguration {@Bean@ConditionalOnMissingBeanpublic HealthEndpoint healthEndpoint(HealthContributorRegistry healthContributorRegistry,StatusAggregator statusAggregator) {return new HealthEndpoint(healthContributorRegistry, statusAggregator);}@Bean@ConditionalOnMissingBeanpublic HealthEndpointWebExtension healthEndpointWebExtension(HealthEndpoint healthEndpoint,HealthEndpointProperties properties,Environment environment,EndpointMediaTypes endpointMediaTypes,CorsEndpointProperties corsProperties,WebEndpointProperties webEndpointProperties,List<ReactiveHealthIndicator> reactiveHealthIndicators,List<HealthEndpointGroup> groups) {Map<String, HealthEndpointGroup> groupMap = groups.stream().collect(Collectors.toMap(HealthEndpointGroup::getName, (group) -> group));HealthEndpointGroups healthEndpointGroups = new HealthEndpointGroups(groupMap);ReactiveHealthContributorRegistry registry = new ReactiveHealthContributorRegistry(reactiveHealthIndicators);return new HealthEndpointWebExtension(healthEndpoint, properties, environment, endpointMediaTypes,corsProperties, webEndpointProperties, healthEndpointGroups, registry);}@ControllerEndpoint(id = "health")public static class HealthController {private final ExposableWebEndpoint endpoint;public HealthController(ExposableWebEndpoint endpoint) {Assert.notNull(endpoint, "Endpoint must not be null");this.endpoint = endpoint;}public Mono<Map<String, Object>> health(ServerWebExchange exchange) {return this.endpoint.invoke(exchange).map((response) -> (Map<String, Object>) response.getBody());}}
}
3. Spring Boot 最佳实践
3.1 保持项目结构清晰
保持项目结构清晰有助于提高代码的可读性和可维护性。建议按照以下结构组织项目:
src/
├── main/
│ ├── java/
│ │ └── com/example/demo/
│ │ ├── controller/
│ │ ├── service/
│ │ ├── repository/
│ │ ├── config/
│ │ └── DemoApplication.java
│ └── resources/
│ ├── application.properties
│ └── static/
│ └── templates/
└── test/└── java/└── com/example/demo/├── controller/├── service/├── repository/└── DemoApplicationTests.java
3.2 使用配置文件管理环境变量
使用 application.properties
文件管理环境变量,可以轻松地在不同环境中切换配置。建议为不同的环境创建不同的配置文件,如 application-dev.properties
、application-prod.properties
等。
3.3 使用 Actuator 监控应用
启用 Actuator 可以帮助开发者更好地监控和管理应用。建议启用以下端点:
/actuator/health
:健康检查/actuator/metrics
:度量指标/actuator/info
:应用信息
3.4 使用 Docker 部署应用
使用 Docker 部署应用可以提高部署的可靠性和一致性。建议为应用创建一个 Dockerfile,并使用 Docker Compose 管理多服务应用。
4. Spring Boot 面试题解析
4.1 什么是 Spring Boot?
答案:Spring Boot 是 Spring 框架的一个扩展,旨在简化新 Spring 应用的初始搭建和开发过程。它通过自动配置、起步依赖和生产就绪功能,使得开发者可以快速创建独立的、生产级别的基于 Spring 框架的应用程序。
4.2 Spring Boot 的核心特性有哪些?
答案:
- 自动配置:根据类路径中的 jar 包和
application.properties
文件中的配置,自动配置各种 Bean。 - 起步依赖:简化依赖管理,通过声明起步依赖快速引入一组相关的依赖。
- 生产就绪功能:提供一系列生产就绪功能,如外部化配置、健康检查、度量指标等。
4.3 @SpringBootApplication
注解的作用是什么?
答案:@SpringBootApplication
注解是一个组合注解,包含了以下几个注解:
@Configuration
:标记当前类为配置类。@EnableAutoConfiguration
:启用自动配置。@ComponentScan
:启用组件扫描,自动发现并注册 Bean。
4.4 如何启用 Actuator 端点?
答案:在 pom.xml
中添加 spring-boot-starter-actuator
依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后在 application.properties
文件中启用所需的端点,例如:
management.endpoints.web.exposure.include=health,info,metrics
4.5 如何使用 Docker 部署 Spring Boot 应用?
答案:首先,创建一个 Dockerfile 文件,内容如下:
FROM openjdk:11-jre-slim
COPY target/my-spring-boot-app.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
然后,构建 Docker 镜像并运行容器:
docker build -t my-spring-boot-app .
docker run -p 8080:8080 my-spring-boot-app
5. 总结
通过本文,我们详细介绍了 Spring Boot 的快速入门方法,并深入探讨了其核心原理,包括自动配置、起步依赖和生产就绪功能。理解这些核心原理对于开发高效、可靠的 Spring Boot 应用非常重要。希望本文对你有所帮助,欢迎继续关注后续文章!
6. 扩展阅读
- 官方文档:Spring Boot Reference Guide
- Spring Boot 官网:Spring Boot Official Website
- 书籍推荐:《Spring Boot in Action》、《Spring Boot Recipes》
如果你有任何疑问或建议,欢迎在评论区留言交流!
相关文章:
Spring Boot 快速入门与核心原理详解
引言 在上一篇文章中,我们详细探讨了 Spring 框架中的事件监听与发布机制。本文将转向 Spring Boot,介绍如何快速入门 Spring Boot,并深入探讨其核心原理。Spring Boot 是由 Pivotal 团队提供的全新框架,旨在简化 Spring 应用的初…...
UniApp 与微信小程序详细对比
UniApp 与微信小程序详细对比 1. 开发环境 微信小程序: 主要使用微信开发者工具提供模拟器、调试工具和性能监控只能开发微信小程序 UniApp: 主要使用 HBuilderX,但也支持 VS Code 等其他编辑器HBuilderX 提供可视化界面、代码提示、调试工…...
【用大模型提示工程处理NLP任务】
Batch API Prompt 工程 任务一:文本分类 任务二:情感分析 任务三:文档处理 任务四:信息抽取 任务五:机器翻译 任务六:生成任务 任务七:文本纠错 Batch API Prompt 工程 Batch API 适用于…...
适配器模式、代理模式(C++)
适配器模式: 定义:适配器模式是一种结构型设计模式,它允许接口不兼容的类一起工作。它通过将一个类的接口转换成客户端期望的另一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。 代理模式: 定义&a…...

unity 2d 近战攻击判定的三种方式以及精确获取碰撞点
精确获取碰撞点 核心是获取武器碰撞盒最顶点,然后获取敌人碰撞盒距离该点最近的点 /// <summary>/// 获取获取武器前端位置 碰撞盒最左或最右顶点/// </summary>/// <param name"collider"></param>/// <param name"…...

矩形函数的傅里叶变换——从一维到二维,从连续到离散
一维连续矩形函数的傅里叶变换 二维连续矩形函数的傅里叶变换 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P109 2D DFT 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系…...

潜水打捞系统助力,破解汽车打捞难题
随着人类活动的不断扩展,汽车落水事故频发,成为救援工作中的一大难题。汽车因其重量和结构特性,一旦沉入水体,打捞工作将面临巨大挑战。传统的打捞方法往往效率低下,且在操作过程中可能会对汽车造成进一步的损害&#…...

【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5 Note: 草稿状态,持续更新中,如果有感兴趣,欢迎关注。。。 0. 论文信息 article{lecun1998gradient, title{Gradient-based learning applied to document r…...
LeetCode 每日一题 2024/10/7-2024/10/13
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/7 871. 最低加油次数10/8 1436. 旅行终点站10/9 3171. 找到按位或最接近 K 的子数组10/10 3162. 优质数对的总数 I10/11 3164. 优质数对的总数 II10/12 3158. 求出出现两…...

ZYNQ使用XGPIO驱动外设模块(前半部分)
目录 目录 一、新建BD文档,添加ZYNQ处理器 1.BD文档: 2.在Vivado中,BD文件的生成过程通常包括以下步骤: 1)什么是Tcl Console: 3.PL部分是FPGA可编程逻辑部分,它提供了丰富的IO资源,可以用于实现各种硬件接口和功…...
【FastAdmin】全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架
全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架 1 引言 页面跳转是Web开发中的基本操作,不同的技术栈提供了不同的实现方法。本文将详细介绍在原生JavaScript、原生HTML、原生PHP、jQuery以及FastAdmin框架中实现页…...

从零开始搭建一个node.js后端服务项目
目录 一、下载node.js及配置环境 二、搭建node.js项目及安装express框架 三、集成nodemon,实现代码热部署 四、Express 应用程序生成器 一、下载node.js及配置环境 网上很多安装教程,此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0…...

自定义注解和组件扫描在Spring Boot中动态注册Bean(一)
博客主页: 南来_北往 系列专栏:Spring Boot实战 在Spring Boot中,自定义注解和组件扫描是两种强大的机制,它们允许开发者以声明性的方式动态注册Bean。这种方式不仅提高了代码的可读性和可维护性,还使得Spring Boot应用的…...

如何在 IDEA 中导入 Java 项目的 Git 仓库并启动
目录 前言1. 从 Git 仓库导入 Java 项目2. 配置 Maven2.1 配置 Maven 仓库和设置文件2.2 加载依赖 3. 配置 Tomcat 并运行项目3.1 配置 Tomcat3.2 配置 Server URL3.3 启动项目 4. 常见问题与解决方法4.1 Maven 依赖无法下载4.2 Tomcat 部署失败4.3 项目启动后无法访问 结语 前…...

BIO与NIO学习
BIO:同步阻塞IO,客户端一个连接请求(socket)对应一个线程。阻塞体现在: 程序在执行I/O操作时会阻塞当前线程,直到I/O操作完成。在线程空闲的时候也无法释放用于别的服务只能等当前绑定的客户端的消息。 BIO的代码实现 …...

麒麟操作系统:解决umount命令卸载USB存储设备时报“device is busy”错误
麒麟操作系统:解决umount命令卸载USB存储设备时报“device is busy”错误 1、问题描述2、问题解决方法步骤1:尝试强制卸载步骤2:查找占用设备的进程步骤3:终止占用进程步骤4:卸载USB设备 💐The Begin&#…...

Git客户端使用之TortoiseGit和Git
git客户端有两个分别是TortoiseGit和Git Git用于命令行TortoiseGit用于图形界面。无论是Git还是TortoisGit都需要生成公/私钥与github/gitlab建立加密才能使用。 一、先介绍Git的安装与使用 1、下载与安装 安装Git-2.21.0-64-bit.exe(去官网下载最新版64位的),安…...

regionprops函数详解及应用
一、regionprops函数及应用 regionprops 函数在 MATLAB 中是一个强大的工具,用于计算和分析二值图像(或更一般地说,标注矩阵)中连通区域的属性。当处理二值图像时,连通区域通常对应于图像中的前景对象,而背…...

FPAG学习(5)-三种方法实现LED流水灯
目录 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 1.1.2仿真代码 1.1.3仿真 1.2实验结果 1.2.1总结 2.循环移位实现LED流水灯 3.38译码器实现LED流水灯 3.1原理 3.2源程序 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 利用计数器计数到…...

科迅网络阅卷系统存在存储型XSS漏洞
漏洞描述 科迅网络阅卷系统存在存储型XSS漏洞,在项目列表添加项目的地方没有过滤用户的输入 漏洞复现 FOFA "科迅网络阅卷系统" POC <script>alert(/xss/)</script> <h1>1</h1>...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...