一、Spring Boot概述1.1 什么是 SpringBootSpringBoot 是由 Pivotal 团队后被 VMware 收购于 2014 年推出的基于 Spring 框架的开源框架它旨在简化 Spring 应用的初始搭建和开发过程。作为 Spring 生态系统的重要组成部分SpringBoot 并非替代 Spring而是在 Spring 基础上提供了一套约定优于配置的开发范式使开发者能够更快速地构建生产级别的 Spring 应用。SpringBoot 的核心思想是 约定优于配置Convention over Configuration通过提供一系列默认配置和自动化机制减少了传统 Spring 应用中繁琐的 XML 配置和手动依赖管理工作让开发者可以专注于业务逻辑的实现而非基础设施的配置。1.2 SpringBoot 的发展背景在 SpringBoot 问世之前基于 Spring 开发应用需要大量手动配置工作编写繁琐的 XML 配置文件手动管理各类依赖及其版本兼容问题部署流程复杂且步骤繁多需要手动集成与配置 Web 服务器这些问题极大降低了 Spring 应用的初始化与开发效率对初学者也不够友好。为了解决上述痛点SpringBoot 正式推出。它整合了 Spring 生态的最佳实践提供了一套极简、高效的 Spring 应用快速开发方案。自 2014 年正式发布以来SpringBoot 已经成为 Java 后端开发中最主流的框架之一。当前最新稳定版为 3.x 系列基于 Java 17 及以上版本和 Spring Framework 6.x 构建。1.3 SpringBoot 的核心特性1.3.1 自动配置Auto-configuration自动配置是 SpringBoot 的核心特性之一它可以依据类路径下所引入的依赖自动完成 Spring 应用的相关配置。SpringBoot 会自动识别类路径中的 Jar 包并根据依赖环境自动装配对应的 Spring Bean。例如若项目引入了 spring-webmvc 依赖SpringBoot 会自动配置 DispatcherServlet若检测到 H2 数据库相关依赖则会自动配置内存数据库自动配置的功能通过EnableAutoConfiguration注解开启而常用的SpringBootApplication注解已经组合包含了该注解无需重复配置。1.3.2 起步依赖Starter DependenciesSpringBoot 提供了一系列以spring-boot-starter-* 命名的依赖启动器每一个 starter 都集成了实现某一功能所需的全套依赖。例如spring-boot-starter-web内置了 Web 开发所需的 Spring MVC、Tomcat 等常用依赖spring-boot-starter-data-jpa包含了 Spring Data JPA 以及 Hibernate 等相关依赖spring-boot-starter-security集成了 Spring Security 全套相关依赖起步依赖有效解决了传统开发中常见的依赖版本冲突问题由 SpringBoot 自动统一管理各依赖的版本保证兼容性。1.3.3 嵌入式服务器Embedded ServersSpringBoot 内置了多种嵌入式 Web 服务器包括Tomcat默认JettyUndertow这使得 SpringBoot 应用可以直接打包为可执行 JAR 文件无需部署到外部服务器简化了应用的部署和运行流程。1.3.4 生产就绪特性Production-Ready FeaturesSpringBoot 提供了一系列适用于生产环境的特性应用监控通过 Spring Boot Actuator健康检查外部化配置日志管理应用指标收集这些特性使开发者能够轻松构建符合生产标准的应用程序。1.3.5 无代码生成和 XML 配置SpringBoot 完全摒弃了 XML 配置采用注解和 JavaConfig 的方式进行配置同时不需要任何代码生成保持了代码的简洁性和可维护性。1.3.6 开箱即用Out-of-the-boxSpringBoot 提供了合理的默认配置开发者可以 开箱即用无需手动配置即可启动应用。同时这些默认配置也可以根据需求进行自定义实现了灵活性和简便性的平衡。1.4 SpringBoot 的技术栈组成SpringBoot 构建在 Spring 生态系统之上并整合了多种常用技术核心框架Spring FrameworkWeb 框架Spring MVC数据访问Spring Data MybatisSpring Data MongoDBSpring Data Redis 等安全框架Spring Security依赖注入Spring IoC 容器嵌入式服务器Tomcat、Jetty、Undertow构建工具Maven、Gradle测试框架JUnit、Mockito、Spring Test1.5 SpringBoot 的应用场景SpringBoot 适用于各种 Java 应用开发场景Web 应用开发RESTful API、传统 Web 应用微服务架构作为微服务的基础框架企业级应用整合各种企业级组件数据处理应用批处理任务、数据 ETL云原生应用适合开发部署在云环境的应用物联网应用设备数据采集和处理无论是小型应用还是大型企业级系统SpringBoot 都能提供高效的开发体验。1.6 SpringBoot 与其他技术的关系与 Spring FrameworkSpringBoot 是 Spring Framework 的扩展和简化不是替代关系与 Spring CloudSpringBoot 是 Spring Cloud 的基础Spring Cloud 构建在 SpringBoot 之上提供微服务治理能力与 Jakarta EESpringBoot 可以替代传统的 Jakarta EE 应用开发提供更简洁的开发方式与微服务SpringBoot 是构建微服务的理想选择但本身不是微服务框架1.7 为什么选择 SpringBoot提升开发效率简化大量配置工作使开发者更专注于业务逻辑实现简化部署以可执行 JAR 包形式独立运行无需额外部署 Web 服务器降低学习门槛提供统一的开发规范减少对底层框架细节的关注社区生态完善拥有活跃的社区支持与全面详尽的官方文档扩展性优秀支持按需自定义配置可灵活扩展各类功能无缝整合主流技术可轻松对接各类主流框架与第三方工具适配敏捷开发支持快速搭建与迭代有效缩短项目开发周期SpringBoot 现已成为 Java 后端开发的事实标准熟练掌握 SpringBoot 已成为当代 Java 开发者的核心必备技能。二、单体应用和微服务应用单体架构是一种传统的应用架构模式它将用户、订单、支付等所有功能模块打包在同一个应用内运行在单个进程中统一部署。单体应用的优缺点优点开发简单架构清晰整体技术成本较低便于测试所有功能集中在一个项目测试更加便捷部署方便只需一个 Tomcat 环境即可完成部署缺点代码体量庞大可读性差不利于维护代码编译与项目启动速度逐渐变慢系统耦合度高一处改动容易影响整体扩展性差无法针对单个业务模块独立扩容在大数据量、高并发场景下表现不佳技术栈单一难以灵活更新升级模块与业务之间耦合度高微服务是在 SOA 架构基础上发展而来的新型架构。简单来说就是把原来的单体应用按业务拆分成多个独立运行的小型服务每个服务只负责一项核心业务还可以拥有独立的数据库。多个微服务相互协同共同完成整个系统的业务功能。如果某个微服务压力较大还可以单独对其进行集群扩容。三、Spring Boot入门程序3.1 创建springboot项目可能出现的问题错误信息如下:解决办法:1、打开idea最上角file选项的new-project…2、点击spring initalizr 选择Server URL把值设置为http://start.springboot.io/ 或者 http://start.aliyun.com如果还是有问题可以参考https://www.cnblogs.com/wangdahui/p/13501981.html3.2 Spring Initializer快速创建Spring Boot项目jar第二步 加入web场景启动器依赖包到pom.xml文件注意事项: !-- web项目SpringBoot启动器依赖 针对3.X.X版本使用web-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- web项目SpringBoot启动器依赖 针对4.X.X版本使用webmvc -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webmvc/artifactId /dependency第三步 创建controllerHelloController.javaController public class HelloController { ResponseBody RequestMapping(/hello) public String helloTest(){ return hello springboot....; } }源码的写法和我们之前的写法定义是一样的可以写daoservicecontroller等第四步启动springboot项目找到带有 SpringBootApplication 注解的主类运行 main 方法启动 SpringBoot 应用项目启动可以看到springboot标志运行结果:3.3 Spring Initializer快速创建Spring Boot项目war第一步创建项目项目会自动加入web模块场景启动器依赖:第二步项目结构解析java文件夹目录结构中自动创建好指定包和Spring Boot启动主程序SpringbootApplication.classresources文件夹中目录结构static保存所有的静态资源 js css imagestemplates保存所有的模板页面Spring Boot默认jar包使用嵌入式的Tomcat默认不支持JSP页面可以使用模板引擎freemarker、thymeleafapplication.propertiesSpring Boot应用的配置文件可以修改一些默认设置第三步查看springboot的主程序SpringBootApplication注解说明:这个类是SpringBoot的主配置类SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用并将主配置类SpringBootApplication标注的类的所在包及下面所有子包里面的所有组件扫描到Spring容器,就不需要再写注解扫描器了第四步编写Controller代码HelloController.javapackage com.sy.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; Controller public class HelloController { ResponseBody RequestMapping(/hello) public String helloTest(){ return hello word2....; } }第五步运行主程序并进行测试注意如果使用外部tomcat部署当前war类型的springboot项目要在项目中加入以下类建议使用springboot内置tomcatServletInitializer文件的主要作用是配置Servlet初始化使得Spring Boot应用程序能够以WAR包的形式部署在外部的Servlet容器中如Tomcat. 外部tomcat启动后springboot项目会自动调用该类的 configure方法并加载主程序加载springboot初始化配置3.4 Maven项目转springboot项目创建普通的Maven项目, 如果想让当前Maven项目成为springboot项目需要添加如下依赖:pom.xmlparent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.5.9/version relativePath/ !-- lookup parent from repository -- /parent dependencies !-- web项目SpringBoot启动器依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId scopeprovided/scope /dependency !-- SpringBoot单元测试依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependenciesHelloController类:package com.sy.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; Controller public class HelloController { ResponseBody RequestMapping(/hello) public String helloTest(){ return maven springboot....; } }运行主程序并进行测试:四、Spring Boot配置文件配置文件是 Spring Boot 应用中至关重要的一部分主要用于统一管理项目中的各项配置信息。Spring Boot 提供了灵活易用的配置机制支持多种格式和丰富的配置方式。它使用全局唯一的配置文件文件名固定项目启动时会被框架自动加载。最常用的两种格式为application.propertiesapplication.yml 或 application.yaml配置文件的核心作用覆盖 Spring Boot 自动配置的默认值在项目启动时根据配置自动注册并装配对应的组件4.1 yml / yaml 配置文件YAML以数据为中心比json、xml等更适合做配置文件4.1.1 基本语法– 使用缩进表示层级关系– 缩进的空格数目不重要只要相同层级的元素左侧对齐即可- 键值对中间必须要有空格, k:(空格)v4.1.2 值的写法YAML 支持的三种数据结构:1.字面量普通的值数字、字符串、布尔server: port: 8081 #注意字符串默认不用加上单引号或者双引号 #双引号特殊符号表示转义符本身 name01: zhangsan \n lisi # 输出zhangsan 换行 lisi #单引号特殊字符就表示字符本身 同级key不能重复 name02: zhangsan \n lisi # 输出zhangsan \n lisi2.对象、Map键值对person: name: zhangsan age: 12 #另一种行内写法 person: {name: zhangsan,age: 12}3.集合List, Sethobbies: - singing - dancing - running #用-空格值表示集合中的一个元素 #另一种行内写法 hobbies: [singing,dancing,running]语法格式:server: port: 8081 # 设置springmvc的视图解析器前缀和后缀, 默认为空 如果不设置使用时需要再返回时拼接 spring: mvc: view: prefix: / suffix: .html #注意字符串默认不用加上单引号或者双引号 #双引号特殊符号表示转义符本身 name01: zhangsan \n lisi # 输出zhangsan 换行 lisi #单引号特殊字符就表示字符本身 同级key不能重复 name02: zhangsan \n lisi #输出zhangsan \n lisi name03: true name04: 3.14 #对象格式写法 book01: id: 1 title: java学习 price: 45.0 #或者 book02: {id:1, title:java从入门到精通, price:99.0} #集合写法 hobbies01: - singing - dancing - running #用-空格值表示集合中的一个元素 #另一种行内写法 hobbies02: [singing,dancing,running]总结以上配置的作用:可以为配置文件的默认值或者值, 进行修改可以为实体类进行赋值4.1.3 配置文件值的注入1.构建Bean对象Person.java/** * 以前使用依赖注入形式 * 现在我们使用ConfigurationProperties将本类中的所有属性和配置文件中相关的配置进行绑定 */ //只有spring容器中的对象才能自动进行数据绑定 Component // 1.如果让application.yml文件给当前Person对象中的属性赋值要先找到当前类 // 2.我们可以通过当前类中声明的ConfigurationProperties注解的前缀prefix person去寻找 ConfigurationProperties(prefix person) Data public class Person { private String pname; private int age; private boolean success; private Date birth; private Car car; private MapString,Object maps; private ListObject lists; }Car.javaData public class Car { private int cid; private String cname; private double cprice; }2.构建配置文件person: pname: 柳岩 age: 20 success: true birth: 2025/02/20 # 汽车对象 car: cid: 1001 cname: 宝马 cprice: 100000 # 给maps集合赋值 # maps: {name:刘涛, age:30} maps: name: 宝强 age: 20 # 给lists集合赋值 # lists: # - 抽烟 # - 喝酒 # - 烫头 lists: [抽烟, 喝酒, 蹦迪]3.执行单元测试查看person对象的值Day01Springboot04ApplicationTests.javaSpringBootTest class Day01Springboot04ApplicationTests { Autowired private Person person; Test void contextLoads() { System.out.println(person); } }4.引入配置文件处理器插件!-- 作用编辑配置文件时会有相关提示信息 注如果加入pom后无法使用 加入后把项目清理打包一下会生效不生效的话关闭idea重启 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-configuration-processor/artifactId optionaltrue/optional version2.6.7/version /dependency4.2 properties 配置文件4.2.1 properties语法以KEYVALue键值对的方式设置值4.2.2 值的写法1.字面量普通的值数字字符串布尔name张三2.对象、Map属性和值键值对)#指定访问当前项目的名称 server.servlet.context-path/demo02 person.name张三 person.age12 maps.key1value1 maps.key2value23.集合List,Sethobbiessinging,dancing,running4.2.3 配置文件值的注入1.构建bean对象Person.java/** * 以前使用依赖注入形式 * 现在我们使用ConfigurationProperties将本类中的所有属性和配置文件中相关的配置进行绑定 */ //只有spring容器中的对象才能自动进行数据绑定 Component // 1.如果让application.yml文件给当前Person对象中的属性赋值要先找到当前类 // 2.我们可以通过当前类中声明的ConfigurationProperties注解的前缀prefix person去寻找 Data ConfigurationProperties(prefix person) public class Person { private String pname; private int age; private boolean success; private Date birth; private Car car; private MapString,Object maps; private ListObject lists; }Car.javaData public class Car { private int cid; private String cname; private double cprice; }2.构建配置文件person.pname柳岩 person.age20 person.successfalse person.birth2025/02/20 person.car.cid1001 person.car.cname奥迪 person.car.cprice200000 person.maps.name刘涛 person.maps.age22 person.lists唱歌,跳舞,rapper3.执行单元测试查看person对象的值Day01Springboot05ApplicationTests.javaSpringBootTest class Day01Springboot05ApplicationTests { Autowired private Person person; Test void contextLoads() { System.out.println(person); } }注意如果输出有中文乱码问题修改idea编码格式后删除properties配置文件重新创建多个配置文件加载顺序如果在项目中即存在application.yml也存在application.properties配置文件时优先级规则如果项目中同时存在application.properties和application.yml文件application.properties的优先级高于application.yml。这意味着如果两个文件中都定义了相同的属性例如: server.portapplication.properties中的值会覆盖application.yml的值。加载顺序SpringBoot会先加载application.properties文件中的配置文件然后加载application.yml文件中的配置然后由于优先级的原因即使application.yml中的配置被加载其值也会被application.properties中的相同属性覆盖。4.3 多环境配置在实际 Java 项目开发中我们通常会面对多个运行环境例如开发环境、测试环境以及生产环境。不同环境往往需要不同的配置比如数据库地址、服务端口、日志级别等。如果没有一套灵活的方式来管理多环境配置项目配置会变得杂乱不堪维护成本也会大幅提高。那么在实际工作里我们是如何实现在对应环境自动加载对应配置的呢Spring Boot 提供了完善的多环境配置管理能力可以根据当前运行环境自动加载对应的配置文件让应用在不同环境下既保持行为一致又具备足够的灵活性。通过合理使用 Spring Boot 提供的 Profile 机制我们可以在开发、测试、生产等环境之间灵活切换配置避免了硬编码带来的隐患显著提升了系统的可维护性。多环境配置的应用场景开发阶段常需配置本地数据库、启用调试模式以及各类开发工具的专属参数以保障开发效率。测试阶段需进行单元测试与集成测试通常要求对接测试环境的数据库与第三方服务并需依据测试要求灵活配置运行环境。生产阶段则要求更高的安全与性能配置比如使用外部服务、配置生产级数据库连接以及执行严格的日志管理策略。若在每次环境切换时都需手动修改application.yml中的数据库连接地址、服务端口、加密密钥等关键配置不仅开发效率极低还极易因人为失误导致系统故障。指定环境的配置方式Profile 是 Spring 提供的多环境配置切换机制可以通过激活、指定参数等方式快速让应用在不同环境下加载对应的配置。1、多文件多环境配置格式application-{profile}.properties/yml其中{profile}代表环境标识。例如可以在项目中创建application-dev.propertiesapplication-test.propertiesapplication-prod.propertiesapplication.properties默认加载application.properties可通过配置propertiesspring.profiles.active环境标识来指定使用某一环境的配置。2、YAML 单文件多环境配置同样支持多环境文件形式例如application-dev.ymlapplication-test.ymlapplication-prod.ymlapplication.yml默认加载application.yml可在配置文件中指定激活环境yamlspring: profiles: active: dev # 激活开发环境3、激活方式在配置文件中指定spring.profiles.activedev命令行方式启动shelljava -jar springboot-0.0.1-SNAPSHOT.jar --spring.profiles.activedev案例实现项目中设置多个开发环境的配置文件2.设置使用指定的配置文件3.运行测试运行后先加载application.properties配置文件再加载application-prod.properties配置文件