Java | 创建一个 Spring Boot 单体项目都需要做什么

创建一个 Spring Boot 单体项目都需要做什么


Table of Contents


前言

平常开始新项目的时候,都要从头搭建一个新项目,至于这些模板操作,我们都需要注意什么呢?这里主要介绍一个项目搭建的过程以及一些常用工具和插件的使用。

一、项目搭建

0. 准备工具

这里使用常见 IDEA 社区版 进行操作,以下统称 IDEA 社区版IDEA.

IDEA 默认为不提供 Spring Boot 项目的创建方式的,在这里我们可以通过两种方式创建项目

一、通过官网进行选择下载后导入到IDEA中

官网地址是 https://start.spring.io/, 如果网络情况不好的情况下,可以使用Alibaba 提供的网站 https://start.aliyun.com/bootstrap.html, 其提供了更多的可选项

二、安装插件

  • Spring Assistant
  • Alibaba Cloud Toolkit

如果你对阿里系产品有依赖的话可以安装 Alibaba Cloud Toolkit, 其不仅提供了创建Spring Boot 项目的方式,也提供了 Dubbo 的快捷方式,同时还附件一些云产品操作功能,很是方便

这里作者并没有一些阿里云服务的资源和 Dubbo 的使用情况,这里安装了相对轻便的 Spring Assistant

spring_assistant.png

到这里,IDEA 社区版就可以便捷的创建项目了

1. 选择要用到的依赖

这里考虑到正常工作环境并不会急于升级 Spring Boot 2.4.0, 这里使用选用 Java 8 + Spring Boot 2.3.6 + Maven 创建项目

创建时选择以下依赖:

依赖 作用
spring-boot-starter-actuator 提供一些统计端口,如健康检查、info、mapping 等统计信息,配合 Spring Boot Admin 使用效果更佳
spring-boot-starter-web web 项目相关自动配置
spring-boot-starter-data-redis Spring Data Redis 自动配置,如果不使用,可以移除
mybatis-spring-boot-starter mybatis 相关配置,不使用可以移除
spring-boot-starter-jdbc jdbc 相关配置,不使用可以移除
mysql-connector-java mysql 的jdbc 驱动,可以换成其他的,mysql 使用还是挺广泛的
lombok 帮助简化一些代码,这个争议还是挺大的,根据团队意见酌情使用

2. 配置项目

1. 根据情况删除不常用的文件或者根本不可能用的文件

  • static 文件夹
  • templates 文件夹
  • mvnw 文件酌情删除
  • 改 properties 为 yml

2. 增加不同环境的配置文件

一般都会包括 开发、测试、生产三个配置,有个公司会更多比如预生产、灰度之类的

  • application.yml
  • application-dev.yml
  • application-prod.yml
  • application-test.yml

3. 增加项目配置

在上面加入了 jdbc、redis 依赖,需要进行一些配置才能正常启动, 这个根据情况配置一下

4. 增加日志配置

在项目中配置不同环境的日志输出

通过上面的配置,我们的项目就可以启动了,这也可以正常使用了,但这并没有结束

其他配置

3. 配置跨域

如果项目被前端项目直接访问,还得配置对应的跨域,最省事的方式是实现 WebMvcConfigurer

@Configuration
public class WebAppConfig implements WebMvcConfigurer {

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry
        .addMapping("/**")
        .allowedOrigins("*") // 这里替换成对应的域名
        .allowCredentials(true)
        .allowedHeaders("*")  // 这里是请求头
        .allowedMethods("*"); // 这里是方法
  }
}

更多配置跨域的方式可以参考 Java 解决跨域问题

4. 配置 MyBatis

在使用 mybatis 时,可以增加一些插件和个性化配置来简化一下操作, 比如启动驼峰转换、增加分页插件和MBG代码生成

1. 开始下划线转驼峰

mybatis:
  configuration:
    map-underscore-to-camel-case: true

2. 增加分页插件

添加 PageHelper Spring Boot Starter

引入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

application.yml 增加分页配置

pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=conutSql

3. 配置 MBG

官网地址:http://mybatis.org/generator/

1. 增加插件

pom.xml 中配置 mybatis-generator-maven-plugin

<build>
  <plugins>
    <plugin>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-maven-plugin</artifactId>
      <version>1.4.0</version>
      <configuration>
        <configurationFile>generatorConfig.xml</configurationFile>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
      </configuration>
    </plugin>
  </plugins>
</build>

增加 generatorConfig.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
  "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

  <classPathEntry location="/Users/zhangyunan/.m2/repository/mysql/mysql-connector-java/5.1.9/mysql-connector-java-5.1.9.jar"/>

  <context id="mysql" targetRuntime="MyBatis3">
    <!-- 这个插件可以方式重新生成 mapper 文件时,采用追加而不是覆盖的问题   -->
    <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

    <commentGenerator>
      <property name="suppressDate" value="true"/>
      <property name="suppressAllComments" value="true"/>
    </commentGenerator>
    <jdbcConnection
      connectionURL="jdbc:mysql://127.0.0.1:3306/spring-boot-example?characterEncoding=UTF-8&amp;useUnicode=true&amp;serverTimezone=GMT%2B8"
      driverClass="com.mysql.jdbc.Driver"
      password="123456" userId="root"/>

    <javaModelGenerator targetPackage="com.example.structure.infrastructure.entity" targetProject="./src/main/java"/>
    <sqlMapGenerator targetPackage="com.example.structure.infrastructure.mapper" targetProject="./src/main/resources"/>
    <javaClientGenerator targetPackage="com.example.structure.infrastructure.mapper" targetProject="./src/main/java"
      type="XMLMAPPER"/>
    
    <table tableName="sys_dict_type"/>
    <table tableName="sys_dict"/>

  </context>
</generatorConfiguration>

在执行之前记得先创建表

CREATE TABLE `sys_dict_type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(20) NOT NULL COMMENT '编码',
  `name` varchar(20) NOT NULL COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='字典类型表';

CREATE TABLE `sys_dict` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type_code` varchar(20) NOT NULL COMMENT '类型code',
  `code` varchar(20) NOT NULL COMMENT 'key',
  `value` varchar(100) NOT NULL COMMENT '值',
  `description` varchar(30) DEFAULT NULL COMMENT '描述',
  `sort` int(11) DEFAULT '0' COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='字典表';

5. 配置 flyway

在开发过程中,不仅在项目创建的时候会创建表或者修改数据库结构,在需求变更、增加时也会不会的修改数据库结构,如果不加以管理的话,会越来越乱,在以往的开发中可能会创建一个叫 scheam.sql 的文件, 每次对数据库的修改同时修改这个文件,这种处理方式是可行,但难以追踪和管理,总会有不实时更新文档的情况发生.

这种情况可以通过 Flyway 来管理数据库变更情况,使用这个方式保证各个环境的数据库结构一致性

官网介绍为:
Version control for your database.
Robust schema evolution across all your environments.
With ease, pleasure and plain SQL.

Flyway 提供了 4 种方式使用

  1. 命令行工具
  2. Java API 调用
  3. Maven 插件使用
  4. Gradle 插件使用

这里介绍一下 Maven 插件使用

1. 在 pom.xml 加入

<plugin>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-maven-plugin</artifactId>
  <version>7.2.0</version>
  <configuration>
    <configFiles>
      <configFile>flyway.conf</configFile>
    </configFiles>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.9</version>
    </dependency>
  </dependencies>
</plugin>

2. 在项目里面创建 flyway.conf 文件

flyway.url=jdbc:mysql://127.0.0.1:3306/spring-boot-example
flyway.user=root
flyway.password=123456

在不同环境执行时,可以通过 -Dflyway.configFiles 来指定配置文件来区分测试环境、生产环境

mvn -Dflyway.configFiles=xxx.conf flyway:migrate

3. 创建sql 文件

在 resources 下创建 db/migration 文件夹, 在这里面就是我们要写的 DDL SQL 文件

更多操作见Flyway 官网: https://flywaydb.org/

6. 配置 git id 插件

在开发中,可能会出现测试环境发布的版本和自己通过 CI/CD 平台发布的版本不一致的情况,或者明明改了代码,为什么测试/线上没有生效呢?这是我们可以使用 git id 插件,帮我们查看部署的项目的版本信息

pom.xml 加入

<plugin>
  <groupId>pl.project13.maven</groupId>
  <artifactId>git-commit-id-plugin</artifactId>
  <version>4.0.3</version>
  <executions>
    <execution>
      <goals>
        <goal>revision</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
  </configuration>
</plugin>

这样编译和打包的文件中会生成一个 git.properties 文件,这样可以通过解压jar包的方式查看这个文件

[图片上传失败...(image-f64167-1614776928997)]

不过通过解压 jar 包的方式还是有点 low 的,因为上面加入了 spring-boot-starter-actuator 可以通过 actuator/info 方式来查看 git.properties 信息

application.yml 加入

info:
  version: 0.0.1
  description: 项目搭建版本

启动项目并访问 actuator/info

则可看到如下信息,这样就可以检查项目运行的分支和具体的 commit id

{
  "version": "0.0.1",
  "description": "项目搭建版本",
  "git": {
    "commit": {
      "time": "2020-11-15T07:59:05Z",
      "id": "b36f324"
    },
    "branch": "main"
  }
}

如果想查看 git 的更多信息,需要加入修改配置

management:
  info:
    git:
      mode: full

使用IDEA直接启动的项目的时候要保证target文件下已经生成了 git.properties, 如果没有,可以执行 mvn complie 再运行或者使用 mvn spring-boot:run 运行. 这个问题是 IDEA 的问题

7. 配置代码格式

在团队开发中,如果每人都有自己代码风格,这样写出来的代码是不统一,甚至同一个文件多个人修改时容易反生上头的感觉

这里可以一个统一的代码风格文件,并导入IDEA, 这样大家格式化化的风格就会一致

导入方式为

[图片上传失败...(image-f546bd-1614776928997)]

样例文件可以参考 https://github.com/zhangyunan1994/code-template/tree/master/template/styleguide 中 intellij-java-google-style.xml

8. 编写 Readme

写个关于模板项目使用的一些情况,方便其他同时可以快速复制项目进行修改

总结

项目代码地址为: https://github.com/zhangyunan1994/spring-boot-example

参考

  1. http://mybatis.org/generator/
  2. https://flywaydb.org/
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容