Spring Boot 第一天知识汇总

一、Spring Boot 是什么?

简单说,Spring Boot 是简化 Spring 应用开发的框架 —— 它整合了整个 Spring 技术栈,提供了 “一站式” J2EE 开发解决方案。

核心优点

  • 快速创建独立运行的 Spring 项目,无需繁琐配置;
  • 内置 Tomcat、Jetty 等 Servlet 容器,应用无需打 war 包,直接用 java -jar 运行;
  • 提供 “启动器(Starter)” 自动管理依赖,避免版本冲突;
  • 大量自动装配,开箱即用,还能灵活修改默认值;
  • 无需 XML 配置,纯注解开发;
  • 自带准生产环境监控(如健康检查、指标收集)。

二、Spring Boot 项目创建方式

1. 手动创建(Maven 项目改造)

适合想深入理解依赖关系的场景,步骤如下:

  1. 新建 Maven 项目(打包方式选 jar);
  2. 在 pom.xml 中添加父工程(统一版本管理):
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> <!-- 版本可按需选择 -->
    </parent>
    
  3. 导入所需场景的启动器(如 web 开发):
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
    </dependencies>
    
  4. 编写主程序类(启动入口):
    @SpringBootApplication
    public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
    }
    
  5. 编写 Controller 等业务代码,运行 main 方法即可启动。

2. 快速创建(Spring Initializer)

适合快速开发,IDE(如 IDEA、Eclipse)都支持:

  1. 新建项目时选择 “Spring Initializr”;
  2. 填写项目信息(Group、Artifact 等);
  3. 勾选所需依赖(如 Web、MySQL、MyBatis 等);
  4. 生成项目后,主程序类、目录结构已自动创建,直接编写业务代码即可。

三、为什么说 “约定大于配置”?

这是 Spring Boot 最核心的思想,简单理解:提前约定好一套规范,开发者无需手动配置,按约定开发即可

在传统开发中,很多工作需要通过配置文件(如 XML、JSON、注解等)明确指定细节(比如类的位置、方法的映射规则、资源的路径等)。但这些配置往往是 “重复性” 的 —— 大多数项目的需求是相似的,比如 “控制器类通常放在controller目录”“数据库表名通常和实体类名对应”。

“约定大于配置” 的本质是:框架或工具预先定义这些 “常见规则” 作为 “约定”,开发者只需遵循约定,就能省略这些重复配置;只有当需求特殊(比如想把控制器放在api目录而非controller),才需要手动配置来 “覆盖约定”。

比如:

Spring Boot 的目录约定

早期的 Spring 框架需要大量 XML 配置来指定 “哪个类是控制器”“哪个方法映射哪个 URL”“服务类如何注入”。而 Spring Boot 采用 “约定大于配置” 后,通过目录结构约定简化了这些工作:

  • 约定:src/main/java/com/xxx/controller 目录下的类默认是控制器(无需额外注解声明 “这是控制器”);
  • 约定:src/main/java/com/xxx/service 目录下的类默认是服务层(框架会自动扫描并管理依赖注入);
  • 约定:配置文件默认放在 src/main/resources/application.properties(无需指定 “配置文件在哪”);
  • 约定:Web 应用默认端口是 8080(无需配置 “服务器端口”)。

好处:减少重复配置,提高开发效率,团队协作更规范(大家都按同一套约定开发)。

四、Starter 启动器:依赖管理的 “万能钥匙”

Starter(启动器) 是 “约定大于配置” 理念的典型实践,也是 Spring Boot 对 “场景化开发” 的解决方案:一个 Starter 对应一个开发场景,导入它就会自动包含该场景所需的所有依赖

传统的 Spring 项目开发中,开发者需要手动做两件麻烦事:

  • 依赖管理:为了实现某个功能(如 Web 开发),需要手动引入一系列相关依赖(如 Spring MVC、Tomcat、Jackson 等),且要保证依赖版本兼容,否则容易出现 “jar 包冲突”。
  • 基础配置:引入依赖后,还需要手动配置基础组件(如 DispatcherServlet、数据源、事务管理器等),配置繁琐且重复。

Starter 的出现就是为了解决这两个问题:它通过 “预定义约定”,把某一场景所需的依赖、默认配置打包好,开发者只需引入一个 Starter,就能自动获得该场景的所有必要支持。

比如:

  • spring-boot-starter-web:包含 web 开发所需的 Spring MVC、Tomcat、JSON 解析等依赖;
  • spring-boot-starter-jdbc:包含 JDBC 开发所需的数据源、事务管理等依赖;
  • spring-boot-starter-test:包含单元测试所需的 JUnit、Mockito 等依赖。

使用方式:只需在 pom.xml 中添加对应的 Starter 依赖,Spring Boot 会自动处理依赖传递和版本匹配,无需手动导入一堆 jar 包。

五、Spring Boot 整合单元测试

Spring Boot 简化了单元测试流程,只需两步:

  1. 导入测试 Starter

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
    </dependency>
    
  2. 编写测试类
    用 @SpringBootTest 标注测试类(自动加载 Spring 上下文),结合 JUnit 的 @Test 即可:

    @SpringBootTest // 加载 Spring 容器
    public class UserControllerTest {@Autowiredprivate UserController userController; // 注入要测试的组件@Testpublic void testHello() {String result = userController.hello();System.out.println(result); // 输出测试结果}
    }
    

Spring Boot 整合单元测试和spring区别 

一、依赖管理与配置

对比项传统 SpringSpring Boot
依赖引入手动添加 JUnit、Mockito、Spring Test 等依赖,需处理版本兼容问题。通过 spring-boot-starter-test 一键引入所有测试依赖,自动管理版本。
配置文件需要手动配置 applicationContext.xml 或 Java 配置类,指定组件扫描路径、数据源等。自动加载默认配置,仅需 application.properties 覆盖少数自定义配置。
测试环境搭建需使用 @ContextConfiguration 注解指定配置文件或配置类。使用 @SpringBootTest 自动加载完整 Spring 上下文,或通过切片测试(如 @WebMvcTest)加载部分组件。

二、测试注解与框架支持

对比项传统 SpringSpring Boot
核心测试注解@RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration@SpringBootTest(替代前者) + 切片测试注解(如 @WebMvcTest@DataJpaTest
模拟 HTTP 请求使用 MockMvcBuilders.standaloneSetup() 手动配置 MockMvc。自动注入 MockMvc,通过 @AutoConfigureMockMvc 启用。
数据库测试需手动配置嵌入式数据库(如 H2)或使用内存数据库。自动配置嵌入式数据库,支持 @DataJpaTest 专用注解。
属性配置测试需使用 @TestPropertySource 手动指定测试配置文件。支持 @TestConfiguration 或直接在测试类中覆盖属性。

三、测试效率与简化程度

场景传统 SpringSpring Boot
单元测试(Service)java<br>@RunWith(SpringJUnit4ClassRunner.class)<br>@ContextConfiguration(classes = AppConfig.class)<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 测试代码<br>}java<br>@SpringBootTest<br>public class UserServiceTest {<br> @Autowired<br> private UserService userService;<br> // 测试代码<br>}
Controller 测试需手动配置 Controller、Service Mock 和视图解析器。java<br>@WebMvcTest(UserController.class)<br>public class UserControllerTest {<br> @Autowired<br> private MockMvc mockMvc;<br> @MockBean<br> private UserService userService;<br> // 测试代码<br>}
数据库集成测试需配置数据源、事务管理器,手动回滚数据。java<br>@DataJpaTest<br>public class UserRepositoryTest {<br> @Autowired<br> private UserRepository userRepository;<br> // 测试代码(自动回滚)<br>}

六、Spring Boot 如何扫描组件?

Spring Boot 会自动扫描并加载容器中的组件(@Controller、@Service、@Component 等),扫描范围由 主程序类(@SpringBootApplication 标注)所在包及所有子包 决定。

比如:

  • 主程序类在 com.example.demo 包下;
  • 则 com.example.demo.controllercom.example.demo.service 等子包中的组件会被自动扫描;
  • 若组件放在 com.example.other 包(主程序类所在包的外部),则需要手动添加 @ComponentScan("com.example.other") 配置。

七、YAML 配置文件:比 properties 更优雅

Spring Boot 支持 application.yml 作为配置文件,语法比 application.properties 更简洁,适合复杂配置。

基本语法:

  • 用 k: v 表示键值对(冒号后必须有空格);
  • 用缩进表示层级关系(不允许用 tab,建议 2 个空格);
  • 大小写敏感。

示例:

# 配置服务器端口
server:port: 8081servlet:context-path: /demo # 项目访问路径# 配置自定义对象
person:name: 张三age: 20boss: falsebirth: 2003-01-01maps: {k1: v1, k2: v2} # Map 写法lists: [篮球, 足球] # List 写法dog: # 对象嵌套name: 旺财age: 3

如何读取配置?

用 @ConfigurationProperties 绑定配置到 Java 类:

@Component
@ConfigurationProperties(prefix = "person") // 绑定配置文件中 prefix 为 person 的属性
public class Person {private String name;private Integer age;// 省略 get/set 方法
}

八、自动装配原理:Spring Boot 如何 “自动” 工作?

自动装配是 Spring Boot “开箱即用” 的核心,简单说:Spring Boot 会根据导入的 Starter 和配置,自动创建并配置所需的组件(比如导入 web starter 会自动配置 DispatcherServlet)。

自动装配的本质是Spring 框架在启动时动态扫描并注册 Bean,但 Spring Boot 在此基础上增加了条件判断约定配置

  1. 条件判断:通过 @Conditional 系列注解,根据类路径、配置属性、Bean 存在性等条件决定是否注册 Bean。
  2. 约定配置:框架预定义了一套默认配置(如数据源、Web 服务器),开发者只需引入依赖即可触发相应配置。

核心依赖三个注解:

  1. @SpringBootApplication
    主程序类的核心注解,是一个 “组合注解”,包含:

    • @SpringBootConfiguration:标记当前类为配置类(相当于 @Configuration);
    • @EnableAutoConfiguration:开启自动配置(核心);
    • @ComponentScan:指定组件扫描范围(默认主程序类所在包)。
  2. @EnableAutoConfiguration
    开启自动配置的 “开关”,通过 @Import(EnableAutoConfigurationImportSelector.class) 向容器中导入自动配置类(xxxAutoConfiguration)。

    原理:启动时会扫描所有 jar 包中 META-INF/spring.factories 文件,加载其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的配置类(如 HttpEncodingAutoConfigurationDataSourceAutoConfiguration 等),这些类会自动配置所需组件。

  3. @ConfigurationProperties
    将配置文件中的属性(如 application.yml 中的 person.name)绑定到 Java 类的属性上,实现配置与代码的解耦。

九、Spring Boot 项目演变史

从传统 Java 开发到 Spring Boot,经历了多个阶段:

  1. Servlet 时代:纯手动编写 Servlet、配置 web.xml,开发效率极低;
  2. SSH/SSM 时代:SSH(Struts + Spring + Hibernate)、SSM(Spring + SpringMVC + MyBatis)简化了开发,但仍需大量 XML 配置;
  3. 单体应用:所有功能打包成一个 war 包,部署到 Tomcat,适合小型项目,但迭代和扩展困难;
  4. SOA(面向服务架构):将系统拆分为多个服务,通过服务总线通信,但服务耦合度仍较高;
  5. 微服务:2014 年 Martin Fowler 提出,将系统拆分为独立部署的小型服务(每个服务专注一个功能),通过 HTTP 通信。Spring Boot 因简化配置、内置容器等特点,成为微服务开发的首选框架。

十、架构对比:垂直架构、单体架构与微服务

架构类型特点优点缺点
垂直架构按业务垂直划分(如电商的订单系统、用户系统独立部署)简单直接,初期开发快服务重复开发,数据冗余
单体架构所有功能打包成一个应用(如一个 war 包包含所有模块)部署简单,调试方便代码臃肿,迭代慢,故障影响整体
微服务拆分为独立部署的小型服务(每个服务有自己的数据库和接口)独立迭代、扩展灵活,技术栈多样分布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90099.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql主从部署

MySql主从部署 1、操作环境 硬件环境&#xff1a;香橙派5 aarch64架构 软件环境&#xff1a;Ubuntu 22.04.3 LTS 软件版本&#xff1a;mysql-8.0.42 操作方式&#xff1a;mysql_1,mysql_2容器 主节点&#xff1a;mysql_1 启动命令&#xff1a;docker run --name mysql_master \…

Redis——Redis进阶命令集详解(下)

本文详细介绍了Redis一些复杂命令的使用&#xff0c;包括Redis事务相关命令&#xff0c;如MULTI、EXEC、DISCARD 和 WATCH ,发布订阅操作命令&#xff0c;如PUBLISH 、SUBSCRIBE 、PSUBSCRIBE ,BitMap操作命令&#xff0c;如SETBIT、GETBIT、BITCOUNT、BITOP&#xff0c;HyperL…

C#使用socket报错 System.Net.Sockets.SocketException:“在其上下文中,该请求的地址无效。

bind: 在其上下文中&#xff0c;该请求的地址无效。问题定位 程序中运行socket服务端程序时&#xff0c;绑定的IP地址无效&#xff0c;即请求的IP地址在你的机子上找不到。原因有以下几种可能&#xff1a; 1&#xff09;server端绑定的IP地址不是本机的IP地址。 2&#xff09;之…

计算机底层入门 05 汇编学习环境通用寄存器内存

2.3 汇编学习环境我们通过上一章笔记&#xff0c;得知 计算机好像 只会通过位运算 进行 数字的加法。 而机器语言的魅力就是 位运算&#xff0c;解析规则。它们也都是通过 电路 来进行实现的。这就是 计算机最底层的本质了&#xff01;&#xff01;&#xff01; 汇编语言 所谓的…

Java学习---Spring及其衍生(上)

在 Java 开发领域&#xff0c;Spring 生态占据着举足轻重的地位。从最初的 Spring 框架到后来的 SpringBoot、SpringMVC 以及 SpringCloud&#xff0c;每一个组件都在不同的场景下发挥着重要作用。本文将深入探讨这几个核心组件&#xff0c;包括它们的定义、原理、作用、优缺点…

LVGL应用和部署(个人开发嵌入式linux产品)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】随着经济越来越走向常态化发展&#xff0c;将来的公司基本是两个趋势&#xff0c;一个是公司越做越大&#xff0c;越来越趋向于垄断&#xff1b;另外…

CPU,减少晶体管翻转次数的编码

背景 以4比特为单位&#xff0c;共16个数。仔细思考状态转换过程中的晶体管翻转次数。 0000 0001&#xff0c;1 0010&#xff0c;2 0011&#xff0c;1 0100&#xff0c;3 0101&#xff0c;1 0110&#xff0c;2 0111&#xff0c;1 1000&#xff0c;4 1001&#xff0c;1 1010&…

LLM 中的 温度怎么控制随机性的?

LLM 中的 温度怎么控制随机性的? 在LLM的解码过程中,温度(Temperature)通过调整token概率分布的“陡峭程度”来控制随机性:温度越低,概率分布越陡峭(高概率token的优势越明显),随机性越低;温度越高,分布越平缓(高低概率token的差异被缩小),随机性越高。 温度,…

freemodbus使用

文章目录✅ **CubeMX配置**1. UART配置&#xff08;RS485通信&#xff09;2. Timer配置&#xff08;RTU字符间隔检测&#xff09;3. GPIO配置&#xff08;RS485方向控制&#xff09;✅ **STM32F103 RS485 FreeModbus RTU 配置概览****1️⃣ CubeMX硬件配置****2️⃣ FreeModb…

【Ansible】Ansible 管理 Elasticsearch 集群启停

一、集群节点信息 通过 Ansible inventory 定义的集群节点分组如下&#xff1a;[es]&#xff08;Elasticsearch 节点&#xff09; 192.168.100.150192.168.100.151192.168.100.152[logstash]&#xff08;Logstash 节点&#xff09; 192.168.100.151[kibana]&#xff08;Kibana …

Effective Python 第15条 不要过分依赖给字典添加条目时所用的顺序

引言&#xff1a;字典顺序的重要性 在Python编程中&#xff0c;字典&#xff08;dict&#xff09;是一种常用的数据结构&#xff0c;用于存储键值对。然而&#xff0c;字典的迭代顺序问题常常困扰着开发者。从Python 3.7开始&#xff0c;字典保证了键的插入顺序&#xff0c;这一…

事务隔离级别和传播方式

事务隔离级别 事务隔离级别是数据库系统中控制事务间相互影响程度的重要机制。不同的隔离级别在数据一致性保证和系统性能之间提供不同的权衡选择。下面我将详细解析四种标准隔离级别、它们能解决的问题以及可能存在的并发问题。 一、四种标准隔离级别 1. 读未提交 (Read Uncom…

不同地区的主要搜索引擎工具

研究seo&#xff0c;想汇总一下不同国家的搜索引擎工具&#xff0c;顺带了解一下这些公司提供的服务。 韩国&#xff1a;NAVER——>LINE 日本: 我还不知道&#xff0c;如果你知道可以评论告诉我 俄罗斯&#xff1a;yandex yandex有点像本土化的google 搜索引擎 邮箱 网盘 在…

实操:AWS CloudFront的动态图像转换

概述 适用于 Amazon CloudFront 的动态图像转换&#xff08;前身为无服务器图像处理器&#xff09;&#xff0c;通过 Amazon CloudFront 的全球内容分发网络&#xff08;CDN&#xff09;实现实时图像处理。此 AWS 解决方案可帮助您优化视觉内容交付&#xff0c;同时显著降低运营…

Spring Boot 实战详解:从静态资源到 Thymeleaf 模板引擎

Spring Boot 凭借其 "约定大于配置" 的理念&#xff0c;极大简化了 Java 应用开发流程。本文将从 Spring Boot 核心特性出发&#xff0c;详细解析静态资源映射规则、Thymeleaf 模板引擎的使用&#xff0c;并结合完整实战案例&#xff0c;帮助开发者快速上手 Spring B…

docker的镜像与推送

docker build# 1. 基本构建命令&#xff08;使用当前目录的 Dockerfile&#xff09; docker build .# 2. 指定 Dockerfile 路径和构建上下文 docker build -f /path/to/Dockerfile /path/to/build/context# 3. 为镜像设置名称和标签 docker build -t my-image:latest .# 4. 设置…

计算机网络学习----域名解析

在互联网世界中&#xff0c;我们习惯通过域名&#xff08;如www.example.com&#xff09;访问网站&#xff0c;而非直接记忆复杂的 IP 地址&#xff08;如 192.168.1.1&#xff09;。域名与 IP 地址之间的转换过程&#xff0c;就是域名解析。它是互联网通信的基础环节&#xff…

构建高性能推荐系统:MixerService架构解析与核心实现

——深入剖析推荐服务的分层设计、工作流引擎与高可用策略 一、整体架构与分层设计 该推荐服务采用经典分层架构模式​7&#xff0c;各层职责清晰&#xff1a; ​HTTP接口层​ 支持 GET/POST 请求解析&#xff0c;自动映射参数到 RcmdReq 协议对象统一错误处理&#xff1a;参…

【安全漏洞】隐藏服务器指纹:Nginx隐藏版本号配置修改与重启全攻略

🚀 隐藏服务器指纹:Nginx配置修改与重启全攻略 你是否知道,默认情况下Nginx会在HTTP响应头中暴露版本号?这个看似无害的Server: nginx/1.x.x字段,实则可能成为黑客的"藏宝图"。今天我们就来揭秘如何通过简单配置提升服务器安全性,并手把手教你完成Windows环境…

构建RAG智能体(2):运行状态链

在现代AI应用开发中&#xff0c;如何让聊天机器人具备记忆能力和上下文理解是一个核心挑战。传统的无状态对话系统往往无法处理复杂的多轮对话场景&#xff0c;特别是当用户需要提供多种信息来完成特定任务时。 本文就来讨论一下如何利用runnable来编排更有趣的语言模型系统&a…