快速阅读一个SpringBoot工程
介绍
Spring Boot是一个用于构建基于Spring框架的分布式应用程序的框架。它通过提供丰富的功能和工具,使我们能够更快速、更轻松地创建和维护应用程序。Spring Boot利用了Spring框架的核心概念,如依赖注入、面向切面编程等,使我们可以更加专注于业务逻辑的实现。阅读 Spring Boot 工程是学习和应用 Spring Boot 框架的必要步骤之一。
昨天有个小伙伴私信我问了一个问题:“网上的Springboot开源项目看不懂不知从何下手、进入公司如何快速上手交接的项目?”,正好最近我这边也经历了这个事情:公司同事离职某个测试质量平台交接给了我,但是无任何文档说明、项目工程无readme文件。下面,就以我自己的阅读方式来做一个概述,不足之处欢迎各位大佬指正
(接受反驳,真的)
☀️本地启动
clone工程到本地
配置启动器
修改本地环境配置文件中的本地mysql连接(如有)
启动工程,将项目在本地跑起来
🌤️了解项目架构
首先我们需要了解这个项目是做什么的(提供什么样能力的工程)、项目使用了哪些技术 如:A项目,主要用于给测试平台X提供接口服务能力,主要使用的技术栈能力包括:mysql、mybatis、zookeeper、elasticsearch、netty、Spring、redis...等
⛅️查看项目结构
Spring工程一般是采用分层思想进行开发,分层优点是每层只专注本层工作做自己最擅长的事情,层与层之间会通过适配器进行通信。分层思想需要满足的规则如下:
- 单一:每层只处理一类事情,满足单一职责原则
- 降噪:信息在每一层进行传输,满足最小知识原则,只向下层传输必要信息
- 适配:每层都需要一个适配器,翻译信息为本层或者下层可以理解的信息
- 业务:业务对象可以整合业务逻辑
- 数据:数据对象尽量纯净,尽量不要聚合业务
SpringBoot工程可以分为九层
- 工具层:util
- 工具层承载工具代码。不依赖本项目其它模块,只依赖一些通用工具包
- 整合层:integration
- 可能会依赖外部服务,那么将外部DTO转换为自己项目可以理解的对象,需要在integration层处理
- 基础层:infrastructure
- 基础层核心是承载数据访问,entity实体对象承载在本层。只依赖工具模块
- 服务层:service
- 核心代码
- 领域层:domain
- 领域对象需要体现业务含义(领域对象采用充血模型聚合业务)、业务对象
- 业务层可以更加灵活组合不同领域业务,并且可以增加流控、监控、日志、权限,分布式锁等控制,相较于领域层功能更为丰富
- 门面层:facade
- 承载对外服务
- 控制层:controller
- 作为本项目HTTP接口提供服务,供前端调用
- 客户端:client
- 承载数据对外传输对象DTO
- 启动层:boot
- 启动层,只有启动入口代码
需要了解的是,这东西并没有一套通用的标准,不同公司或者团队的使用习惯和规范也不尽相同。
以上理论参考文章SpringBoot工程分层实战cloud.tencent.com/developer/a…
简单来说,可以从如下几个方面去借鉴思考:
- 应用程序主模块(Application):该模块是整个应用程序的入口点,负责启动和管理其他模块。
- 依赖项模块(Dependency):该模块包含了应用程序所需的所有依赖项,如Spring Boot Starter、Spring Data等。这些依赖项可以通过Maven或Gradle等构建工具进行管理。
- 业务逻辑模块(Business):该模块包含了应用程序的核心业务逻辑,通常由多个Spring组件组成,如控制器(Controller)、服务(Service)、实体类(Entity)等。
- 测试模块(Test):该模块包含了应用程序的单元测试和集成测试代码,以确保应用程序的质量和稳定性。
🌥️目录结构及文件
通常,Spring Boot 工程的主要文件结构包括 src/main/java 目录
、src/main/resources 目录
和 pom.xml 文件
:
- src/main/java 目录包含了项目的 Java 代码
- src/main/resources 目录包含了项目的静态资源、配置文件等
- src/test/java 目录主要放置项目测试用例代码
- pom.xml 文件是 Maven 的配置文件,用于管理项目的依赖和构建方式
这里估计还有同学会问关于DTO/VO/DO
等数据模型定义的区分,参考《阿里巴巴Java开发手册》中定义如下:
DO(Data Object)
:与数据库表结构一一对应,通过DAO层向上传输数据源对象。DTO(Data Transfer Object)
:数据传输对象,Service或Manager向外传输的对象。BO(Business Object)
:业务对象。由Service层输出的封装业务逻辑的对象。AO(Application Object)
:应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。VO(View Object)
:显示层对象,通常是Web向模板渲染引擎层传输的对象。Query
:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。
个人觉得,只要保证业务逻辑层Service和数据库DAO层的操作对象严格划分出来,确保互相不渗透不混用即可
对应上面的项目代码结构,假设一个用户访问一个页面接口请求到后端,流程大概如下:(图片参考来自知乎用户@CodeSheep程序羊)
对应代码目录的流转逻辑就是:
☁️查看配置文件
Spring Boot 应用程序通常使用 application.properties
或 application.yml
等配置文件来配置应用程序的属性、环境变量、数据库连接等。我们可以通过查看这些配置文件,了解应用程序的环境和配置信息,并了解其中使用的技术和框架。通过查看配置文件,我们可以更快速地掌握应用程序的核心配置和逻辑。在这一步,我们可以查看到Spring工程启动端口、测试环境数据库的连接地址、其他配置变量等。
🌦️查看启动类
Spring Boot 应用程序通常有一个入口类,我们可以从这个类开始查看工程代码。该类通常被标注为 @SpringBootApplication
,包含了 Spring Boot 应用程序的配置和初始化逻辑。我们可以通过查看启动类,快速了解应用程序的主要配置和初始化过程,以便更好地理解应用程序的整个运行流程。在这一步,我们可以将启动配置中的Main Class配置为该入口类。
🌧️分析控制器层
在 Spring Boot 工程中,控制器层通常是应用程序的入口点,负责处理 HTTP 请求和响应。我们可以通过查看控制器层的代码,了解应用程序的接口和业务逻辑,并了解数据的传递和处理过程。在源码中,我们可以看到Spring Boot使用 @Controller
注解来标识控制器类,并使用 @RequestMapping
注解来指定请求的处理方法。
@RestController
@RequestMapping("/api/testdemo/alarminfo")
public class AlarmManagerController {
@Autowired
AlarmManagerService alarmManagerService;
@RequestMapping(value = "/detail", method = RequestMethod.POST)
public Result alarmDetail(@ModelAttribute("alarmManagerDto") AlarmDetailDto alarmDetailDto){
...
}
}
⛈️分析服务层
在 Spring Boot 工程中,服务层通常是应用程序的核心业务逻辑所在。在源码中,我们可以看到Spring Boot使用 @Service
注解来标识服务类,并定义各种业务逻辑方法。我们可以通过查看服务层的代码,了解应用程序的业务逻辑和数据处理过程,并了解其中使用的技术和框架。
@Service
@Slf4j
public class AlarmManagerServiceImpl implements AlarmManagerService {
...
}
🌩️理解依赖关系
Spring Boot 应用程序通常依赖于许多二方三方库和框架。我们可以通过查看 pom.xml 文件和应用程序的依赖关系,了解应用程序所依赖的库和框架,并了解它们是如何相互作用的。理解应用程序的依赖关系,可以更好地了解应用程序的整体结构和实现方式。
🌨️调试&阅读源码
阅读项目源码并调试(可结合某个功能来使用,一个组件或一个接口,我们可以通过debug、看报错信息、看日志信息、打印变量等方式来进行快速熟悉)
❄️新增需求
添加自己需求的接口、模块、功能代码
理解Spring Boot设计思路
了解Spring Boot的设计思路可以帮助我们更好地理解和应用该框架
- 约定优于配置:Spring Boot通过约定来减少开发者需要手动配置的内容。例如,Spring Boot可以根据环境变量自动配置数据库连接池等组件。
- 自动配置:Spring Boot通过自动配置来简化开发过程。它通过扫描应用程序中的各种组件,并根据需要自动配置它们。这使得开发者可以更加专注于实现业务逻辑。
- 面向切面编程(AOP):Spring Boot支持面向切面编程,使得开发者可以更加轻松地实现跨模块的功能,如日志记录、性能监控等。
- 分布式部署:Spring Boot支持分布式部署,使得应用程序可以更加轻松地扩展和部署到不同的服务器上。
反思总结
- 了解Spring Boot的核心概念:在阅读Spring Boot工程之前,我们需要先了解其核心概念,如依赖注入、面向切面编程等。这有助于我们更好地理解工程中的各个组件和代码实现。
- 关注工程的结构和组织:阅读Spring Boot工程时,我们需要关注其结构和组织方式。这有助于我们更好地理解各个模块的功能和作用,以及代码的组织方式。
- 学习如何使用构建工具:构建工具(如Maven、Gradle)是管理Spring Boot工程的重要工具。我们需要学习如何使用这些构建工具来管理依赖项、构建应用程序等操作。
- 分析代码实现:阅读Spring Boot工程的代码实现可以帮助我们更好地理解其工作原理和实现方式。我们可以分析代码中的注解、配置文件、控制器、服务等组件,以了解其功能和作用。
- 深入了解核心模块:为了更好地应用Spring Boot框架,我们需要深入了解其核心模块,如自动配置、面向切面编程等。这有助于我们更加熟练地应用该框架,并实现更加复杂的功能。
- 结合实际项目经验:阅读Spring Boot工程的同时,我们需要结合实际项目经验来理解和应用该框架。
转载自:https://juejin.cn/post/7250513276236808229