diff --git "a/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" "b/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" index 1e741e75ee2..2c7e09c7de5 100644 --- "a/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" +++ "b/docs/system-design/framework/spring/SpringBoot+Spring\345\270\270\347\224\250\346\263\250\350\247\243\346\200\273\347\273\223.md" @@ -141,11 +141,11 @@ public class UserController { #### 2.3. `@RestController` -`@RestController`注解是`@Controller和`@`ResponseBody`的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。 +`@RestController`注解是`@Controller`和`@ResponseBody`的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。 _Guide 哥:现在都是前后端分离,说实话我已经很久没有用过`@Controller`。如果你的项目太老了的话,就当我没说。_ -单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。`@Controller` +`@ResponseBody` 返回 JSON 或 XML 形式数据 +单独使用 `@Controller` 不加 `@ResponseBody`的话一般是用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。`@Controller` +`@ResponseBody` 返回 JSON 或 XML 形式数据 关于`@RestController` 和 `@Controller`的对比,请看这篇文章:[@RestController vs @Controller](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485544&idx=1&sn=3cc95b88979e28fe3bfe539eb421c6d8&chksm=cea247a3f9d5ceb5e324ff4b8697adc3e828ecf71a3468445e70221cce768d1e722085359907&token=1725092312&lang=zh_CN#rd)。 @@ -213,7 +213,7 @@ public ResponseEntity> getAllUsers() { ```java @PostMapping("/users") public ResponseEntity createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) { - return userRespository.save(user); + return userRespository.save(userCreateRequest); } ``` @@ -271,7 +271,7 @@ public List getKlassRelatedTeachers( } ``` -如果我们请求的 url 是:`/klasses/{123456}/teachers?type=web` +如果我们请求的 url 是:`/klasses/123456/teachers?type=web` 那么我们服务获取到的数据就是:`klassId=123456,type=web`。 @@ -325,7 +325,7 @@ public class UserRegisterRequest { **下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。** -我们的数据源`application.yml`内容如下:: +我们的数据源`application.yml`内容如下: ```yaml wuhan2020: 2020年初武汉爆发了新型冠状病毒,疫情严重,但是,我相信一切都会过去!武汉加油!中国加油! @@ -345,7 +345,7 @@ library: description: 如何养成一个新习惯?如何让心智变得更成熟?如何拥有高质量的关系? 如何走出人生的艰难时刻? ``` -#### 5.1. `@value`(常用) +#### 5.1. `@Value`(常用) 使用 `@Value("${property}")` 读取比较简单的配置信息: @@ -380,7 +380,7 @@ class LibraryProperties { 你可以像使用普通的 Spring bean 一样,将其注入到类中使用。 -#### 5.3. `PropertySource`(不常用) +#### 5.3. `@PropertySource`(不常用) `@PropertySource`读取指定 properties 文件 @@ -432,7 +432,7 @@ SpringBoot 项目的 spring-boot-starter-web 依赖中已经有 hibernate-valida - `@DecimalMin(value)`被注释的元素必须是一个数字,其值必须大于等于指定的最小值 - `@DecimalMax(value)` 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 - `@Size(max=, min=)`被注释的元素的大小必须在指定的范围内 -- `@Digits (integer, fraction)`被注释的元素必须是一个数字,其值必须在可接受的范围内 +- `@Digits(integer, fraction)`被注释的元素必须是一个数字,其值必须在可接受的范围内 - `@Past`被注释的元素必须是一个过去的日期 - `@Future` 被注释的元素必须是一个将来的日期 - ...... @@ -479,7 +479,7 @@ public class PersonController { #### 6.3. 验证请求参数(Path Variables 和 Request Parameters) -**一定一定不要忘记在类上加上 `Validated` 注解了,这个参数可以告诉 Spring 去校验方法参数。** +**一定一定不要忘记在类上加上 `@Validated` 注解了,这个参数可以告诉 Spring 去校验方法参数。** ```java @RestController @@ -562,7 +562,7 @@ public class Role { private Long id; ``` -JPA 使用枚举定义了 4 中常见的主键生成策略,如下: +JPA 使用枚举定义了 4 种常见的主键生成策略,如下: _Guide 哥:枚举替代常量的一种用法_ @@ -674,7 +674,7 @@ private String userName; 设置字段类型并且加默认值,这个还是挺常用的。 ```java -Column(columnDefinition = "tinyint(1) default 1") +@Column(columnDefinition = "tinyint(1) default 1") private Boolean enabled; ``` @@ -685,7 +685,7 @@ private Boolean enabled; 如果我们想让`secrect` 这个字段不被持久化,可以使用 `@Transient`关键字声明。 ```java -Entity(name="USER") +@Entity(name="USER") public class User { ...... @@ -699,7 +699,7 @@ public class User { ```java static String secrect; // not persistent because of static -final String secrect = “Satish”; // not persistent because of final +final String secrect = "Satish"; // not persistent because of final transient String secrect; // not persistent because of transient ``` @@ -718,7 +718,7 @@ private String content; ```java @Lob -//指定 Lob 类型数据的获取策略, FetchType.EAGER 表示非延迟 加载,而 FetchType. LAZY 表示延迟加载 ; +//指定 Lob 类型数据的获取策略, FetchType.EAGER 表示非延迟加载,而 FetchType.LAZY 表示延迟加载 ; @Basic(fetch = FetchType.EAGER) //columnDefinition 属性指定数据表对应的 Lob 字段类型 @Column(name = "content", columnDefinition = "LONGTEXT NOT NULL") @@ -756,7 +756,7 @@ public class Role { } ``` -数据库里面对应存储的是 MAIL/FEMAIL。 +数据库里面对应存储的是 MALE/FEMALE。 #### 8.7. 增加审计功能 @@ -808,9 +808,9 @@ public class AuditSecurityConfiguration { } ``` -简单介绍一下上面设计到的一些注解: +简单介绍一下上面涉及到的一些注解: -1. `@CreatedDate`: 表示该字段为创建时间时间字段,在这个实体被 insert 的时候,会设置值 +1. `@CreatedDate`: 表示该字段为创建时间字段,在这个实体被 insert 的时候,会设置值 2. `@CreatedBy` :表示该字段为创建人,在这个实体被 insert 的时候,会设置值 `@LastModifiedDate`、`@LastModifiedBy`同理。 @@ -835,8 +835,8 @@ public interface UserRepository extends JpaRepository { - `@OneToOne` 声明一对一关系 - `@OneToMany` 声明一对多关系 -- `@ManyToOne`声明多对一关系 -- `MangToMang`声明多对多关系 +- `@ManyToOne` 声明多对一关系 +- `@MangToMang` 声明多对多关系 更多关于 Spring Boot JPA 的文章请看我的这篇文章:[一文搞懂如何在 Spring Boot 正确中使用 JPA](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485689&idx=1&sn=061b32c2222869932be5631fb0bb5260&chksm=cea24732f9d5ce24a356fb3675170e7843addbfcc79ee267cfdb45c83fc7e90babf0f20d22e1&token=292197051&lang=zh_CN#rd) 。 @@ -852,14 +852,14 @@ public void save() { ``` -我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事物只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事物在遇到非运行时异常时也回滚。 +我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事务只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事务在遇到非运行时异常时也回滚。 -`@Transactional` 注解一般用在可以作用在`类`或者`方法`上。 +`@Transactional` 注解一般可以作用在`类`或者`方法`上。 -- **作用于类**:当把`@Transactional 注解放在类上时,表示所有该类的`public 方法都配置相同的事务属性信息。 +- **作用于类**:当把`@Transactional` 注解放在类上时,表示所有该类的 public 方法都配置相同的事务属性信息。 - **作用于方法**:当类配置了`@Transactional`,方法也配置了`@Transactional`,方法的事务会覆盖类的事务配置信息。 -更多关于关于 Spring 事务的内容请查看: +更多关于 Spring 事务的内容请查看: 1. [可能是最漂亮的 Spring 事务管理详解](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484943&idx=1&sn=46b9082af4ec223137df7d1c8303ca24&chksm=cea249c4f9d5c0d2b8212a17252cbfb74e5fbe5488b76d829827421c53332326d1ec360f5d63&token=1082669959&lang=zh_CN#rd) 2. [一口气说出 6 种 @Transactional 注解失效场景](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486483&idx=2&sn=77be488e206186803531ea5d7164ec53&chksm=cea243d8f9d5cacecaa5c5daae4cde4c697b9b5b21f96dfc6cce428cfcb62b88b3970c26b9c2&token=816772476&lang=zh_CN#rd) @@ -878,7 +878,6 @@ public class User { private String userName; private String fullName; private String password; - @JsonIgnore private List userRoles = new ArrayList<>(); } ``` @@ -900,7 +899,7 @@ public class User { #### 10.2. 格式化 json 数据 -`@JsonFormat`一般用来格式化 json 数据。: +`@JsonFormat`一般用来格式化 json 数据。 比如: @@ -916,9 +915,7 @@ private Date date; @Setter @ToString public class Account { - @JsonUnwrapped private Location location; - @JsonUnwrapped private PersonInfo personInfo; @Getter diff --git a/docs/tools/Git.md b/docs/tools/Git.md index a7376e04349..8dd6c316c3f 100644 --- a/docs/tools/Git.md +++ b/docs/tools/Git.md @@ -51,7 +51,7 @@ 这么做虽然解决了本地版本控制系统无法让在不同系统上的开发者协同工作的诟病,但也还是存在下面的问题: -- **单点故障:** 中央服务器宕机,则其他人无法使用;如果中心数据库磁盘损坏有没有进行备份,你将丢失所有数据。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。 +- **单点故障:** 中央服务器宕机,则其他人无法使用;如果中心数据库磁盘损坏又没有进行备份,你将丢失所有数据。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。 - **必须联网才能工作:** 受网络状况、带宽影响。 ### 分布式版本控制系统 @@ -76,13 +76,13 @@ Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理 Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。 -下面我们主要说一个关于 Git 其他版本管理系统的主要差别:**对待数据的方式**。 +下面我们主要说一个关于 Git 与其他版本管理系统的主要差别:**对待数据的方式**。 **Git采用的是直接记录快照的方式,而非差异比较。我后面会详细介绍这两种方式的差别。** 大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统**将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。** -具体原理如下图所示,理解起来其实很简单,每个我们对提交更新一个文件之后,系统都会记录这个文件做了哪些更新,以增量符号Δ(Delta)表示。 +具体原理如下图所示,理解起来其实很简单,每当我们提交更新一个文件之后,系统都会记录这个文件做了哪些更新,以增量符号Δ(Delta)表示。
@@ -113,7 +113,7 @@ Git 有三种状态,你的文件可能处于其中之一: 2. **已修改(modified)**:已修改表示修改了文件,但还没保存到数据库中。 3. **已暂存(staged)**:表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。 -由此引入 Git 项目的三个工作区域的概念:**Git 仓库(.git directoty)**、**工作目录(Working Directory)** 以及 **暂存区域(Staging Area)** 。 +由此引入 Git 项目的三个工作区域的概念:**Git 仓库(.git directory)**、**工作目录(Working Directory)** 以及 **暂存区域(Staging Area)** 。
@@ -132,7 +132,7 @@ Git 有三种状态,你的文件可能处于其中之一: 有两种取得 Git 项目仓库的方法。 1. 在现有目录中初始化仓库: 进入项目目录运行 `git init` 命令,该命令将创建一个名为 `.git` 的子目录。 -2. 从一个服务器克隆一个现有的 Git 仓库: `git clone [url]` 自定义本地仓库的名字: `git clone [url]` directoryname +2. 从一个服务器克隆一个现有的 Git 仓库: `git clone [url]` 自定义本地仓库的名字: `git clone [url] directoryname` ### 记录每次更新到仓库 @@ -157,7 +157,7 @@ Git 有三种状态,你的文件可能处于其中之一: ### 推送改动到远程仓库 -- 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:·`git remote add origin ` ,比如我们要让本地的一个仓库和 Github 上创建的一个仓库关联可以这样`git remote add origin https://github.com/Snailclimb/test.git` +- 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:`git remote add origin ` ,比如我们要让本地的一个仓库和 Github 上创建的一个仓库关联可以这样`git remote add origin https://github.com/Snailclimb/test.git` - 将这些改动提交到远端仓库:`git push origin master` (可以把 *master* 换成你想要推送的任何分支) 如此你就能够将你的改动推送到所添加的服务器上去了。 @@ -209,7 +209,7 @@ git reset --hard origin/master ### 分支 -分支是用来将特性开发绝缘开来的。在你创建仓库的时候,*master* 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。 +分支是用来将特性开发绝缘开来的。在你创建仓库的时候,*master* 是“默认”的分支。在其他分支上进行开发,完成后再将它们合并到主分支上。 我们通常在开发新功能、修复一个紧急 bug 等等时候会选择创建分支。单分支开发好还是多分支开发好,还是要看具体场景来说。 @@ -263,7 +263,7 @@ git push origin **在线演示学习工具:** -「补充,来自[issue729](https://github.com/Snailclimb/JavaGuide/issues/729)」Learn Git Branching https://oschina.gitee.io/learn-git-branching/。该网站可以方便的演示基本的git操作,讲解得明明白白。每一个基本命令的作用和结果。 +「补充,来自[issue729](https://github.com/Snailclimb/JavaGuide/issues/729)」Learn Git Branching https://oschina.gitee.io/learn-git-branching/ 。该网站可以方便的演示基本的git操作,讲解得明明白白。每一个基本命令的作用和结果。 **推荐阅读:**