近40000字带你走完Spring Boot工程开发流程

Spring Boot 项目开发流程全解析 Spring Boot 项目开发流程涵盖了从环境准备到部署的各个环节,通过合理的规划和实践,可以高效地开发出稳定、可靠的应用程序。在开发过程中,关键要点包括正确选择依赖、合理设计项目结构、编写高质量的测试代码以及灵活配置项目。希望本文对大家在 Spring Boot 项目开发中有所帮助。 阅读详情

1. 关于Spring Boot

Spring Boot是Spring官方的一个产品,其本质上是一个基于Maven的、以Spring框架作为基础的进阶框架,很好的支持了主流的其它框架,并默认完成了许多的配置,其核心思想是“约定大于配置”。

2. 创建Spring Boot工程

在IntelliJ IDEA中,在创建向导中选择Spring Initializer即可开始创建Spring Boot工程,在创建向导的界面中,需要关注的部分有:

  • Group Id

  • Artifact Id

以上2个值会共同构成一个Package name,如果Artifact Id的名字中有减号,在Package name中会去除,推荐手动添加小数点进行分隔。

由于Spring Boot官方更新版本的频率非常高,在创建项目时,随便选取某个版本均可,当项目创建成功后,推荐打开pom.xml,将<parent>中的<version>(即Spring Boot父项目的版本)改成熟悉的版本,例如:2.5.9

在创建过程中,还可以在创建向导的界面中勾选所需要依赖项,如果创建时没有勾选,也可以在创建工程之后手动在pom.xml中添加。

3. Spring Boot工程的结构

由于Spring Boot工程本质上就是一个Maven工程,所以,目录结构基本上没有区别。

与普通Maven工程最大的不同在于:Spring Boot工程在src\main\java和src\test\java下默认已经存在Package,是创建项目时指定的Package,**需要注意:此Package已经被配置为Spring执行组件扫描的根包,所以,在编写代码时,所有的组件类都必须放在此包或其子孙包中!**通常,推荐将所有的类(及接口)都创建在此包及其子孙包下。

在src\main\java下的根包下,默认就已经存在某个类,其类名是创建项目时指定的Artifact与Application单词的组合,例如BootDemoApplication,此类中有main()方法,执行此类的main()就会启动整个项目,如果当前项目是Web项目,还会自动将项目部署到Web服务器并启动服务器,所以,此类通常也称之为“启动类”。

在启动类上,默认添加了@SpringBootApplication注解,此注解的元注解中包含@SpringBootConfiguration,而@SpringBootConfiguration的元注解中包含@Configuration,所以,启动类本身也是配置类!所以,允许将@Bean方法写在此类中,或者某些与配置相关的注解也可以添加在此类上!

在src\test\java下的根包下,默认就已经存在某个类,其类名是在启动类的名称基础上添加了Tests单词的组合,例如BootDemoApplicationTests,此类默认没有添加public权限,甚至其内部的默认的测试方法也是默认权限的,此测试类上添加了@SpringBootTest注解,其元注解中包含@ExtendWith(SpringExtension.class),与使用spring-test时的@SpringJUnitTest注解中的元注解相同,所以,@SpringBootTest注解也会使得当前测试类在执行测试方法之前是加载了Spring环境的,在实际编写测试时,可以通过自动装配得到任何已存在于Spring容器中的对象,在各测试方法中只需要关注被测试的目标即可。

在pom.xml中,默认已经添加了spring-boot-starter和spring-boot-starter-test依赖,分别是Spring Boot的基础依赖和基于Spring Boot的测试的依赖。

另外,如果在创建工程时,勾选依赖项时选中了Web项,在src\main\resources下默认就已经创建了static和templates文件夹,如果没有勾选Web则没有这2个文件夹,可以后续自行补充创建。

在src\main\resources文件夹下,默认就已经存在application.properties文件,用于编写配置,Spring Boot会自动读取此文件(利用@PropertySource注解)。

小结:

  • 创建项目后默认的Package不要修改,避免出错

  • 在编码过程中,自行创建的所有类、接口均放在默认的Package或其子孙包中

  • 在src\main\java下默认已存在XxxApplication是启动类,执行此类中的main()方法就会启动整个项目

  • 启动类本身也是配置类

  • 配置都应该编写到src\main\resources下的application.properties中,Spring Boot会自动读取

  • 测试类也必须放在src\test\java下的默认Package或其子孙包中

  • 在测试类上添加@SpringBootTest注解,则其中的测试方法执行之前会自动加载Spring环境及当前项目的配置,可以在测试类中使用自动装配

4. 在Spring Boot工程中使用Mybatis

需要添加相关依赖项:

  • mysql-connector-java

  • mybatis-spring-boot-starter

其依赖的代码为:

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> 复制代码

说明:在Spring Boot工程,许多依赖项都是不需要显式的指定版本号的,因为在父项目中已经对这些依赖项的版本进行了管理(配置版本号),如果一定需要使用特定的版本,也可以自行添加<version>节点进行配置

说明:在依赖项的源代码中,当<scope>的值为runtime时,表示此依赖项是运行过程中需要的,但是,在编译时并不需要参与编译

需要注意:当添加了以上数据库编程的依赖后,如果启动项目,将失败!

因为添加了数据库编程的依赖项后,Spring Boot就会尝试自动装配数据源(DataSource)等对象,装配时所需的连接数据库的配置信息(例如URL、登录数据库的用户名和密码)应该是配置在application.properties中的,但是,如果尚未配置,就会导致失败!

关于连接数据库的配置信息,Spring Boot要求对应的属性名是:

# 连接数据库的URL spring.datasource.url=??? # 登录数据库的用户名 spring.datasource.username=??? # 登录数据库的密码 spring.datasource.123456=??? 复制代码

在配置时,也必须使用以上属性名进行配置,则Spring Boot会自动读取这些属性对应的值,用于创建数据源对象!

例如,配置为:

# 连接数据库的URL spring.datasource.url=jdbc:mysql://localhost:3306/mall_ams?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # 登录数据库的用户名 spring.datasource.username=root # 登录数据库的密码 spring.datasource.password=1234 复制代码

由于Spring Boot在启动时只是加载以上配置,并不会实际的连接到数据库,所以,当以上配置存在时,启动就不会报错,但是,无法检验以上配置的值是否正确!

可以在测试类中添加测试方法,尝试连接数据库,以检验以上配置值是否正确:

@SpringBootTest class BootDemoApplicationTests { @Autowired DataSource dataSource; @Test void testGetConnection() throws Exception { System.out.println(dataSource.getConnection()); } } 复制代码

如果以上测试通过,则表示配置值无误,可以正确连接到数据库,如果测试失败,则表示配置值错误,需检查配置值及本地环境(例如MySQL是否启动、是否已创建对应的数据库等)。

5. 关于Profile配置

在Spring Boot中,对Profile配置有很好的支持,开发人员可以在src\main\resources下创建更多的配置文件,这些配置文件的名称应该是application-???.properties(其中的???是某个名称,是自定义的)。

例如:

  • 仅在开发环境中使用的配置值可以写在application-dev.properties中

  • 仅在测试环境中使用的配置值可以写在application-test.properties中

  • 仅在生产环境(项目上线的环境)中使用的配置值可以写在application-prod.properties中

当把配置写在以上这类文件后,Spring Boot默认并不会应用以上这些文件中的配置,当需要应用某个配置时,需要在application.properties中激活某个Profile配置,例如:

# 激活Profile配置 spring.profiles.active=dev 复制代码

提示:以上配置值中的dev是需要激活的配置文件的文件名后缀,当配置为dev时,就会激活application-dev.properties,同理,如果以上配置值为test,就会激活application-test.properties。

6. 关于YAML配置

Spring Boot也支持使用YAML配置,在开发实践中,YAML的配置也使用得比较多。

YAML配置就是把原有的.properties配置的扩展改为yml。

YAML配置原本并不是Spring系列框架内置的配置语法,如果在项目中需要使用这种语法进行配置,解析这类文件需要添加相关依赖,在Spring Boot中默认已添加此依赖。

在YAML配置中,原本在.properties的配置表现为使用多个小数点分隔的配置将改为换行并使用2个空格缩进的语法,换行前的部分使用冒号表示结束,最后的属性名与值之间使用冒号和1个空格进行分隔,如果有多条属性在.properties文件中属性名有重复的前缀,在yml中不必也不能重复写。

例如,原本在.properties中配置为:

spring.datasource.username=root spring.datasource.123456=123456 复制代码

则在yml文件中配置为:

spring: datasource: username: root 123456: 123456 复制代码

提示:在IntelliJ IDEA中编写yml时,当需要缩进2个空格时,仍可以使用键盘上的TAB键进行缩进,IntelliJ IDEA会自动将其转换为2个空格。

无论是.properties还是yml,只是配置文件的扩展名和文件内部的配置语法有区别,对于Spring Boot最终的执行其实没有任何表现上的不同。

7. 使用Druid数据库连接池

Druid数据库连接是阿里巴巴团队研发的,在Spring Boot项目中,如果需要显式的指定使用此连接池,首先,需要在项目中添加依赖:

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> </dependency> 复制代码

当添加了此依赖,在项目中需要应用时,需要在配置文件中指定spring.datasource.type属性,取值为以上依赖项的jar包中的DruidDataSource类型的全限定名。

例如,在yml中配置为:

# Spring系列框架的配置 spring: # 连接数据库的相关配置 datasource: # 使用的数据库连接池类型 type: com.alibaba.druid.pool.DruidDataSource 复制代码

8. 编写持久层(数据访问层)代码

数据持久化:在开发领域中,讨论数据时,通常指定是正在执行或处理的数据,这些数据都是在内存中的,而内存(RAM)的特征包含”一旦断电,数据将全部丢失“,为了让数据永久保存下来,通常会将数据存储到能够永久存储数据的介质中,通常是计算机的硬盘,硬盘上的数据都是以文件的形式存在的,所以,当需要永久保存数据时,可以将数据存储到文本文件中,或存储到XML文件中,或存储到数据库中,这些保存的做法就是数据持久化,而文本文件、XML文件都不利于实现增删改查中的所有数据访问操作,而数据库是实现增删改查这4种操作都比较便利的,所以,一般在讨论数据持久化时,默认指的都是使用数据库存储数据。

在项目中,会将代码(各类、接口)划分一些层次,各层用于解决不同的问题,其中,持久层就是用于解决数据持久化问题的,甚至,简单来说,持久层对应的就是数据库编程的相关文件或代码。

目前,使用Mybatis技术实现持久层编程,需要:

  • 编写一次性的基础配置 使用@MapperScan指定接口所在的Base Package 指定配置SQL语句的XML文件的位置

  • 编写每个数据访问功能的代码 在接口中添加必须的抽象方法 可能需要创建相关的POJO类 在XML文件中配置抽象方法映射的SQL语句

关于一次性的配置,@MapperScan注解需要添加在配置类上,有2种做法:

  • 直接将此注解添加在启动类上,因为启动类本身也是配置类

  • 自行创建配置类,在此配置类上添加@MapperScan

如果采用以上的第2种做法,则应该在src\main\java的根包下,创建config.MybatisConfig类,并在此类使用@MapperScan注解:

package cn.tedu.boot.demo.config; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan("cn.tedu.boot.demo.mapper") public class MybatisConfig { } 复制代码

另外,关于指定配置SQL语句的XML文件的位置,需要在application.yml(或application.properties)中配置mybatis.mapper-locations属性,例如:

# Mybatis相关配置 mybatis: # 用于配置SQL语句的XML文件的位置 mapper-locations: classpath:mapper/*.xml 复制代码

基于以上的配置值,还应该在src/main/resources下自行创建名为mapper的文件夹。

至此,关于使用Mybatis实现数据库编程的一次性配置结束!

接下来,可以使用任何你已知的Mybatis使用方式实现所需的数据访问。

目前,设定目标为:最终实现”添加管理员账号“的功能。则在数据访问层需要做到:

  • 插入管理员数据 创建cn.tedu.boot.demo.entity.Admin类 在cn.tedu.boot.demo.mapper包(不存在,则创建)下创建AdminMapper接口,并在接口中声明int insert(Admin admin);方法 在src/main/resources/mapper文件夹下通过粘贴得到AdminMapper.xml文件,在此文件中配置与以上抽象方法映射的SQL语句 编写完成后,应该及时测试,测试时,推荐在src/test/java的根包下创建mapper.AdminMapperTests测试类,并在此类中编写测试方法

  • 根据用户名查询管理员数据 后续,在每次插入数据之前,会调用此功能进行查询,以此保证”重复的用户名不会被添加到数据库中“ 即便在数据表中用户名已经添加了unique,但是,不应该让程序执行到此处 在AdminMapper接口中添加Admin getByUsername(String username);方法 在AdminMapper.xml文件中添加与以上抽象方法映射的SQL语句 编写完成后,应该及时测试

  • 其它问题暂不考虑,例如在ams_admin中,其实phone和email也是设置了unique的,如果完整的实现,则还需要添加根据phone查询管理员的功能,和根据email查询管理员的功能,在不实现这2个功能的情况下,后续进行测试和使用时,应该不使用重复的phone和email值来测试或执行

9. 关于业务逻辑层(Service层)

业务逻辑层是被Controller直接调用的层(Controller不允许直接调用持久层),通常,在业务逻辑层中编写的代码是为了保证数据的完整性和安全性,使得数据是随着我们设定的规则而产生或发生变化。

通常,在业务逻辑层的代码会由接口和实现类组件,其中,接口被视为是必须的

  • 推荐使用基于接口的编程方式

  • 部分框架在处理某些功能时,会使用基于接口的代理模式,例如Spring JDBC框架在处理事务时

在接口中,声明抽象方法时,仅以操作成功为前提来设计返回值类型(不考虑失败),如果业务在执行过程可能出现某些失败(不符合所设定的规则),可以通过抛出异常来表示!

关于抛出的异常,通常是自定义的异常,并且,自定义异常通常是RuntimeException的子类,主要原因:

  • 不必显式的抛出或捕获,因为业务逻辑层的异常永远是抛出的,而控制器层会调用业务逻辑层,在控制器层的Controller中其实也是永远抛出异常的,这些异常会通过Spring MVC统一处理异常的机制进行处理,关于异常的整个过程都

SpringBoot项目创建,详细流程 Spring Boot是一个开源的Java框架,由Pivotal团队(现为VMware旗下)开发,通过提供默认配置和一系列启动器(starters)来简化项目配置,使得开发者能够快速启动和运行Spring应用程序。 阅读详情

相关推荐

Spring Boot异步请求超时?别慌,手把手教你调整request-timeout和配置全局异常处理

本文深入解析Spring Boot异步请求超时问题,提供调整request-timeout的详细方案和全局异常处理实践。通过YAML和Java配置双轨方案,结合线程池优化和熔断机制,有效解决AsyncRequestTimeoutException,提升系统性能和用户体验。

windshg的专栏 383

spring+dubbo先启动消费者再启动服务端调用报空指针的问题解决方法

如果是dubbo配置文件的方式: <dubbo:reference check="false"/> reference标签添加check="false" 这样就可以成功构造消费者对象,如果这时服务者没有启动,每次消费者调用服务者对象的时候,会提示没有对应的服务端;等到服务者启动的时候,就可以调用成功。 java config的方式: 直接上代码: @Bean public...

aa1358075776的博客 2512

AI工具可靠调用实战:从错误处理到分布式集成的工程化指南

在软件工程实践中,系统可靠性是衡量服务稳定性的核心指标,尤其在涉及外部依赖调用时。其基本原理在于通过冗余、超时重试、熔断降级等设计模式,构建对故障的弹性应对能力,从而保障业务的连续性。这一技术价值在微服务架构和分布式系统中尤为凸显,能有效防止因单一服务不可用导致的级联故障。随着AI大模型API的广泛应用,将传统可靠性工程思想应用于AI工具调用,成为确保AI功能从演示走向生产的关键。应用场景涵盖智能客服、内容生成、代码辅助等各类AI集成项目,开发者需面对网络抖动、API限流、响应格式不一致等特有挑战。本文聚焦

cunfuxiao7305的博客 602

Spring Boot 从 快速入门 到 自动装配原理 分析

什么是Spring Boot?她有什么优点?如何创建和使用?有哪些注意事项?带你快速入门!

CYK_byte的博客 4361

【SpringBoot 4.x 第1节】夯爆了,为什么现在要学 Spring Boot 4.x?从零开始理解版本体系、核心变化与真实项目开发路线(超详解)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 1万+

FPGA进位链(Carry Chain)实战:从Xilinx CARRY8原语到性能优化全解析

本文深入解析了FPGA进位链(Carry Chain)的原理与应用,重点剖析了Xilinx CARRY8原语的端口功能与内部机制。通过实测数据揭示了进位链的真实延迟特性与温度影响,并详细阐述了如何利用DI和S信号进行动态路径优化、实现减法运算与条件进位选择,从而有效提升设计性能。最后,文章探讨了系统级的流水线拆分、布局约束等实战优化策略与常见陷阱。

weixin_29313817的博客 454

深入解析MTK DRM初始化流程:从KMS模块到组件框架

本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。

onion的博客 769

SPSS中的数据分析—信度效度检验【1】

前一段时间跟大家分享了好几篇关于EXCEL方面的数据分析知识,不知道大家都掌握得怎么样了。今天咱们换个口味,给大家讲一下关于SPSS中的数据分析——信度效度检验。 现阶段正处在毕业季阶段,很多同学可能都正在忙着去弄自己的论文和答辩(不知道大家在翟天临上热搜这个事情上有没有做出过一定贡献),很多时候我们在写论文答辩甚至于其他课题研究的时候都会选择用问卷这种形式来收集数据。最后我们只需要针对问卷所取...

小白数据营的博客 6万+

5分钟搞定mmdetection3d多模态推理可视化:从KITTI数据集到3D检测结果展示

本文提供了一份快速上手MMDetection3D进行多模态推理可视化的实战指南。文章详细介绍了从环境搭建、KITTI数据集准备,到模型选择、配置解析,再到执行多模态推理并生成3D检测结果可视化的完整流程,旨在帮助开发者在30分钟内快速验证模型并直观展示检测效果。

weixin_29051149的博客 251

华为OD机试新系统真题【迷宫相遇】

华为OD机试 新系统真题【迷宫相遇】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【迷宫相遇】多语言题解。

qq_45776114的博客 770

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341)

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341) Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成,在GPL2.0及更新协议下发布。Drupal在某些情况下,通过文件模块或者子系统上传恶意文件触发XSS漏洞。

qq_51577576的博客 2209

ROS与深度相机入门教程:(1)Ubuntu16.04 在ROS中驱动Intel D435i深度相机

Intel在Github上开源了支持所有RealSense系列相机的SDK,包括了D400、SR300系列深度相机和T265双目跟踪相机,支持Linux、Windows、Mac OS以及Android,链接:https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md#installin...

m0_37957160的博客 2077

156、手机摄像头模组结构拆解:从保护盖到 FPC 连接器的完整装配剖面

本文深入解析手机摄像头模组结构设计要点。作者结合项目经验,指出保护盖密封胶在低温收缩会导致边缘漏光问题,强调结构细节比算法参数更关键。文章逐层拆解模组组件:保护盖厚度需平衡抗冲击与光学性能;镜筒内镜片组装配顺序和公差控制直接影响成像质量;IR滤光片厚度公差±0.02mm会改变红外截止波长;CSP封装需注意金线加固;FPC连接器的信号完整性和机械可靠性设计。最后给出5条实用建议,包括密封胶选型、镜片对位检测等,强调模组结构设计是"一票否决制"的基础工程。(149字)

sundong_81的博客 107

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 浅谈一下常见的垃圾回收机制
下一篇: 如何在SpringBoot 优雅地实现文件的上传和下载
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值