软件架构与应用开发: 实验一

代码地址:Github

实验目的和要求

  1. 初步熟悉Spring Boot开发环境搭建
  2. 熟悉Maven项目
  3. 熟悉Spring Boot的开发环境
  4. 第一个Spring Boot项目
  5. Spring Boot 项目结构分析

实验内容和原理

  1. 搭建并测试运行环境, 将正确安装插件的环境截图显示出来

  2. 根据PPT中的 Maven 项目内容,创建 Maven 工程, 将代码和运行结果截图复制到下面空白处

  3. 编写第一个 SpringBoot Web项目

  4. 对第一个 SpringBoot 项目的文件结构进行说明

主要仪器设备及工具或开发设计软件及工具名称

  • 笔记本或台式机
  • Eclipse+Spring开发套件 、IntelliJ IDEA、Visual Studio Code等一种开发工具

实验步骤

新建工程项目 Experiment01, 参数设置如下:

image-20230302203530036

image-20230302222337266

注意这里的 SpringBoot 版本请选择 3.0.0 以下, 亲测目前新版本很多插件存在适配问题

在 pom.xml 中重新使用 Maven 加载项目

由于 pom.xml 中部分依赖在 Maven 中并没有初始化成功, 因此要重新加载项目

image-20230302223212648

配置 application.yml

  • 将 application.properties 更名为 application.yml

配置 datasource:

spring:
  datasource:
    username: root
    password: 12345678
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoder=utf-8&useSSL=true&serverTimeZone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver

注意这里的 datasource 为 mysql 8.0.30-arm64, 根据自己实际情况进行配置

启动 Experiment01Application

正常启动输出如下:

image-20230302223941230

新建静态测试网页

  • 在 ‘src/main/resources/static’ 下新建 index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div>这是测试的 HTML </div>
    </body>
    </html>
    
  • 重启 SpringBoot 项目, 登录默认端口查看网页

    image-20230302230737344

项目目录 (阿里巴巴版)

参考网站: https://zhuanlan.zhihu.com/p/115403195

通用目录

  • 项目根目录/src/main/java:放置项目 Java 源代码
  • 项目根目录/src/main/resources:放置项目静态资源和配置文件
  • 项目根目录/src/test/java:放置项目测试用例代码

Java 源代码

大致框架

而位于/src/main/java目录下的 Java 源代码的组织结构大家比较关心,这地方也只能给出一个通常典型的结构,毕竟不同项目和团队实践不一样,稍许有区别,但整体安排应该差不多。而且如果是多模块 的项目的话,下面的结构应该只对应其中一个模块,其他模块的代码组织也大致差不多。

image-20230302231028648

目录说明

|_annotation:放置项目自定义注解
|_aspect:放置切面代码
|_config:放置配置类
|_constant:放置常量、枚举等定义
   |__consist:存放常量定义
   |__enums:存放枚举定义
|_controller:放置控制器代码
|_filter:放置一些过滤、拦截相关的代码
|_mapper:放置数据访问层代码接口
|_model:放置数据模型代码
   |__entity:放置数据库实体对象定义
   |__dto:存放数据传输对象定义
   |__vo:存放显示层对象定义
|_service:放置具体的业务逻辑代码(接口和实现分离)
   |__intf:存放业务逻辑接口定义
   |__impl:存放业务逻辑实际实现
|_utils:放置工具类和辅助代码

难点

当然,这地方估计有一个很多人都会纠结的关于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类来传输。

资源目录

大致架构

/src/main/resources 目录,里面主要存放静态配置文件和页面静态资源等东西

目录说明

|_mapper:存放mybatis的XML映射文件(如果是mybatis项目)
|_static:存放网页静态资源,比如下面的js/css/img
   |__js:
   |__css:
   |__img:
   |__font:
   |__等等
|_template:存放网页模板,比如thymeleaf/freemarker模板等
   |__header
   |__sidebar
   |__bottom
   |__XXX.html等等
|_application.yml       基本配置文件
|_application-dev.yml   开发环境配置文件
|_application-test.yml  测试环境配置文件
|_application-prod.yml  生产环境配置文件

项目结构划分总结

如果从一个用户访问一个网站的情况来看,对应代码目录的流转逻辑如下:

image-20230302231413503 image-20230302231424922

注意事项

1、Contorller层参数传递建议不要使用HashMap,建议使用数据模型定义

2、Controller层里可以做参数校验、异常抛出等操作,但建议不要放太多业务逻辑,业务逻辑尽量放到Service层代码中去做

3、Service层做实际业务逻辑,可以按照功能模块做好定义和区分,相互可以调用

4、功能模块Service之间引用时,建议不要渗透到DAO层(或者mapper层),基于Service层进行调用和复用比较合理

5、业务逻辑层Service和数据库DAO层的操作对象不要混用。Controller层的数据对象不要直接渗透到DAO层(或者mapper层);同理数据表实体对象Entity也不要直接传到Controller层进行输出或展示。