diff --git a/README.md b/README.md index 7dd9fcd6..33564b82 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> [JavaGuide 官方知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)来啦!!!如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 +> [JavaGuide 官方知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)来啦!!!如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。

@@ -19,22 +19,21 @@

- > 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造,配合 JavaGuide 食用)。 > 1. **知识星球** :专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 [JavaGuide 知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(点击链接即可查看星球的详细介绍,一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我)。 > 2. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! 推荐你通过在线阅读网站进行阅读,体验更好,速度更快! -- [JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/) -- [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/) +* [JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/) +* [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/) 你可能需要: -- [项目介绍](./docs/javaguide/intro) -- [贡献指南](./docs/javaguide/contribution-guideline) -- [常见问题](./docs/javaguide/faq) -- [项目代办](./docs/javaguide/todo) +* [项目介绍](./docs/javaguide/intro) +* [贡献指南](./docs/javaguide/contribution-guideline) +* [常见问题](./docs/javaguide/faq) +* [项目代办](./docs/javaguide/todo) ## Java @@ -42,18 +41,18 @@ **知识点/面试题** : (必看:+1: ): -- [Java 基础常见知识点&面试题总结(上)](docs/java/basis/java-basic-questions-01.md) -- [Java 基础常见知识点&面试题总结(中)](docs/java/basis/java-basic-questions-02.md) -- [Java 基础常见知识点&面试题总结(下)](docs/java/basis/java-basic-questions-03.md) +* [Java 基础常见知识点&面试题总结(上)](docs/java/basis/java-basic-questions-01.md) +* [Java 基础常见知识点&面试题总结(中)](docs/java/basis/java-basic-questions-02.md) +* [Java 基础常见知识点&面试题总结(下)](docs/java/basis/java-basic-questions-03.md) **重要知识点详解** : -- [为什么 Java 中只有值传递?](docs/java/basis/why-there-only-value-passing-in-java.md) -- [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/reflection.md) -- [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/proxy.md) -- [常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?](docs/java/basis/io.md) -- [BigDecimal解决浮点数运算精度丢失问题](docs/java/basis/bigdecimal.md) -- **[泛型连环炮](docs/java/basis/generics.md)** +* [为什么 Java 中只有值传递?](docs/java/basis/why-there-only-value-passing-in-java.md) +* [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/reflection.md) +* [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/proxy.md) +* [常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?](docs/java/basis/io.md) +* [BigDecimal解决浮点数运算精度丢失问题](docs/java/basis/bigdecimal.md) +* **[泛型连环炮](docs/java/basis/generics.md)** ### 集合 @@ -65,9 +64,9 @@ **源码分析** : -- [ArrayList 源码+扩容机制分析](docs/java/collection/arraylist-source-code.md) -- [HashMap(JDK1.8)源码+底层数据结构分析](docs/java/collection/hashmap-source-code.md) -- [ConcurrentHashMap 源码+底层数据结构分析](docs/java/collection/concurrent-hash-map-source-code.md) +* [ArrayList 源码+扩容机制分析](docs/java/collection/arraylist-source-code.md) +* [HashMap(JDK1.8)源码+底层数据结构分析](docs/java/collection/hashmap-source-code.md) +* [ConcurrentHashMap 源码+底层数据结构分析](docs/java/collection/concurrent-hash-map-source-code.md) ### 并发 @@ -82,7 +81,7 @@ 2. [ThreadLocal 关键字解析](docs/java/concurrent/threadlocal.md) 3. [Java 并发容器总结](docs/java/concurrent/java-concurrent-collections.md) 4. [Atomic 原子类总结](docs/java/concurrent/atomic-classes.md) -5. [AQS 原理以及 AQS 同步组件总结](docs/java/concurrent/aqs原理以及aqs同步组件总结.md) +5. [AQS 原理以及 AQS 同步组件总结](docs/java/concurrent/aqs.md) 6. [CompletableFuture入门](docs/java/concurrent/completablefuture-intro.md) ### JVM (必看 :+1:) @@ -142,14 +141,14 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle 算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的: -- [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。 -- [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374) +* [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。 +* [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374) **常见算法问题总结** : -- [几道常见的字符串算法题总结 ](docs/cs-basics/algorithms/string-algorithm-problems.md) -- [几道常见的链表算法题总结 ](docs/cs-basics/algorithms/linkedlist-algorithm-problems.md) -- [剑指 offer 部分编程题](docs/cs-basics/algorithms/the-sword-refers-to-offer.md) +* [几道常见的字符串算法题总结 ](docs/cs-basics/algorithms/string-algorithm-problems.md) +* [几道常见的链表算法题总结 ](docs/cs-basics/algorithms/linkedlist-algorithm-problems.md) +* [剑指 offer 部分编程题](docs/cs-basics/algorithms/the-sword-refers-to-offer.md) 另外,[GeeksforGeeks]( https://www.geeksforgeeks.org/fundamentals-of-algorithms/) 这个网站总结了常见的算法 ,比较全面系统。 @@ -178,26 +177,31 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle 1. [Redis 常见问题总结](docs/database/redis/redis-questions-01.md) 2. [3种常用的缓存读写策略](docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md) +2. [Redis 内存碎片](./docs/database/redis/redis-memory-fragmentation.md) ## 搜索引擎 用于提高搜索效率,功能和浏览器搜索引擎类似。比较常见的搜索引擎是 Elasticsearch(推荐) 和 Solr。 +## 开发工具 + +### Docker + +* [Docker 基本概念解读](./docs/tools/docker/docker-intro.md) +* [Docker从入门到上手干事](./docs/tools/docker/docker-in-action.md) + +### Git + +* [Git 入门](./docs/tools/git/git-intro.md) +* [Github 小技巧](./docs/tools/git/github-tips.md) + ## 系统设计 -### 系统设计必备基础 +### 基础 -#### RESTful API - -我们在进行后端开发的时候,主要的工作就是为前端或者其他后端服务提供 API 比如查询用户数据的 API 。RESTful API 是一种基于 REST 构建的 API,它是一种被设计的更好使用的 API。 - -相关阅读:[RestFul API 简明教程](docs/system-design/basis/RESTfulAPI.md) - -#### 命名 - -编程过程中,一定要重视命名。因为好的命名即是注释,别人一看到你的命名就知道你的变量、方法或者类是做什么的! - -相关阅读: [Java 命名之道](docs/system-design/basis/naming.md) 。 +- [RestFul API 简明教程](docs/system-design/basis/RESTfulAPI.md) +- [Java 命名之道](docs/system-design/basis/naming.md) +- [重构](./docs/system-design/basis/refactoring.md) ### 常用框架 @@ -229,13 +233,13 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle #### 认证授权 -**[《认证授权基础》](docs/system-design/security/basis-of-authority-certification.md)** 这篇文章中我会介绍认证授权常见概念: **Authentication**,**Authorization** 以及 **Cookie**、**Session**、Token、**OAuth 2**、**SSO** 。如果你不清楚这些概念的话,建议好好阅读一下这篇文章。 +**[《认证授权基础》](docs/system-design/security/basis-of-authority-certification.md)** 这篇文章中我会介绍认证授权常见概念: **Authentication**, **Authorization** 以及 **Cookie**、**Session**、Token、**OAuth 2**、**SSO** 。如果你不清楚这些概念的话,建议好好阅读一下这篇文章。 -- **JWT** :JWT(JSON Web Token)是一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。相关阅读: - - [JWT 优缺点分析以及常见问题解决方案](docs/system-design/security/advantages&disadvantages-of-jwt.md) - - [适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide) +* **JWT** :JWT(JSON Web Token)是一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。相关阅读: + + [JWT 优缺点分析以及常见问题解决方案](docs/system-design/security/advantages&disadvantages-of-jwt.md) + + [适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide) -- **SSO(单点登录)** :**SSO(Single Sign On)** 即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东家电等子系统。相关阅读:[**SSO 单点登录看这篇就够了!**](docs/system-design/security/sso-intro.md) +* **SSO(单点登录)** :**SSO(Single Sign On)** 即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东家电等子系统。相关阅读:[**SSO 单点登录看这篇就够了!**](docs/system-design/security/sso-intro.md) #### 数据脱敏 @@ -267,8 +271,8 @@ CAP 也就是 Consistency(一致性)、Availability(可用性)、Partiti 相关阅读: -- [Paxos 算法解读](docs/distributed-system/theorem&algorithm&protocol/paxos-algorithm.md) -- [Raft 算法解读](docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md) +* [Paxos 算法解读](docs/distributed-system/theorem&algorithm&protocol/paxos-algorithm.md) +* [Raft 算法解读](docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md) ### RPC @@ -276,8 +280,8 @@ RPC 让调用远程服务调用像调用本地方法那样简单。 Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: -- [Dubbo 常见问题总结](docs/distributed-system/rpc/dubbo.md) -- [服务之间的调用为啥不直接用 HTTP 而用 RPC?](docs/distributed-system/rpc/why-use-rpc.md) +* [Dubbo 常见问题总结](docs/distributed-system/rpc/dubbo.md) +* [服务之间的调用为啥不直接用 HTTP 而用 RPC?](docs/distributed-system/rpc/why-use-rpc.md) ### API 网关 @@ -285,8 +289,8 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: 相关阅读: -- [为什么要网关?你知道有哪些常见的网关系统?](docs/distributed-system/api-gateway.md) -- [百亿规模API网关服务Shepherd的设计与实现](https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html) +* [为什么要网关?你知道有哪些常见的网关系统?](docs/distributed-system/api-gateway.md) +* [百亿规模API网关服务Shepherd的设计与实现](https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html) ### 分布式 id @@ -326,7 +330,7 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: 分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。 -常见的分库分表工具有:`sharding-jdbc`(当当)、`TSharding`(蘑菇街)、`MyCAT`(基于 Cobar)、`Cobar`(阿里巴巴)...。 推荐使用 `sharding-jdbc`。 因为,`sharding-jdbc` 是一款轻量级 `Java` 框架,以 `jar` 包形式提供服务,不要我们做额外的运维工作,并且兼容性也很好。 +常见的分库分表工具有: `sharding-jdbc` (当当)、 `TSharding` (蘑菇街)、 `MyCAT` (基于 Cobar)、 `Cobar` (阿里巴巴)...。 推荐使用 `sharding-jdbc` 。 因为, `sharding-jdbc` 是一款轻量级 `Java` 框架,以 `jar` 包形式提供服务,不要我们做额外的运维工作,并且兼容性也很好。 相关阅读: [读写分离&分库分表常见问题总结](docs/high-performance/read-and-write-separation-and-library-subtable.md) @@ -384,43 +388,36 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: **灾备** = 容灾+备份。 -- **备份** : 将系统所产生的的所有重要数据多备份几份。 -- **容灾** : 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。 +* **备份** : 将系统所产生的的所有重要数据多备份几份。 +* **容灾** : 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。 **异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。 相关阅读: -- [搞懂异地多活,看这篇就够了](https://mp.weixin.qq.com/s/T6mMDdtTfBuIiEowCpqu6Q) -- [四步构建异地多活](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg) -- [《从零开始学架构》— 28 | 业务高可用的保障:异地多活架构](http://gk.link/a/10pKZ) +* [搞懂异地多活,看这篇就够了](https://mp.weixin.qq.com/s/T6mMDdtTfBuIiEowCpqu6Q) +* [四步构建异地多活](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg) +* [《从零开始学架构》— 28 | 业务高可用的保障:异地多活架构](http://gk.link/a/10pKZ) ## 开发工具 -### 数据库 - -- [CHINER: 干掉 PowerDesigner,这个国产数据库建模工具很强!](./docs/tools/database/CHINER.md) -- [DBeaver:开源数据库管理工具。](./docs/tools/database/DBeaver.md) -- [screw:一键生成数据库文档,堪称数据库界的Swagger](./docs/tools/database/screw.md) -- [DataGrip:IDEA官方的这个数据库管理神器真香!](./docs/tools/database/datagrip.md) - ### Git -- [Git 入门](./docs/tools/git/git-intro.md) -- [Github 小技巧](./docs/tools/git/git-intro.md) +* [Git 入门](./docs/tools/git/git-intro.md) +* [Github 小技巧](./docs/tools/git/git-intro.md) ### Docker -- [Docker 基本概念解读](./docs/tools/docker/docker-intro.md) -- [Docker从入门到上手干事](./docs/tools/docker/docker-in-action.md) +* [Docker 基本概念解读](./docs/tools/docker/docker-intro.md) +* [Docker从入门到上手干事](./docs/tools/docker/docker-in-action.md) ## 关于作者 -- [个人介绍 Q&A](https://javaguide.cn/about-the-author/) -- [我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager/) -- [入职培训一个月后的感受](https://javaguide.cn/about-the-author/feelings-after-one-month-of-induction-training/) -- [从毕业到入职半年的感受](https://javaguide.cn/about-the-author/feelings-of-half-a-year-from-graduation-to-entry/) -- [某培训机构盗我文章做成视频还上了B站热门](https://javaguide.cn/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular/) +* [个人介绍 Q&A](https://javaguide.cn/about-the-author/) +* [我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager/) +* [入职培训一个月后的感受](https://javaguide.cn/about-the-author/feelings-after-one-month-of-induction-training/) +* [从毕业到入职半年的感受](https://javaguide.cn/about-the-author/feelings-of-half-a-year-from-graduation-to-entry/) +* [某培训机构盗我文章做成视频还上了B站热门](https://javaguide.cn/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular/) ## 公众号 @@ -433,4 +430,3 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读: ![](https://img-blog.csdnimg.cn/7af97d4dccdb4123a541f336a107ca86.png) ![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3a2d826918a44bcbaa8d9272db3ad7d2~tplv-k3u1fbpfcp-watermark.image) - diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index e6a44376..6367f24d 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -10,23 +10,6 @@ module.exports = defineHopeConfig({ // 是否开启默认预加载 js shouldPrefetch: (file, type) => false, head: [ - // 百度站点验证 - ["meta", { name: "baidu-site-verification", content: "code-IZvTs9l2OK" }], - [ - "script", - { src: "https://cdn.jsdelivr.net/npm/react/umd/react.production.min.js" }, - ], - [ - "script", - { - src: "https://cdn.jsdelivr.net/npm/react-dom/umd/react-dom.production.min.js", - }, - ], - ["script", { src: "https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js" }], - [ - "script", - { src: "https://cdn.jsdelivr.net/npm/@babel/standalone/babel.min.js" }, - ], // 添加百度统计 [ "script", {}, @@ -42,7 +25,7 @@ module.exports = defineHopeConfig({ "link", { rel: "stylesheet", - href: "//at.alicdn.com/t/font_2922463_lu595twe5t.css", + href: "//at.alicdn.com/t/font_2922463_99aa80ii7cf.css", }, ], ], diff --git a/docs/.vuepress/navbar.ts b/docs/.vuepress/navbar.ts index fd160b5d..16914564 100644 --- a/docs/.vuepress/navbar.ts +++ b/docs/.vuepress/navbar.ts @@ -1,28 +1,10 @@ import { defineNavbarConfig } from "vuepress-theme-hope"; export const navbarConfig = defineNavbarConfig([ - { text: "Java面试指南", icon: "java", link: "/home" }, - { - text: "Java面试指北", - icon: "recommend", - link: "https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7", - }, - { - text: "官方知识星球", - icon: "recommend", - link: "https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc", - }, - { - text: "开发工具", - icon: "Tools", - link: "/tools/", - children: [ - { text: "Java", icon: "java", link: "/tools/java/jadx/" }, - { text: "Database", icon: "database", link: "/tools/database/chiner/" }, - { text: "Git", icon: "git", link: "/tools/git/git-intro/" }, - { text: "Docker", icon: "docker1", link: "/tools/docker/docker-intro/" }, - { text: "IntelliJ IDEA", icon: "intellijidea", link: "/idea-tutorial/" }, - ], - }, + { text: "面试指南", icon: "java", link: "/home.md" }, + { text: "优质专栏", icon: "recommend", link: "/zhuanlan/" }, + { text: "开源项目精选", icon: "github", link: "/open-source-project/" }, + { text: "关于作者", icon: "zuozhe", link: "/about-the-author/" }, + { text: "RSS订阅", icon: "rss", link: "https://javaguide.cn/feed.json" }, ]); diff --git a/docs/.vuepress/sidebar.ts b/docs/.vuepress/sidebar.ts index 0e68ed0f..ac070979 100644 --- a/docs/.vuepress/sidebar.ts +++ b/docs/.vuepress/sidebar.ts @@ -3,6 +3,16 @@ import { defineSidebarConfig } from "vuepress-theme-hope"; export const sidebarConfig = defineSidebarConfig({ // 应该把更精确的路径放置在前边 "/javaguide/": ["intro", "contribution-guideline", "faq", "todo"], + "/zhuanlan/": ["java-mian-shi-zhi-bei", "handwritten-rpc-framework"], + "/open-source-project/": [ + "tutorial", + "practical-project", + "system-design", + "tool-library", + "tools", + "machine-learning", + "big-data", + ], "/about-the-author/": [ { text: "个人经历", @@ -22,39 +32,10 @@ export const sidebarConfig = defineSidebarConfig({ children: [ "my-article-was-stolen-and-made-into-video-and-it-became-popular", "dog-that-copies-other-people-essay", + "zhishixingqiu-two-years", ], }, ], - "/tools/": [ - { - text: "Java", - icon: "java", - prefix: "java/", - collapsable: false, - children: ["jadx"], - }, - { - text: "Database", - icon: "database", - prefix: "database/", - collapsable: false, - children: ["chiner", "dbeaver", "screw", "datagrip"], - }, - { - text: "Git", - icon: "git", - prefix: "git/", - collapsable: false, - children: ["git-intro", "github-tips"], - }, - { - text: "Docker", - icon: "docker1", - prefix: "docker/", - collapsable: false, - children: ["docker-intro", "docker-in-action"], - }, - ], "/high-quality-technical-articles/": [ { text: "练级攻略", @@ -75,7 +56,7 @@ export const sidebarConfig = defineSidebarConfig({ }, { text: "面试", - icon: "mianshixinxi-02", + icon: "mianshi", prefix: "interview/", collapsable: false, children: [ @@ -92,46 +73,18 @@ export const sidebarConfig = defineSidebarConfig({ children: ["get-into-work-mode-quickly-when-you-join-a-company"], }, ], - "/idea-tutorial/": [ - { - text: "IDEA小技巧", - icon: "tips", - prefix: "idea-tips/", - collapsable: false, - children: [ - "idea-refractor-intro", - "idea-plug-in-development-intro", - "idea-source-code-reading-skills", - ], - }, - { - text: "IDEA插件推荐", - icon: "chajian1", - collapsable: false, - prefix: "idea-plugins/", - children: [ - "shortcut-key", - "idea-themes", - "improve-code", - "interface-beautification", - "camel-case", - "code-glance", - "code-statistic", - "git-commit-template", - "gson-format", - "idea-features-trainer", - "jclasslib", - "maven-helper", - "rest-devlop", - "save-actions", - "sequence-diagram", - "translation", - "others", - ], - }, - ], // 必须放在最后面 "/": [ + { + text: "面试准备", + icon: "mianshi", + prefix: "interview-preparation/", + collapsable: true, + children: [ + "teach-you-how-to-prepare-for-the-interview-hand-in-hand", + "interview-experience", + ], + }, { text: "Java", icon: "java", @@ -157,7 +110,6 @@ export const sidebarConfig = defineSidebarConfig({ "proxy", "io", "bigdecimal", - "generics", ], }, ], @@ -335,11 +287,41 @@ export const sidebarConfig = defineSidebarConfig({ collapsable: true, children: [ "redis-questions-01", - "3-commonly-used-cache-read-and-write-strategies", + { + text: "重要知识点", + icon: "important", + collapsable: true, + children: [ + "3-commonly-used-cache-read-and-write-strategies", + "redis-memory-fragmentation", + ], + }, ], }, ], }, + { + text: "开发工具", + icon: "Tools", + prefix: "tools/", + collapsable: true, + children: [ + { + text: "Git", + icon: "git", + prefix: "git/", + collapsable: true, + children: ["git-intro", "github-tips"], + }, + { + text: "Docker", + icon: "docker1", + prefix: "docker/", + collapsable: true, + children: ["docker-intro", "docker-in-action"], + }, + ], + }, { text: "系统设计", icon: "xitongsheji", @@ -352,7 +334,7 @@ export const sidebarConfig = defineSidebarConfig({ prefix: "basis/", icon: "basic", collapsable: true, - children: ["RESTfulAPI", "naming"], + children: ["RESTfulAPI", "naming", "refactoring"], }, { text: "常用框架", diff --git a/docs/.vuepress/themeConfig.ts b/docs/.vuepress/themeConfig.ts index 3da19d92..c358e845 100644 --- a/docs/.vuepress/themeConfig.ts +++ b/docs/.vuepress/themeConfig.ts @@ -5,13 +5,24 @@ import { sidebarConfig } from "./sidebar"; export default defineThemeConfig({ logo: "/logo.png", hostname: "https://javaguide.cn/", - author: "Guide哥", + author: { + name: "Guide", + url: "https://javaguide.cn/", + }, repo: "https://github.com/Snailclimb/JavaGuide", docsDir: "docs", iconPrefix: "iconfont icon-", pure: true, navbar: navbarConfig, sidebar: sidebarConfig, + pageInfo: [ + "Author", + "Category", + "Tag", + "Date", + "Original", + "Word", + ], blog: { intro: "/about-the-author/", sidebarDisplay: "mobile", @@ -34,15 +45,26 @@ export default defineThemeConfig({ plugins: ["highlight", "math", "search", "notes", "zoom"], }, }, - // docsearch: { - // appId: "", - // apiKey: "", - // indexName: "", - // }, + feed: { + json: true, + }, + search: { + // https://v2.vuepress.vuejs.org/zh/reference/plugin/search.html + // 排除首页 + isSearchable: (page) => page.path !== "/", + maxSuggestions: 10, + hotKeys: ["s", "/"], + // 用于在页面的搜索索引中添加额外字段 + getExtraFields: () => [], + locales: { + "/": { + placeholder: "搜索", + }, + }, + }, pwa: { favicon: "/favicon.ico", - cachePic: false, - cacheHTML: false, + cachePic: true, apple: { icon: "/assets/icon/apple-icon-152.png", statusBarColor: "black", diff --git a/docs/about-the-author/zhishixingqiu-two-years.md b/docs/about-the-author/zhishixingqiu-two-years.md new file mode 100644 index 00000000..61ddfb6c --- /dev/null +++ b/docs/about-the-author/zhishixingqiu-two-years.md @@ -0,0 +1,106 @@ +--- +title: 我的知识星球运营两年多了! +category: 知识星球 +--- + +时间过的真快,知识星球我已经运营了有 2 年多了! + +在 2019 年 12 月 29 号,经过了大概一年左右的犹豫期,我正式确定要开始做一个自己的星球。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021-1/%E7%9F%A5%E8%AF%86%E6%96%B0%E7%90%83%E4%B8%80%E5%91%A8%E5%B9%B4-0293.jpg) + +## 什么是知识星球? + +简单来说,知识星球就是一个私密交流圈子,主要用途是知识创作者连接铁杆读者/粉丝。相比于微信群,知识星球内容沉淀、信息管理更高效。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211223754566.png) + +## 我的知识星球能为你提供什么? + +努力做一个最优质的 Java 面试交流星球!加入到我的星球之后,你将获得: + +1. 6 个高质量的小册永久阅读,内容涵盖面试,源码解析,项目实战等内容!价值远超门票! +2. 专属求职指南和建议,帮助你逆袭大厂! +3. 一对一免费提问交流(专属建议,走心回答)。 +4. 免费的简历修改服务(已经累计帮助 1800+ 位球友)。 +5. 海量 Java 优质面试资源分享!价值远超门票! +6. 读书交流,学习交流,让我们一起努力创造一个纯粹的学习交流社区。 +7. 不定期福利:节日抽奖、送书送课、球友线下聚会等等。 +7. ...... + +### 简历修改 + +星球运行 2 年多,我累计帮助 **2000+** 位球友提供了免费的简历修改服务,回答了 **1000+** 个读者提问,产出了 **3800+** 个主题。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2021-1/image-20210102184923199.png) + +### 专属专栏 + +星球更新了 **《Java 面试指北》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》** 等多个优质专栏。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) + +各种手绘图解,内容质量非常高! + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211233356435.png) + +### 提问交流 + +你可以和我进行一对一免费提问交流,我会很走心地回答你的问题。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211223559179.png) + +### 读书活动 + +每个月至少还会又一次有奖励的读书活动,我会带着大家一起读一些优秀的技术书籍! + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211233642079.png) + +毫不夸张!每一期读书活动的获奖率都非常非常非常高!直接超过门票价!!! + +### 学习打卡 + +星球的学习打卡活动可以督促自己和其他球友们一起学习交流。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/image-20220308143815840.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/image-20220308144022039.png) + +## 是否收费? + +星球是需要付费才能进入的。 **为什么要收费呢?** + +1、维护好星球是一件费时费力的事情,每到面试季,我经常凌晨还在看简历和回答球友问题。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304123156348.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/IMG_2975_%E5%89%AF%E6%9C%AC.png) + +除此之外,我还要抽时间写星球的专属的一些专栏,单单是这些专栏的价值就远超星球门票了。 + +2、如果我是免费提供这些服务的话,我自己是肯定忙不过来的。付费这个门槛可以帮我筛选出真正需要帮助的那批人。 + +3、网站的运行也需要花钱,不管是服务器还是 CDN 都是一笔不小的开支(1w 左右/年)。 + +4、我觉得合理的收费是对我付出劳动的一种正向激励,促进我继续输出! + +## 如何加入? + +两年前,[知识星球](../about-the-author/zhishixingqiu-two-years.md)的定价是 **50/年** ,这是星球的最低定价,我还附送了优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。 + +当时的想法真不是为了赚钱,不开玩笑,不打诳语!目前星球有 **8000+** 人,其中有超过 **35%** 的小伙伴都是星球刚开那会就加入了。 + +随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 **159/年**!是的,星球的价格会慢慢升高的,想要加入的小伙伴一定要尽早。 + +你可以添加我的微信领取星球专属优惠券,限时 **100 元/年** 加入。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/IMG_3007.jpg) + +如果你经济确实有困难的话,加我的时候说明一下情况就好,莫欺少年穷,可以理解,一定不要去用什么花呗类借贷产品。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125325364.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125403995.png) + +不过,还是希望大家也不要利用我的好心,感恩!信任!理解! + diff --git a/docs/cs-basics/network/http&https.md b/docs/cs-basics/network/http&https.md index 5ba8a479..c7bcbc57 100644 --- a/docs/cs-basics/network/http&https.md +++ b/docs/cs-basics/network/http&https.md @@ -132,7 +132,7 @@ SSL/TLS 介绍到这里,了解信息安全的朋友又会想到一个安全隐 总结来说,带有证书的公钥传输机制如下: 1. 设有服务器 S,客户端 C,和第三方信赖机构 CA。 -2. S 信任 CA,CA 是知道 S 公钥的,S 向 CA 颁发证书。并附上 CA 私钥对消息摘要的加密签名。 +2. S 信任 CA,CA 是知道 S 公钥的,CA 向 S 颁发证书。并附上 CA 私钥对消息摘要的加密签名。 3. S 获得 CA 颁发的证书,将该证书传递给 C。 4. C 获得 S 的证书,信任 CA 并知晓 CA 公钥,使用 CA 公钥对 S 证书山的签名解密,同时对消息进行散列处理,得到摘要。比较摘要,验证 S 证书的真实性。 5. 如果 C 验证 S 证书是真实的,则信任 S 的公钥(在 S 证书中)。 diff --git a/docs/database/mysql/mysql-index.md b/docs/database/mysql/mysql-index.md index 04a46e44..5ffba418 100644 --- a/docs/database/mysql/mysql-index.md +++ b/docs/database/mysql/mysql-index.md @@ -35,15 +35,13 @@ tag: 哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据(接近 O(1))。 -**为何能够通过 key 快速取出 value呢?** 原因在于 **哈希算法**(也叫散列算法)。通过哈希算法,我们可以快速找到 value 对应的 index,找到了 index 也就找到了对应的 value。 +**为何能够通过 key 快速取出 value呢?** 原因在于 **哈希算法**(也叫散列算法)。通过哈希算法,我们可以快速找到 key 对应的 index,找到了 index 也就找到了对应的 value。 ```java hash = hashfunc(key) index = hash % array_size ``` - - ![](https://img-blog.csdnimg.cn/20210513092328171.png) 但是!哈希算法有个 **Hash 冲突** 问题,也就是说多个不同的 key 最后得到的 index 相同。通常情况下,我们常用的解决办法是 **链地址法**。链地址法就是将哈希冲突数据存放在链表中。就比如 JDK1.8 之前 `HashMap` 就是通过链地址法来解决哈希冲突的。不过,JDK1.8 以后`HashMap`为了减少链表过长的时候搜索时间过长引入了红黑树。 @@ -61,7 +59,7 @@ index = hash % array_size 试想一种情况: ```java -SELECT * FROM tb1 WHERE id < 500;Copy to clipboardErrorCopied +SELECT * FROM tb1 WHERE id < 500; ``` 在这种范围查询中,优势非常大,直接遍历比 500 小的叶子节点就够了。而 Hash 索引是根据 hash 算法来定位的,难不成还要把 1 - 499 的数据,每个都进行一次 hash 计算来定位吗?这就是 Hash 最大的缺点了。 @@ -111,6 +109,7 @@ InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索 4. **全文索引(Full Text)** :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。 二级索引: + ![](https://img-blog.csdnimg.cn/20210420165254215.png) ## 聚集索引与非聚集索引 @@ -128,9 +127,7 @@ InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索 #### 聚集索引的缺点 1. **依赖于有序的数据** :因为 B+树是多路平衡树,如果索引的数据不是有序的,那么就需要在插入时排序,如果数据是整型还好,否则类似于字符串或 UUID 这种又长又难比较的数据,插入或查找的速度肯定比较慢。 -2. **更新代价大** : 如果对索引列的数据被修改时,那么对应的索引也将会被修改, - 而且况聚集索引的叶子节点还存放着数据,修改代价肯定是较大的, - 所以对于主键索引来说,主键一般都是不可被修改的。 +2. **更新代价大** : 如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。 ### 非聚集索引 diff --git a/docs/database/mysql/mysql-logs.md b/docs/database/mysql/mysql-logs.md index cb7990f7..826e9e60 100644 --- a/docs/database/mysql/mysql-logs.md +++ b/docs/database/mysql/mysql-logs.md @@ -5,15 +5,13 @@ tag: - MySQL --- - - > 本文来自公号程序猿阿星投稿,JavaGuide 对其做了补充完善。 ## 前言 `MySQL` 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 `binlog`(归档日志)和事务日志 `redo log`(重做日志)和 `undo log`(回滚日志)。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/01.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/01.png) 今天就来聊聊 `redo log`(重做日志)、`binlog`(归档日志)、两阶段提交、`undo log` (回滚日志)。 @@ -23,7 +21,7 @@ tag: 比如 `MySQL` 实例挂了或宕机了,重启时,`InnoDB`存储引擎会使用`redo log`恢复数据,保证数据的持久性与完整性。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/02.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/02.png) `MySQL` 中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 `Buffer Pool` 中。 @@ -33,9 +31,9 @@ tag: 然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(`redo log buffer`)里,接着刷盘到 `redo log` 文件里。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/03.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/03.png) -> 图片笔误提示:第4步 “清空 redo log buffe 刷盘到 redo 日志中”这句话中的 buffe 应该是 buffer。 +> 图片笔误提示:第 4 步 “清空 redo log buffe 刷盘到 redo 日志中”这句话中的 buffe 应该是 buffer。 理想情况,事务一提交就会进行刷盘操作,但实际上,刷盘的时机是根据策略来进行的。 @@ -53,7 +51,7 @@ tag: 另外,`InnoDB` 存储引擎有一个后台线程,每隔`1` 秒,就会把 `redo log buffer` 中的内容写到文件系统缓存(`page cache`),然后调用 `fsync` 刷盘。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/04.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/04.png) 也就是说,一个没有提交事务的 `redo log` 记录,也可能会刷盘。 @@ -61,7 +59,7 @@ tag: 因为在事务执行过程 `redo log` 记录是会写入`redo log buffer` 中,这些 `redo log` 记录会被后台线程刷盘。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/05.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/05.png) 除了后台线程每秒`1`次的轮询操作,还有一种情况,当 `redo log buffer` 占用的空间即将达到 `innodb_log_buffer_size` 一半的时候,后台线程会主动刷盘。 @@ -69,13 +67,13 @@ tag: #### innodb_flush_log_at_trx_commit=0 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/06.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/06.png) 为`0`时,如果`MySQL`挂了或宕机可能会有`1`秒数据的丢失。 #### innodb_flush_log_at_trx_commit=1 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/07.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/07.png) 为`1`时, 只要事务提交成功,`redo log`记录就一定在硬盘里,不会有任何数据丢失。 @@ -83,7 +81,7 @@ tag: #### innodb_flush_log_at_trx_commit=2 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/09.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/09.png) 为`2`时, 只要事务提交成功,`redo log buffer`中的内容只写入文件系统缓存(`page cache`)。 @@ -97,7 +95,7 @@ tag: 它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/10.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/10.png) 在个**日志文件组**中还有两个重要的属性,分别是 `write pos、checkpoint` @@ -110,11 +108,11 @@ tag: `write pos` 和 `checkpoint` 之间的还空着的部分可以用来写入新的 `redo log` 记录。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/11.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/11.png) 如果 `write pos` 追上 `checkpoint` ,表示**日志文件组**满了,这时候不能再写入新的 `redo log` 记录,`MySQL` 得停下来,清空一些记录,把 `checkpoint` 推进一下。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/03/12.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/12.png) ### redo log 小结 @@ -155,7 +153,7 @@ tag: 可以说`MySQL`数据库的**数据备份、主备、主主、主从**都离不开`binlog`,需要依靠`binlog`来同步数据,保证数据一致性。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/04/01.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/01-20220305234724956.png) `binlog`会记录所有涉及更新数据的逻辑操作,并且是顺序写。 @@ -169,13 +167,13 @@ tag: 指定`statement`,记录的内容是`SQL`语句原文,比如执行一条`update T set update_time=now() where id=1`,记录的内容如下。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/04/02.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/02-20220305234738688.png) 同步数据时,会执行记录的`SQL`语句,但是有个问题,`update_time=now()`这里会获取当前系统时间,直接执行会导致与原库的数据不一致。 为了解决这种问题,我们需要指定为`row`,记录的内容不再是简单的`SQL`语句了,还包含操作的具体数据,记录内容如下。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/04/03.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/03-20220305234742460.png) `row`格式记录的内容看不到详细信息,要通过`mysqlbinlog`工具解析出来。 @@ -199,7 +197,7 @@ tag: `binlog`日志刷盘流程如下 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/04/04.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/04-20220305234747840.png) - **上图的 write,是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快** - **上图的 fsync,才是将数据持久化到磁盘的操作** @@ -208,15 +206,15 @@ tag: 为`0`的时候,表示每次提交事务都只`write`,由系统自行判断什么时候执行`fsync`。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/04/05.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/05-20220305234754405.png) 虽然性能得到提升,但是机器宕机,`page cache`里面的 binlog 会丢失。 -为了安全起见,可以设置为`1`,表示每次提交事务都会执行`fsync`,就如同**binlog 日志刷盘流程**一样。 +为了安全起见,可以设置为`1`,表示每次提交事务都会执行`fsync`,就如同 **redo log 日志刷盘流程** 一样。 最后还有一种折中方式,可以设置为`N(N>1)`,表示每次提交事务都`write`,但累积`N`个事务后才`fsync`。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/04/06.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/06-20220305234801592.png) 在出现`IO`瓶颈的场景里,将`sync_binlog`设置成一个比较大的值,可以提升性能。 @@ -232,7 +230,7 @@ tag: 在执行更新语句过程,会记录`redo log`与`binlog`两块日志,以基本的事务为单位,`redo log`在事务执行过程中可以不断写入,而`binlog`只有在提交事务时才写入,所以`redo log`与`binlog`的写入时机不一样。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/05/01.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/01-20220305234816065.png) 回到正题,`redo log`与`binlog`两份日志之间的逻辑不一致,会出现什么问题? @@ -240,25 +238,25 @@ tag: 假设执行过程中写完`redo log`日志后,`binlog`日志写期间发生了异常,会出现什么情况呢? -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/05/02.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/02-20220305234828662.png) 由于`binlog`没写完就异常,这时候`binlog`里面没有对应的修改记录。因此,之后用`binlog`日志恢复数据时,就会少这一次更新,恢复出来的这一行`c`值是`0`,而原库因为`redo log`日志恢复,这一行`c`值是`1`,最终数据不一致。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/05/03.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/03-20220305235104445.png) 为了解决两份日志之间的逻辑一致问题,`InnoDB`存储引擎使用**两阶段提交**方案。 原理很简单,将`redo log`的写入拆成了两个步骤`prepare`和`commit`,这就是**两阶段提交**。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/05/04.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/04-20220305234956774.png) 使用**两阶段提交**后,写入`binlog`时发生异常也不会有影响,因为`MySQL`根据`redo log`日志恢复数据时,发现`redo log`还处于`prepare`阶段,并且没有对应`binlog`日志,就会回滚该事务。 -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/05/05.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/05-20220305234937243.png) 再看一个场景,`redo log`设置`commit`阶段发生异常,那会不会回滚事务呢? -![](https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/05/06.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/06-20220305234907651.png) 并不会回滚事务,它会执行上图框住的逻辑,虽然`redo log`是处于`prepare`阶段,但是能通过事务`id`找到对应的`binlog`日志,所以`MySQL`认为是完整的,就会提交事务恢复数据。 diff --git a/docs/database/mysql/mysql-questions-01.md b/docs/database/mysql/mysql-questions-01.md index 2a300b18..e29814c9 100644 --- a/docs/database/mysql/mysql-questions-01.md +++ b/docs/database/mysql/mysql-questions-01.md @@ -111,7 +111,7 @@ MyISAM 不支持,而 InnoDB 支持。 讲真,这个对比有点废话,毕竟 MyISAM 连行级锁都不支持。 -MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提供性能。 +MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提高性能。 ### 关于 MyISAM 和 InnoDB 的选择问题 diff --git a/docs/distributed-system/distributed-id.md b/docs/distributed-system/distributed-id.md index 97d66366..71f2e079 100644 --- a/docs/distributed-system/distributed-id.md +++ b/docs/distributed-system/distributed-id.md @@ -143,7 +143,7 @@ SELECT `current_max_id`, `step`,`version` FROM `sequence_id_generator` where `bi ``` id current_max_id step version biz_type -1 0 100 1 101 +1 0 100 0 101 ``` **4.不够用的话,更新之后重新 SELECT 即可。** diff --git a/docs/distributed-system/distributed-transaction.md b/docs/distributed-system/distributed-transaction.md index c020c89e..de735db4 100644 --- a/docs/distributed-system/distributed-transaction.md +++ b/docs/distributed-system/distributed-transaction.md @@ -7,17 +7,4 @@ category: 分布式 《Java 面试指北》的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。 -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/1&e=1648742399&token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD:HyfLWy5gNC5F_XukPYrlj_a4EJI=.png) - -我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) - -如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 - -星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) - -**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** - +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102536445.png) diff --git a/docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md b/docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md index 0cd53468..a8d7c544 100644 --- a/docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md +++ b/docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md @@ -5,6 +5,8 @@ tag: - 分布式协议&算法 --- +> 本文由 [SnailClimb](https://github.com/Snailclimb) 和 [Xieqijun](https://github.com/jun0315) 共同完成。 + ## 1 背景 当今的数据中心和应用程序在高度动态的环境中运行,为了应对高度动态的环境,它们通过额外的服务器进行横向扩展,并且根据需求进行扩展和收缩。同时,服务器和网络故障也很常见。 @@ -21,7 +23,7 @@ tag: 解决方案大致可以理解成:先在所有的将军中选出一个大将军,用来做出所有的决定。 -举例如下:假如现在一共有 3 个将军 A,B 和 C,每个将军都有一个随机时间的倒计时器,倒计时一结束,这个将军就把自己当成大将军候选人,然后派信使传递选举投票的信息给将军 B 和 C,如果将军 B 和 C 还没有把自己当作候选人(自己的倒计时还没有结束),并且没有把选举票投给其他人,它们就会把票投给将军 A,信使回到将军 A 时,将军 A 知道自己收到了足够的票数,成为大将军。在有了大将军之后,是否需要进攻就由大将军 A 决定,然后再去派信使通知另外两个将军,自己已经成为了大将军。如果一段时间还没收到将军 B 和 C 的回复(信使可能会被暗示),那就再重派一个信使,直到收到回复。 +举例如下:假如现在一共有 3 个将军 A,B 和 C,每个将军都有一个随机时间的倒计时器,倒计时一结束,这个将军就把自己当成大将军候选人,然后派信使传递选举投票的信息给将军 B 和 C,如果将军 B 和 C 还没有把自己当作候选人(自己的倒计时还没有结束),并且没有把选举票投给其他人,它们就会把票投给将军 A,信使回到将军 A 时,将军 A 知道自己收到了足够的票数,成为大将军。在有了大将军之后,是否需要进攻就由大将军 A 决定,然后再去派信使通知另外两个将军,自己已经成为了大将军。如果一段时间还没收到将军 B 和 C 的回复(信使可能会被暗杀),那就再重派一个信使,直到收到回复。 ### 1.2 共识算法 diff --git a/docs/high-availability/fallback&circuit-breaker.md b/docs/high-availability/fallback&circuit-breaker.md index acc7b673..18b6fb1f 100644 --- a/docs/high-availability/fallback&circuit-breaker.md +++ b/docs/high-availability/fallback&circuit-breaker.md @@ -4,19 +4,4 @@ 《Java 面试指北》的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。 -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/1&e=1648742399&token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD:HyfLWy5gNC5F_XukPYrlj_a4EJI=.png) - -我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) - -如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 - -星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) - -**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** - - - +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102536445.png) diff --git a/docs/home.md b/docs/home.md index 08b16375..df216f4a 100644 --- a/docs/home.md +++ b/docs/home.md @@ -9,28 +9,22 @@ title: JavaGuide(Java学习&&面试指南)

-

- - - -

-

- 阅读 - stars - forks - issues -

-> 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造,配合 JavaGuide 食用) -> 2. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️ +> 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试指北 》](./zhuanlan/java-mian-shi-zhi-bei.md) (质量很高,专为面试打造,配合 JavaGuide 食用) +> 2. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! -你可能需要: +## 必看专栏 -- [项目介绍](/javaguide/intro) -- [贡献指南](/javaguide/contribution-guideline) -- [常见问题](/javaguide/faq) -- [项目代办](/javaguide/todo) +- **[《Java 面试指北》](./zhuanlan/java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补! +- **[《手写 RPC 框架》](./zhuanlan/handwritten-rpc-framework.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 + +## 项目相关 + +- [项目介绍](./javaguide/intro.md) +- [贡献指南](./javaguide/contribution-guideline.md) +- [常见问题](./javaguide/faq.md) +- [项目代办](./javaguide/todo.md) ## 面试资源 diff --git a/docs/idea-tutorial/idea-plugins/camel-case.md b/docs/idea-tutorial/idea-plugins/camel-case.md deleted file mode 100644 index c6be2ef0..00000000 --- a/docs/idea-tutorial/idea-plugins/camel-case.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Camel Case:命名之间快速切换 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - -非常有用!这个插件可以实现包含6种常见命名格式之间的切换。并且,你还可以对转换格式进行相关配置(转换格式) *Preferences / Settings | Camel Case* 。 - -![](./pictures/camel-case/camel-case1.png) - -有了这个插件之后,点击你想要修改的变量或者方法名使用快捷键 `shift+option+u(mac)` / `shift+alt+u` 即可实现在多种命名格式之间切换。 - -![](./pictures/camel-case/camel-case2.gif) - -如果你突然忘记快捷键的话,可以直接在IDEA的菜单栏的 Edit 部分找到。 - -![](./pictures/camel-case/camel-case3.png) - -使用这个插件对开发效率提升高吗?拿我之前项目组的情况举个例子: - -我之前有一个项目组的测试名字是驼峰这种形式: `ShouldReturnTicketWhenRobotSaveBagGiven1LockersWith2FreeSpace` 。但是,使用驼峰形式命名测试方法的名字不太明显,一般建议用下划线_的形式: `should_return_ticket_when_robot_save_bag_given_1_lockers_with_2_free_space` - -如果我们不用这个插件,而是手动去一个一个改的话,工作量想必会很大,而且正确率也会因为手工的原因降低。 - diff --git a/docs/idea-tutorial/idea-plugins/code-glance.md b/docs/idea-tutorial/idea-plugins/code-glance.md deleted file mode 100644 index 9345ab42..00000000 --- a/docs/idea-tutorial/idea-plugins/code-glance.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: CodeGlance:代码微型地图 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - -CodeGlance提供一个代码的微型地图,当你的类比较多的时候可以帮忙你快速定位到要去的位置。这个插件在我们日常做普通开发的时候用处不大,不过,在你阅读源码的时候还是很有用的,如下图所示: - -![](./pictures/code-glance.png) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/code-statistic.md b/docs/idea-tutorial/idea-plugins/code-statistic.md deleted file mode 100644 index 1d60c81b..00000000 --- a/docs/idea-tutorial/idea-plugins/code-statistic.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Statistic:项目代码统计 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - -编程是一个很奇妙的事情,大部分的我们把大部分时间实际都花在了复制粘贴,而后修改代码上面。 - -很多时候,我们并不关注代码质量,只要功能能实现,我才不管一个类的代码有多长、一个方法的代码有多长。 - -因此,我们经常会碰到让自己想要骂街的项目,不过,说真的,你自己写的代码也有极大可能被后者 DISS。 - -为了快速分析项目情况,判断这个项目是不是一个“垃圾”项目,有一个方法挺简单的。 - -那就是**对代码的总行数、单个文件的代码行数、注释行数等信息进行统计。** - -**怎么统计呢?** - -首先想到的是 Excel 。不过,显然太麻烦了。 - -**有没有专门用于代码统计的工具呢?** - -基于Perl语言开发的cloc(count lines of code)或许可以满足你的要求。 - -**有没有什么更简单的办法呢?** - -如果你使用的是 IDEA 进行开发的话,推荐你可以使用一下 **Statistic** 这个插件。 - -有了这个插件之后你可以非常直观地看到你的项目中所有类型的文件的信息比如数量、大小等等,可以帮助你更好地了解你们的项目。 - -![](./pictures/Statistic1.png) - -你还可以使用它看所有类的总行数、有效代码行数、注释行数、以及有效代码比重等等这些东西。 - -![](./pictures/Statistic2.png) - -如果,你担心插件过多影响IDEA速度的话,可以只在有代码统计需求的时候开启这个插件,其他时间禁用它就完事了! \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/git-commit-template.md b/docs/idea-tutorial/idea-plugins/git-commit-template.md deleted file mode 100644 index c75dae11..00000000 --- a/docs/idea-tutorial/idea-plugins/git-commit-template.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Git Commit Template:提交代码格式规范 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - -没有安装这个插件之前,我们使用IDEA提供的Commit功能提交代码是下面这样的: - -![](./pictures/git-commit-template/Git-Commit-Template1.png) - -使用了这个插件之后是下面这样的,提供了一个commit信息模板的输入框: - -![](./pictures/git-commit-template/Git-Commit-Template2.png) - -完成之后的效果是这样的: - -![](./pictures/git-commit-template/Git-Commit-Template3.png) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/gson-format.md b/docs/idea-tutorial/idea-plugins/gson-format.md deleted file mode 100644 index 5b9a8461..00000000 --- a/docs/idea-tutorial/idea-plugins/gson-format.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: GsonFormat:JSON转对象 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - -GsonFormat 这个插件可以根据Gson库使用的要求,将JSONObject格式的String 解析成实体类。 - -> 说明:2021.x 版本以上的 IDEA 可以使用:GsonFormatPlus - -使用起来非常简单,我们新建一个类,然后在类中使用快捷键 `option + s`(Mac)或`alt + s` (win)调出操作窗口(**必须在类中使用快捷键才有效**),如下图所示。 - -![](./pictures/gson-format/gson-format2.png) - -![](./pictures/gson-format/gson-format3.png) - -这个插件是一个国人几年前写的,不过已经很久没有更新了,可能会因为IDEA的版本问题有一些小Bug。而且,这个插件无法将JSON转换为Kotlin(这个其实无关痛痒,IDEA自带的就有Java转Kotlin的功能)。 - -![](./pictures/gson-format/gson-format1.png) - -另外一个与之相似的插件是 **:RoboPOJOGenerator** ,这个插件的更新频率比较快。 - -`File-> new -> Generate POJO from JSON` - -![](./pictures/RoboPOJOGenerator1.png) - -然后将JSON格式的数据粘贴进去之后,配置相关属性之后选择“*Generate*” - -![](./pictures/RoboPOJOGenerator2.png) - - - diff --git a/docs/idea-tutorial/idea-plugins/idea-features-trainer.md b/docs/idea-tutorial/idea-plugins/idea-features-trainer.md deleted file mode 100644 index a5cb4960..00000000 --- a/docs/idea-tutorial/idea-plugins/idea-features-trainer.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: IDE Features Trainer:IDEA 交互式教程 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - -**有了这个插件之后,你可以在 IDE 中以交互方式学习IDEA最常用的快捷方式和最基本功能。** 非常非常非常方便!强烈建议大家安装一个,尤其是刚开始使用IDEA的朋友。 - -当我们安装了这个插件之后,你会发现我们的IDEA 编辑器的右边多了一个“**Learn**”的选项,我们点击这个选项就可以看到如下界面。 - -![](./pictures/IDE-Features-Trainer1.png?lastModify=1633856821) - -我们选择“Editor Basics”进行,然后就可以看到如下界面,这样你就可以按照指示来练习了!非常不错! - -![](./pictures/IDE-Features-Trainer2.png?lastModify=1633856821) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/idea-themes.md b/docs/idea-tutorial/idea-plugins/idea-themes.md deleted file mode 100644 index ca38f19f..00000000 --- a/docs/idea-tutorial/idea-plugins/idea-themes.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: IDEA主题推荐 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - -经常有小伙伴问我:“Guide哥,你的IDEA 主题怎么这么好看,能推荐一下不?”。就实在有点不耐烦了,才索性写了这篇文章。 - -在这篇文章中,我精选了几个比较是和 Java 编码的 IDEA 主题供小伙伴们选择。另外,我自己用的是 One Dark theme 这款。 - -**注意:以下主题按照使用人数降序排序。** - -## [Material Theme UI](https://plugins.jetbrains.com/plugin/8006-material-theme-ui) - -**推荐指数** :⭐⭐⭐⭐ - -这是 IDEA 中使用人数最多的一款主题。 - -当你安装完这个插件之后,你会发现这个主题本身又提供了多种相关的主题供你选择。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20/image-20201119182935201.png) - - **Material Deep Ocean** 这款的效果图如下。默认的字体是真的小,小伙伴们需要自行调整一下。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20/image-20201119183044068.png) - -## [One Dark theme](https://plugins.jetbrains.com/plugin/11938-one-dark-theme) - -**推荐指数** :⭐⭐⭐⭐⭐ - -我比较喜欢的一款(*黄色比较多?*)。 没有花里花哨,简单大气,看起来比较舒服。颜色搭配也很棒,适合编码! - -这款主题的效果图如下。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20-11/image-20201119180300975.png) - -## [Gradianto](https://plugins.jetbrains.com/plugin/12334-gradianto) - -**推荐指数** :⭐⭐⭐⭐⭐ - -Gradianto这个主题的目标是在保持页面色彩比较层次分明的情况下,让我们因为代码而疲惫的双眼更加轻松。 - -Gradianto附带了自然界的渐变色,看着挺舒服的。另外,这个主题本身也提供了多种相关的主题供你选择。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20/image-20201119183825753.png) - -**Gradianto Nature Green** 的效果图如下。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20/image-20201119183920889.png) - -## [Dark Purple Theme](https://plugins.jetbrains.com/plugin/12100-dark-purple-theme) - -**推荐指数** :⭐⭐⭐⭐⭐ - -这是一款紫色色调的深色主题,喜欢紫色的小伙伴不要错过。 - -这个主题的效果图如下。个人觉得整体颜色搭配的是比较不错的,适合编码! - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20-11/image-20201119184654132.png) - -## [Hiberbee Theme](https://plugins.jetbrains.com/plugin/12118-hiberbee-theme) - -**推荐指数** :⭐⭐⭐⭐⭐ - -一款受到了 Monokai Pro 和 MacOS Mojave启发的主题,是一款色彩层次分明的深色主题。 - -这个主题的效果图如下。看着也是非常赞!适合编码! - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20-11/image-20201119191441248.png) - -上面推荐的都是偏暗色系的主题,这里我再推荐两款浅色系的主题。 - -## [Gray Theme](https://plugins.jetbrains.com/plugin/12103-gray-theme) - -**推荐指数** :⭐⭐⭐ - -这是一款对比度比较低的一款浅色主题,不太适合代码阅读,毕竟这款主题是专门为在IntelliJ IDE中使用Markdown而设计的。 - -这个主题的效果图如下。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/11-20-11/image-20201119194512164.png) - -## [Roboticket Light Theme](https://plugins.jetbrains.com/plugin/12191-roboticket-light-theme) - -**推荐指数** :⭐⭐⭐ - -这是一款对比度比较低的浅色主题,不太适合代码阅读。 - -这个主题的效果图如下。 - -![](https://img-blog.csdnimg.cn/img_convert/194581c7b72d49b512b12814340f00c8.png) - -## 后记 - -我个人还是比较偏爱深色系的主题。 - -小伙伴们比较喜欢哪款主题呢?可以在评论区简单聊聊不?如果你还有其他比较喜欢的主题也可以在评论区说出来供大家参考哦! \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/improve-code.md b/docs/idea-tutorial/idea-plugins/improve-code.md deleted file mode 100644 index 9e8d0cf2..00000000 --- a/docs/idea-tutorial/idea-plugins/improve-code.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: IDEA 代码优化插件推荐 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 - - 代码优化 ---- - -## Lombok:帮你简化代码 - -之前没有推荐这个插件的原因是觉得已经是人手必备的了。如果你要使用 Lombok 的话,不光是要安装这个插件,你的项目也要引入相关的依赖。 - -```xml - - org.projectlombok - lombok - true - -``` - -使用 Lombok 能够帮助我们少写很多代码比如 Getter/Setter、Constructor 等等。 - -关于 Lombok 的使用,可以查看这篇文章:[《十分钟搞懂 Java 效率工具 Lombok 使用与原理》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485385&idx=2&sn=a7c3fb4485ffd8c019e5541e9b1580cd&chksm=cea24802f9d5c1144eee0da52cfc0cc5e8ee3590990de3bb642df4d4b2a8cd07f12dd54947b9&token=1667678311&lang=zh_CN#rd)。 - -## Codota:代码智能提示 - -> 目前的话,Codota 已经更名为 **Tabnine** 。 - -我一直在用的一个插件,可以说非常好用了(_我身边的很多大佬平时写代码也会用这个插件_)。 - -Codota 这个插件用于智能代码补全,它基于数百万 Java 程序,能够根据程序上下文提示补全代码。相比于 IDEA 自带的智能提示来说,Codota 的提示更加全面一些。 - -除了代码补全之外,Codota 还支持代码智能搜索,直接选中对应的类或者方法即可搜索相关的代码示例。 - -![](./pictures/Codota2.png) - -如果你觉得 IDEA 插件安装的太多比较卡顿的话,不用担心!Codota 插件还有一个对应的在线网站([https://www.codota.com/code](https://www.codota.com/code)),在这个网站上你可以根据代码关键字搜索相关代码示例,非常不错! - -我在工作中经常会用到,说实话确实给我带来了很大便利,比如我们搜索 `Files.readAllLines`相关的代码,搜索出来的结果如下图所示: - -![](./pictures/Codota3.png) - -另外,Codota 插件的基础功能都是免费的。你的代码也不会被泄露,这点你不用担心。 - -类似的插件还有阿里云智能编码插件 **Cosy**(Alibaba Cloud AI Coding Assistant) ,关于 Cosy 的详细介绍,可以看一下我写的 [阿里云 Java 智能编码插件 Cosy 诞生!](https://zhuanlan.zhihu.com/p/464874603)这篇文章。 - -## Alibaba Java Code Guidelines:阿里巴巴 Java 代码规范 - -阿里巴巴 Java 代码规范,对应的 Github 地址为:[https://github.com/alibaba/p3c](https://github.com/alibaba/p3c) 。非常推荐安装! - -安装完成之后建议将与语言替换成中文,提示更加友好一点。 - -![](./pictures/p3c/Alibaba-Java-Code-Guidelines2.png) - -根据官方描述: - -> 目前这个插件实现了开发手册中的的 53 条规则,大部分基于 PMD 实现,其中有 4 条规则基于 IDEA 实现,并且基于 IDEA [Inspection](https://www.jetbrains.com/help/idea/code-inspection.html)实现了实时检测功能。部分规则实现了 Quick Fix 功能,对于可以提供 Quick Fix 但没有提供的,我们会尽快实现,也欢迎有兴趣的同学加入进来一起努力。 目前插件检测有两种模式:实时检测、手动触发。 - -上述提到的开发手册也就是在 Java 开发领域赫赫有名的《阿里巴巴 Java 开发手册》。 - -### 手动配置检测规则 - -你还可以手动配置相关 inspection 规则: - -![](./pictures/p3c/Alibaba-Java-Code-Guidelines3.png) - -### 使用效果 - -这个插件会实时检测出我们的代码不匹配它的规则的地方,并且会给出修改建议。比如我们按照下面的方式去创建线程池的话,这个插件就会帮我们检测出来,如下图所示。 - -![](./pictures/p3c/Alibaba-Java-Code-Guidelines1.png) - -这个可以对应上 《阿里巴巴 Java 开发手册》 这本书关于创建线程池的方式说明。 - -![](./pictures/p3c/阿里巴巴开发手册-线程池创建.png) - -## CheckStyle: Java 代码格式规范 - -### 为何需要 CheckStyle 插件? - -**CheckStyle 几乎是 Java 项目开发必备的一个插件了,它会帮助我们检查 Java 代码的格式是否有问题比如变量命名格式是否有问题、某一行代码的长度是否过长等等。** - -在项目上,**通过项目开发人员自我约束来规范代码格式必然是不靠谱的!** 因此,我们非常需要这样一款工具来帮助我们规范代码格式。 - -如果你看过我写的轮子的话,可以发现我为每一个项目都集成了 CheckStyle,并且设置了 **Git Commit 钩子**,保证在提交代码之前代码格式没有问题。 - -> **Guide 哥造的轮子**(_代码简洁,结构清晰,欢迎学习,欢迎一起完善_): -> -> 1. [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) :A custom RPC framework implemented by Netty+Kyro+Zookeeper.(一款基于 Netty+Kyro+Zookeeper 实现的自定义 RPC 框架-附详细实现过程和相关教程) -> 2. [jsoncat](https://github.com/Snailclimb/jsoncat) :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 -> -> **Git 钩子**: Git 能在特定的重要动作比如 commit、push 发生时触发自定义脚本。 钩子都被存储在 Git 目录下的 `hooks` 子目录中。 也即绝大部分项目中的 `.git/hooks` 。 - -### 如何在 Maven/Gradle 项目中集成 Checksytle? - -一般情况下,我们都是将其集成在项目中,并设置相应的 Git 钩子。网上有相应的介绍文章,这里就不多提了。 - -如果你觉得网上的文章不直观的话,可以参考我上面提到了两个轮子: - -1. [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) :Maven 项目集成 Checksytle。 -2. [jsoncat](https://github.com/Snailclimb/jsoncat) :Gradle 项目集成 Checksytle。 - -如果你在项目中集成了 Checksytle 的话,每次检测会生成一个 HTML 格式的文件告诉你哪里的代码格式不对,这样看着非常不直观。通过 Checksytle 插件的话可以非常直观的将项目中存在格式问题的地方显示出来。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/IDEA%E6%8F%92%E4%BB%B6/image-20201013135044410.png) - -如果你只是自己在本地使用,并不想在项目中集成 Checksytle 的话也可以,只需要下载一个 Checksytle 插件就足够了。 - -### 如何安装? - -我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/IDEA%E6%8F%92%E4%BB%B6/image-20201013103610557.png) - -安装插件之后重启 IDEA,你会发现就可以在底部菜单栏找到 CheckStyle 了。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/IDEA%E6%8F%92%E4%BB%B6/image-20201013134644991.png) - -### 如何自定义检测规则? - -如果你需要自定义代码格式检测规则的话,可以按照如下方式进行配置(你可以导入用于自定义检测规则的`CheckStyle.xml`文件)。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/IDEA%E6%8F%92%E4%BB%B6/setting-check-style.png) - -### 使用效果 - -配置完成之后,按照如下方式使用这个插件! - -![run-check-style](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/IDEA%E6%8F%92%E4%BB%B6/run-check-style.png) - -可以非常清晰的看到:CheckStyle 插件已经根据我们自定义的规则将项目中的代码存在格式问题的地方都检测了出来。 - -## SonarLint:帮你优化代码 - -SonarLint 帮助你发现代码的错误和漏洞,就像是代码拼写检查器一样,SonarLint 可以实时显示出代码的问题,并提供清晰的修复指导,以便你提交代码之前就可以解决它们。 - -![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-2@main/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/image-20201019222817359.png) - -并且,很多项目都集成了 SonarQube,SonarLint 可以很方便地与 SonarQube 集成。 \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/interface-beautification.md b/docs/idea-tutorial/idea-plugins/interface-beautification.md deleted file mode 100644 index 3f3f62fb..00000000 --- a/docs/idea-tutorial/idea-plugins/interface-beautification.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: IDEA 界面美化插件推荐 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 - - 代码优化 ---- - - -## Background Image Plus:背景图片 - -我这里推荐使用国人 Jack Chu 基于 Background Image Plus 开发的最新版本,适用于 2021.x 版本的 IDEA。 - -前面几个下载量比较高的,目前都还未支持 2021.x 版本的 IDEA。 - -![Background Image Plus](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/image-20211010174138279.png) - -通过这个插件,你可以将 IDEA 背景设置为指定的图片,支持随机背景。 - -效果图如下: - -![Background Image Plus 设置背景效果图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/image-20211010173730828.png) - -如果你想要设置随机背景的话,可以通过 IDEA 设置页 **Settings** -> **Appearance & Behaviour** -> **Background Image Plus** 自定义设置项,随机显示目录下的图片为背景图。 - -## Power Mode II : 代码特效 - -使用了这个插件之后,写代码会自带特效,适用于 2021.x 版本的 IDEA。 2021.x 版本之前,可以使用 **activate-power-mode** 。 - -![Power Mode II 效果图](./pictures/power-mode/Power-Mode-II.gif) - -你可以通过 IDEA 设置页 **Settings** -> **Appearance & Behaviour** -> **Power Mode II** 自定义设置项。 - -![Power Mode II](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/image-20211010175304108.png) - -## Nyan Progress Bar : 进度条美化 - -可以让你拥有更加漂亮的进度条。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/image-20211010175434133.png) - -## Grep Console:控制台输出处理 - -可以说是必备的一个 IDEA 插件,非常实用! - -这个插件主要的功能有两个: - -**1. 自定义设置控制台输出颜色** - -我们可以在设置中进行相关的配置: - -![](./pictures/grep-console/grep-console2.png) - -配置完成之后的 log warn 的效果对比图如下: - -![](./pictures/grep-console/grep-console3.png) - -**2. 过滤控制台输出** - -![](./pictures/grep-console/grep-console.gif) - -## Rainbow Brackets : 彩虹括号 - -使用各种鲜明的颜色来展示你的括号,效果图如下。可以看出代码层级变得更加清晰了,可以说非常实用友好了! - -![](./pictures/rainbow-brackets.png) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/jclasslib.md b/docs/idea-tutorial/idea-plugins/jclasslib.md deleted file mode 100644 index 6d23f025..00000000 --- a/docs/idea-tutorial/idea-plugins/jclasslib.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: jclasslib :一款IDEA字节码查看神器 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 - - 字节码 ---- - -由于后面要分享的一篇文章中用到了这篇文章要推荐的一个插件,所以这里分享一下。非常实用!你会爱上它的! - -![](./pictures/jclasslib/image-20201013084919965.png) - -**开始推荐 IDEA 字节码查看神器之前,先来回顾一下 Java 字节码是啥。** - -## 何为 Java 字节码? - -Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。 - -**什么是字节码?采用字节码的好处是什么?** - -> 在 Java 中,JVM 可以理解的代码就叫做`字节码`(即扩展名为 `.class` 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。 - -**Java 程序从源代码到运行一般有下面 3 步:** - -![Java程序运行过程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/Java%20%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E8%BF%87%E7%A8%8B.png) - -## 为什么要查看 Java 字节码? - -我们在平时学习的时候,经常需要查看某个 java 类的字节码文件。查看字节码文件更容易让我们搞懂 java 代码背后的原理比如搞懂 java 中的各种语法糖的本质。 - -## 如何查看 Java 字节码? - -如果我们通过命令行来查看某个 class 的字节码文件的话,可以直接通过 `javap` 命令,不过这种方式太原始了,效率十分低,并且看起来不直观。 - -下面介绍两种使用 IDEA 查看类对应字节码文件的方式(_`javap`这种方式就不提了_)。 - -我们以这段代码作为案例: - -```java -public class Main { - public static void main(String[] args) { - Integer i = null; - Boolean flag = false; - System.out.println(flag ? 0 : i); - } -} -``` - -上面这段代码由于使用三目运算符不当导致诡异了 NPE 异常。为了搞清楚事情的原因,我们来看其对应的字节码。 - -### 使用 IDEA 自带功能 - -我们点击 `View -> Show Bytecode` 即可通过 IDEA 查看某个类对应的字节码文件。 - -> 需要注意的是:**查看某个类对应的字节码文件之前确保它已经被编译过。** - -![使用IDEA自带功能查看Java字节码](./pictures/jclasslib/image-20201012143530226.png) - -稍等几秒钟之后,你就可以直观到看到对应的类的字节码内容了。 - -![](./pictures/jclasslib/image-20201012145127465.png) - -从字节码中可以看出,我圈出来的位置发生了 **拆箱操作** 。 - -> - **装箱**:将基本类型用它们对应的引用类型包装起来; -> - **拆箱**:将包装类型转换为基本数据类型; - -详细解释下就是:`flag ? 0 : i` 这行代码中,0 是基本数据类型 int,返回数据的时候 i 会被强制拆箱成 int 类型,由于 i 的值是 null,因此就抛出了 NPE 异常。 - -```java -Integer i = null; -Boolean flag = false; -System.out.println(flag ? 0 : i); -``` - -如果,我们把代码中 `flag` 变量的值修改为 true 的话,就不会存在 NPE 问题了,因为会直接返回 0,不会进行拆箱操作。 - -### 使用 IDEA 插件 jclasslib(推荐) - -相比于 IDEA 自带的查看类字节的功能,我更推荐 `jclasslib` 这个插件,非常棒! - -**使用 `jclasslib` 不光可以直观地查看某个类对应的字节码文件,还可以查看类的基本信息、常量池、接口、属性、函数等信息。** - -![](./pictures/jclasslib/image-20201012145646086.png) - -我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。 - -![](./pictures/jclasslib/image-20201012145900911.png) - -安装完成之后,重启 IDEA。点击`View -> Show Bytecode With jclasslib` 即可通过`jclasslib` 查看某个类对应的字节码文件。 - -![使用IDEA插件jclasslib查看类的字节码](./pictures/jclasslib/image-20201012150252106.png) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/maven-helper.md b/docs/idea-tutorial/idea-plugins/maven-helper.md deleted file mode 100644 index d2b064a9..00000000 --- a/docs/idea-tutorial/idea-plugins/maven-helper.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Maven Helper:解决 Maven 依赖冲突问题 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 - - Maven ---- - - -**Maven Helper** 主要用来分析 Maven 项目的相关依赖,可以帮助我们解决 Maven 依赖冲突问题。 - -![](./pictures/maver-helper.png) - -**何为依赖冲突?** - -说白了就是你的项目使用的 2 个 jar 包引用了同一个依赖 h,并且 h 的版本还不一样,这个时候你的项目就存在两个不同版本的 h。这时 Maven 会依据依赖路径最短优先原则,来决定使用哪个版本的 Jar 包,而另一个无用的 Jar 包则未被使用,这就是所谓的依赖冲突。 - -大部分情况下,依赖冲突可能并不会对系统造成什么异常,因为 Maven 始终选择了一个 Jar 包来使用。但是,不排除在某些特定条件下,会出现类似找不到类的异常,所以,只要存在依赖冲突,在我看来,最好还是解决掉,不要给系统留下隐患。 diff --git a/docs/idea-tutorial/idea-plugins/others.md b/docs/idea-tutorial/idea-plugins/others.md deleted file mode 100644 index da505ff8..00000000 --- a/docs/idea-tutorial/idea-plugins/others.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: 其他 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - - -1. **leetcode editor** :提供在线 Leetcode 刷题功能,比较方便我们刷题,不过我试用之后发现有一些小 bug,个人感觉还是直接在网站找题目刷来的痛快一些。 -2. **​A Search with Github** :直接通过 Github搜索相关代码。 -3. **stackoverflow** : 选中相关内容后单击右键即可快速跳转到 stackoverflow 。 -4. **CodeStream** :让code review变得更加容易。 -5. **Code screenshots** :代码片段保存为图片。 -6. **GitToolBox** :Git工具箱 -7. **OK,​ Gradle!** :搜索Java库用于Gradle项目 -8. **Java Stream Debugger** : Java8 Stream调试器 -9. **EasyCode** : Easycode 可以直接对数据的表生成entity、controller、service、dao、mapper无需任何编码,简单而强大。更多内容可以查看这篇文章:[《懒人 IDEA 插件插件:EasyCode 一键帮你生成所需代码~》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486205&idx=1&sn=0ff2f87f0d82a1bd9c0c44328ef69435&chksm=cea24536f9d5cc20c6cc7669f0d4167d747fe8b8c05a64546c0162d694aa96044a2862e24b57&token=1862674725&lang=zh_CN#rd) -10. **JFormDesigner** :Swing GUI 在线编辑器。 -11. **VisualVM Launcher** : Java性能分析神器。 -12. ...... diff --git a/docs/idea-tutorial/idea-plugins/pictures/Codota2.png b/docs/idea-tutorial/idea-plugins/pictures/Codota2.png deleted file mode 100644 index 170e6737..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/Codota2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/Codota3.png b/docs/idea-tutorial/idea-plugins/pictures/Codota3.png deleted file mode 100644 index 06c097e0..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/Codota3.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/IDE-Features-Trainer1.png b/docs/idea-tutorial/idea-plugins/pictures/IDE-Features-Trainer1.png deleted file mode 100644 index 2cad2767..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/IDE-Features-Trainer1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/IDE-Features-Trainer2.png b/docs/idea-tutorial/idea-plugins/pictures/IDE-Features-Trainer2.png deleted file mode 100644 index 8400e487..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/IDE-Features-Trainer2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/Presentation-Assistant.png b/docs/idea-tutorial/idea-plugins/pictures/Presentation-Assistant.png deleted file mode 100644 index 9af0d733..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/Presentation-Assistant.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit1.png b/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit1.png deleted file mode 100644 index 79ed40f8..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit2.png b/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit2.png deleted file mode 100644 index 1edceeb1..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit3.png b/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit3.png deleted file mode 100644 index 2748f821..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit3.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit4.png b/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit4.png deleted file mode 100644 index c4e6129a..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/RestfulToolkit4.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/RoboPOJOGenerator1.png b/docs/idea-tutorial/idea-plugins/pictures/RoboPOJOGenerator1.png deleted file mode 100644 index 3ae69cff..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/RoboPOJOGenerator1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/RoboPOJOGenerator2.png b/docs/idea-tutorial/idea-plugins/pictures/RoboPOJOGenerator2.png deleted file mode 100644 index 23f81f8e..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/RoboPOJOGenerator2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/Statistic1.png b/docs/idea-tutorial/idea-plugins/pictures/Statistic1.png deleted file mode 100644 index 21c74b55..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/Statistic1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/Statistic2.png b/docs/idea-tutorial/idea-plugins/pictures/Statistic2.png deleted file mode 100644 index 4c263d3b..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/Statistic2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case1.png b/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case1.png deleted file mode 100644 index 84deb4a4..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case2.gif b/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case2.gif deleted file mode 100644 index 20ee47e2..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case2.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case3.png b/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case3.png deleted file mode 100644 index 48d094c9..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/camel-case/camel-case3.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/check-style.png b/docs/idea-tutorial/idea-plugins/pictures/check-style.png deleted file mode 100644 index a3cae0a5..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/check-style.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/code-glance.png b/docs/idea-tutorial/idea-plugins/pictures/code-glance.png deleted file mode 100644 index 3e0ae2cc..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/code-glance.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template1.png b/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template1.png deleted file mode 100644 index 3eeaeb5e..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template2.png b/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template2.png deleted file mode 100644 index ec6d1cb7..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template3.png b/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template3.png deleted file mode 100644 index 95fbf618..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/git-commit-template/Git-Commit-Template3.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console.gif b/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console.gif deleted file mode 100644 index 1d5c2ef4..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console2.png b/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console2.png deleted file mode 100644 index 989e6042..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console3.png b/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console3.png deleted file mode 100644 index dd02939c..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/grep-console/grep-console3.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format1.png b/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format1.png deleted file mode 100644 index ce84dbb8..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format2.png b/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format2.png deleted file mode 100644 index f41719d3..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format3.png b/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format3.png deleted file mode 100644 index a98dac97..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/gson-format/gson-format3.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012143530226.png b/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012143530226.png deleted file mode 100644 index 892a129e..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012143530226.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145127465.png b/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145127465.png deleted file mode 100644 index d6e86ecd..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145127465.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145646086.png b/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145646086.png deleted file mode 100644 index 7aac1e6f..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145646086.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145900911.png b/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145900911.png deleted file mode 100644 index 5bb58000..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012145900911.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012150252106.png b/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012150252106.png deleted file mode 100644 index bb0c5ae0..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201012150252106.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201013084919965.png b/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201013084919965.png deleted file mode 100644 index f2331621..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/jclasslib/image-20201013084919965.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/maver-helper.png b/docs/idea-tutorial/idea-plugins/pictures/maver-helper.png deleted file mode 100644 index a9e11683..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/maver-helper.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines1.png b/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines1.png deleted file mode 100644 index 6956e1eb..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines1.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines2.png b/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines2.png deleted file mode 100644 index 11037c00..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines3.png b/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines3.png deleted file mode 100644 index f615d697..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/p3c/Alibaba-Java-Code-Guidelines3.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/p3c/阿里巴巴开发手册-线程池创建.png b/docs/idea-tutorial/idea-plugins/pictures/p3c/阿里巴巴开发手册-线程池创建.png deleted file mode 100644 index 5aff04c7..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/p3c/阿里巴巴开发手册-线程池创建.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/power-mode/Power-Mode-II.gif b/docs/idea-tutorial/idea-plugins/pictures/power-mode/Power-Mode-II.gif deleted file mode 100644 index 026c32e9..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/power-mode/Power-Mode-II.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/rainbow-brackets.png b/docs/idea-tutorial/idea-plugins/pictures/rainbow-brackets.png deleted file mode 100644 index 63ab2884..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/rainbow-brackets.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/save-actions/save-actions.png b/docs/idea-tutorial/idea-plugins/pictures/save-actions/save-actions.png deleted file mode 100644 index 7a184a97..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/save-actions/save-actions.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/save-actions/save-actions2.gif b/docs/idea-tutorial/idea-plugins/pictures/save-actions/save-actions2.gif deleted file mode 100644 index 826a0d9c..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/save-actions/save-actions2.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/translation/translation1.jpg b/docs/idea-tutorial/idea-plugins/pictures/translation/translation1.jpg deleted file mode 100644 index 25431835..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/translation/translation1.jpg and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/pictures/translation/translation2.png b/docs/idea-tutorial/idea-plugins/pictures/translation/translation2.png deleted file mode 100644 index e504132d..00000000 Binary files a/docs/idea-tutorial/idea-plugins/pictures/translation/translation2.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-plugins/rest-devlop.md b/docs/idea-tutorial/idea-plugins/rest-devlop.md deleted file mode 100644 index 8eb64a22..00000000 --- a/docs/idea-tutorial/idea-plugins/rest-devlop.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: RestfulToolkit:RESTful Web 服务辅助开发工具 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - - -开始推荐这个 IDEA 插件之前,我觉得有必要花一小会时间简单聊聊 **REST** 这个我们经常打交道的概念。 - -## REST 相关概念解读 - -### 何为 REST? - -REST 即 **REpresentational State Transfer** 的缩写。这个词组的翻译过来就是"**表现层状态转化**"。 - -这样理解起来甚是晦涩,实际上 REST 的全称是 **Resource Representational State Transfer** ,直白地翻译过来就是 **“资源”在网络传输中以某种“表现形式”进行“状态转移”** 。 - -**有没有感觉很难理解?** - -没关系,看了我对 REST 涉及到的一些概念的解读之后你没准就能理解了! - -- **资源(Resource)** :我们可以把真实的对象数据称为资源。一个资源既可以是一个集合,也可以是单个个体。比如我们的班级 classes 是代表一个集合形式的资源,而特定的 class 代表单个个体资源。每一种资源都有特定的 URI(统一资源定位符)与之对应,如果我们需要获取这个资源,访问这个 URI 就可以了,比如获取特定的班级:`/class/12`。另外,资源也可以包含子资源,比如 `/classes/classId/teachers`:列出某个指定班级的所有老师的信息 -- **表现形式(Representational)**:"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式比如 json,xml,image,txt 等等叫做它的"表现层/表现形式"。 -- **状态转移(State Transfer)** :大家第一眼看到这个词语一定会很懵逼?内心 BB:这尼玛是啥啊? **大白话来说 REST 中的状态转移更多地描述的服务器端资源的状态,比如你通过增删改查(通过 HTTP 动词实现)引起资源状态的改变。** (HTTP 协议是一个无状态的,所有的资源状态都保存在服务器端) - -### 何为 RESTful 架构? - -满足 REST 风格的架构设计就可以称为 RESTful 架构: - -1. 每一个 URI 代表一种资源; -2. 客户端和服务器之间,传递这种资源的某种表现形式比如 json,xml,image,txt 等等; -3. 客户端通过特定的 HTTP 动词,对服务器端资源进行操作,实现"表现层状态转化"。 - -### 何为 RESTful Web 服务? - -基于 REST 架构的 Web 服务就被称为 RESTful Web 服务。 - -## RESTful Web 服务辅助开发工具 - -### 安装 - -这个插件的名字叫做 “**RestfulToolkit**” 。我们直接在 IDEA 的插件市场即可找到这个插件。如下图所示。 - -> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过[IDEA 插件市场的官网](https://plugins.jetbrains.com/idea)手动下载安装。 - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/41a9bfa18920403ba4db83e324f8621e~tplv-k3u1fbpfcp-zoom-1.image) - -### 简单使用 - -#### URL 跳转到对应方法 - -根据 URL 直接跳转到对应的方法定义 (Windows: `ctrl+\` or `ctrl+alt+n` Mac:`command+\` or `command+alt+n` )并且提供了一个服务的树形可视化显示窗口。 如下图所示。 - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c26ea05ad472488fbf9eb21627964bee~tplv-k3u1fbpfcp-zoom-1.image) - -#### 作为 HTTP 请求工具 - -这个插件还可以作为一个简单的 http 请求工具来使用。如下图所示。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/RestfulToolkit2.png) - -#### 复制生成 URL、复制方法参数... - -这个插件还提供了生成 URL、查询参数、请求体(RequestBody)等功能。 - -举个例子。我们选中 `Controller` 中的某个请求对应的方法右击,你会发现多了几个可选项。当你选择`Generate & Copy Full URL`的话,就可以把整个请求的路径直接复制下来。eg:`http://localhost:9333/api/users?pageNum=1&pageSize=1` 。 - -![](./pictures/RestfulToolkit3.png) - -#### 将 Java 类转换为对应的 JSON 格式 - -这个插件还为 Java 类上添加了 **Convert to JSON** 功能 。 - -我们选中的某个类对应的方法然后右击,你会发现多了几个可选项。 - -![](./pictures/RestfulToolkit4.png) - -当我们选择`Convert to JSON`的话,你会得到如下 json 类型的数据: - -```json -{ - "username": "demoData", - "password": "demoData", - "rememberMe": true -} -``` - -## 后记 - -RESTFulToolkit 原作者不更新了,IDEA.201 及以上版本不再适配。 - -因此,国内就有一个大佬参考 RESTFulToolkit 开发了一款类似的插件——RestfulTool(功能较少一些,不过够用了)。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20210830112030237.png) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/save-actions.md b/docs/idea-tutorial/idea-plugins/save-actions.md deleted file mode 100644 index fc149ad3..00000000 --- a/docs/idea-tutorial/idea-plugins/save-actions.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Save Actions:优化文件保存 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - - -真必备插件!可以帮助我们在保存文件的时候: - -1. 优化导入; -2. 格式化代码; -3. 执行一些quick fix -4. ...... - -这个插件是支持可配置的,我的配置如下: - -![](./pictures/save-actions/save-actions.png) - -实际使用效果如下: - -![](./pictures/save-actions/save-actions2.gif) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/sequence-diagram.md b/docs/idea-tutorial/idea-plugins/sequence-diagram.md deleted file mode 100644 index 050d6161..00000000 --- a/docs/idea-tutorial/idea-plugins/sequence-diagram.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: SequenceDiagram:一键可以生成时序图 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - - - -在平时的学习/工作中,我们会经常面临如下场景: - -1. 阅读别人的代码 -2. 阅读框架源码 -3. 阅读自己很久之前写的代码。 - -千万不要觉得工作就是单纯写代码,实际工作中,你会发现你的大部分时间实际都花在了阅读和理解已有代码上。 - -为了能够更快更清晰地搞清对象之间的调用关系,我经常需要用到序列图。手动画序列图还是很麻烦费时间的,不过 IDEA 提供了一个叫做**SequenceDiagram** 的插件帮助我们解决这个问题。通过 SequenceDiagram 这个插件,我们一键可以生成时序图。 - -## 何为序列图? - -网上对于序列图的定义有很多,我觉得都不太好理解,太抽象了。最神奇的是,大部分文章对于序列图的定义竟然都是一模一样,看来大家是充分发挥了写代码的“精髓”啊! - -我还是简单说一说我的理解吧!不过,说实话,我自己对于 Sequence Diagram 也不是很明朗。下面的描述如有问题和需要完善的地方,还请指出。 - -> **序列图**(Sequence Diagram),亦称为**循序图**,是一种[UML](https://zh.m.wikipedia.org/wiki/UML)行为图。表示系统执行某个方法/操作(如登录操作)时,对象之间的顺序调用关系。 -> -> 这个顺序调用关系可以这样理解:你需要执行系统中某个对象 a 提供的方法/操作 login(登录),但是这个对象又依赖了对象 b 提供的方法 getUser(获取用户)。因此,这里就有了 a -> b 调用关系之说。 - -再举两个例子来说一下! - -下图是微信支付的业务流程时序图。这个图描述了微信支付相关角色(顾客,商家...)在微信支付场景下,基础支付和支付的的顺序调用关系。 - -![](https://img-blog.csdnimg.cn/img_convert/3a48c8d17aea2064ff11b6d3fd1fb2cb.png) - -下图是我写的一个 HTTP 框架中的执行某个方法的序列图。这个图描述了我们在调用 `InterceptorFactory`类的 `loadInterceptors()` 方法的时候,所涉及到的类之间的调用关系。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70.png) - -另外,国内一般更喜欢称呼序列图为"时序图"。 - -- 如果你按照纯翻译的角度来说, sequence 这个单词并无"时间"的意思,只有序列,顺序等意思,因此也有人说“时序图”的说法是不准确的。 -- 如果从定义角度来说,时序图这个描述是没问题的。因为 Sequence Diagram 中每条消息的触发时机确实是按照时间顺序执行的。 - -我觉得称呼 Sequence Diagram 为时序图或者序列图都是没问题的,不用太纠结。 - -## 哪些场景下需要查看类的时序图? - -我们在很多场景下都需要时序图,比如说: - -1. **阅读源码** :阅读源码的时候,你可能需要查看调用目标方法涉及的相关类的调用关系。特别是在代码的调用层级比较多的时候,对于我们理解源码非常有用。(_题外话:实际工作中,大部分时间实际我们都花在了阅读理解已有代码上。_) -2. **技术文档编写** :我们在写项目介绍文档的时候,为了让别人更容易理解你的代码,你需要根据核心方法为相关的类生成时序图来展示他们之间的调用关系。 -3. **梳理业务流程** :当我们的系统业务流程比较复杂的时候,我们可以通过序列图将系统中涉及的重要的角色和对象的之间关系可视化出来。 -4. ...... - -## 如何使用 IDEA 根据类中方法生成时序图? - -**通过 SequenceDiagram 这个插件,我们一键可以生成时序图。** - -并且,你还可以: - -1. 点击时序图中的类/方法即可跳转到对应的地方。 -2. 从时序图中删除对应的类或者方法。 -3. 将生成的时序图导出为 PNG 图片格式。 - -### 安装 - -我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。 - -> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过[IDEA 插件市场的官网](https://plugins.jetbrains.com/idea)手动下载安装。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20201021165654262.png) - -### 简单使用 - -1. 选中方法名(注意不要选类名),然后点击鼠标右键,选择 **Sequence Diagram** 选项即可! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20201021170110697-20211010211819042.png) - -2. 配置生成的序列图的一些基本的参数比如调用深度之后,我们点击 ok 即可! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/c5040f1105c762ddf8689892913bc02d-20211010211823985.png) - -你还可以通过生成的时序图来定位到相关的代码,这对于我们阅读源码的时候尤其有帮助! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20201021171623809-20211010211828759.png) - -时序图生成完成之后,你还可以选择将其导出为图片。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20201021170228723-20211010211832965.png) \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/shortcut-key.md b/docs/idea-tutorial/idea-plugins/shortcut-key.md deleted file mode 100644 index 09008d66..00000000 --- a/docs/idea-tutorial/idea-plugins/shortcut-key.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: IDEA 快捷键相关插件 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - - -相信我!下面这两个一定是IDEA必备的插件。 - -## Key Promoter X:快捷键提示 - -这个插件的功能主要是**在你本可以使用快捷键操作的地方提醒你用快捷键操作。** - -举个例子。我直接点击tab栏下的菜单打开 Version Control(版本控制) 的话,这个插件就会提示你可以用快捷键 `command+9`或者`shift+command+9`打开。如下图所示。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/Key-Promoter-X1.png) - -除了这个很棒的功能之外,这个插件还有一个功能我觉得非常棒。 - -它可以展示出哪些快捷键你忘记使用的次数最多!这样的话,你可以给予你忘记次数最多的那些快捷键更多的关注。 - -我忘记最多的快捷键是debug的时候经常使用的 F8(Step Over)。如下图所示。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/Key-Promoter-X2.png) - -关于快捷键,很多人不愿意去记,觉得单纯靠鼠标就完全够了。 - -让我来说的话!我觉得如果你偶尔使用一两次 IDEA 的话,你完全没有必要纠结快捷键。 - -但是,如果 IDEA 是你开发的主力,你经常需要使用的话,相信我,掌握常用的一些快捷键真的很重要! - -不说多的,**熟练掌握IDEA的一些最常见的快捷键,你的工作效率至少提升 30 %。** - -**除了工作效率的提升之外,使用快捷键会让我们显得更加专业。** - -你在使用快捷键进行操作的时候,是很帅,很酷啊!但是,当你用 IDEA 给别人演示一些操作的时候,你使用了快捷键的话,别人可能根本不知道你进行了什么快捷键操作。 - -**怎么解决这个问题呢?** - -很简单!这个时候就轮到 **Presentation Assistant** 这个插件上场了! - -## Presentation Assistant:快捷键展示 - -安装这个插件之后,你使用的快捷键操作都会被可视化地展示出来,非常适合自己在录制视频或者给别人展示代码的时候使用。 - -举个例子。我使用快捷键 `command+9`打开 Version Control ,使用了这个插件之后的效果如下图所示。 - -![](./pictures/Presentation-Assistant.png) - -从上图可以很清晰地看到,IDEA 的底部中间的位置将我刚刚所使用的快捷键给展示了出来。 - -并且,**这个插件会展示出 Mac 和 Win/Linux 两种不同的版本的快捷键。** - -因此,不论你的操作系统是 Mac 还是 Win/Linux ,这款插件都能满足你的需求。 \ No newline at end of file diff --git a/docs/idea-tutorial/idea-plugins/translation.md b/docs/idea-tutorial/idea-plugins/translation.md deleted file mode 100644 index 7de2619a..00000000 --- a/docs/idea-tutorial/idea-plugins/translation.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Translation:翻译 -category: IDEA指南 -tag: - - IDEA - - IDEA插件 ---- - - -有了这个插件之后,你再也不用在编码的时候打开浏览器查找某个单词怎么拼写、某句英文注释什么意思了。 - -并且,这个插件支持多种翻译源: - -1. Google 翻译 -2. Youdao 翻译 -3. Baidu 翻译 - -除了翻译功能之外还提供了语音朗读、单词本等实用功能。这个插件的Github地址是:[https://github.com/YiiGuxing/TranslationPlugin](https://github.com/YiiGuxing/TranslationPlugin) (貌似是国人开发的,很赞)。 - -**使用方法很简单!选中你要翻译的单词或者句子,使用快捷键 `command+ctrl+u(mac)` / `shift+ctrl+y(win/linux)`** (如果你忘记了快捷的话,鼠标右键操作即可!) - -![](./pictures/translation/translation1.jpg) - -**如果需要快速打开翻译框,使用快捷键`command+ctrl+i(mac)`/`ctrl + shift + o(win/linux)`** - -![](./pictures/translation/translation2.png) - -如果你需要将某个重要的单词添加到生词本的话,只需要点击单词旁边的收藏按钮即可! \ No newline at end of file diff --git a/docs/idea-tutorial/idea-tips/idea-plug-in-development-intro.md b/docs/idea-tutorial/idea-tips/idea-plug-in-development-intro.md deleted file mode 100644 index 8475b57c..00000000 --- a/docs/idea-tutorial/idea-tips/idea-plug-in-development-intro.md +++ /dev/null @@ -1,299 +0,0 @@ -# IDEA 插件开发入门 - -我这个人没事就喜欢推荐一些好用的 [IDEA 插件](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1319419426898329600&__biz=Mzg2OTA0Njk0OA==#wechat_redirect)给大家。这些插件极大程度上提高了我们的生产效率以及编码舒适度。 - -**不知道大家有没有想过自己开发一款 IDEA 插件呢?** - -我自己想过,但是没去尝试过。刚好有一位读者想让我写一篇入门 IDEA 开发的文章,所以,我在周末就花了一会时间简单了解一下。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201118071711216.png) - -不过,**这篇文章只是简单带各位小伙伴入门一下 IDEA 插件开发**,个人精力有限,暂时不会深入探讨太多。如果你已经有 IDEA 插件开发的相关经验的话,这篇文章就可以不用看了,因为会浪费你 3 分钟的时间。 - -好的废话不多说!咱们直接开始! - -## 01 新建一个基于 Gradle 的插件项目 - -这里我们基于 Gradle 进行插件开发,这也是 IntelliJ 官方的推荐的插件开发解决方案。 - -**第一步,选择 Gradle 项目类型并勾选上相应的依赖。** - -![选择 Gradle 项目类型并勾选上相应的依赖](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/1.png) - -**第二步,填写项目相关的属性比如 GroupId、ArtifactId。** - -![填写项目相关的属性](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/2.png) - -**第三步,静静等待项目下载相关依赖。** - -第一次创建 IDEA 插件项目的话,这一步会比较慢。因为要下载 IDEA 插件开发所需的 SDK 。 - -## 02 插件项目结构概览 - -新建完成的项目结构如下图所示。 - -![插件项目结构概览](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/%E6%8F%92%E4%BB%B6%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%A6%82%E8%A7%88.png) - -这里需要额外注意的是下面这两个配置文件。 - -**`plugin.xml` :插件的核心配置文件。通过它可以配置插件名称、插件介绍、插件作者信息、Action 等信息。** - -```xml - - github.javaguide.my-first-idea-plugin - - Beauty - - JavaGuide - - - 这尼玛是什么垃圾插件!!! - ]]> - - - com.intellij.modules.platform - - - - - - - - - -``` - -**`build.gradle` :项目依赖配置文件。通过它可以配置项目第三方依赖、插件版本、插件版本更新记录等信息。** - -```groovy -plugins { - id 'java' - id 'org.jetbrains.intellij' version '0.6.3' -} - -group 'github.javaguide' -// 当前插件版本 -version '1.0-SNAPSHOT' - -repositories { - mavenCentral() -} - -// 项目依赖 -dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' -} - -// See https://github.com/JetBrains/gradle-intellij-plugin/ -// 当前开发该插件的 IDEA 版本 -intellij { - version '2020.1.2' -} -patchPluginXml { - // 版本更新记录 - changeNotes """ - Add change notes here.
- most HTML tags may be used""" -} -``` - -没有开发过 IDEA 插件的小伙伴直接看这两个配置文件内容可能会有点蒙。所以,我专门找了一个 IDEA 插件市场提供的现成插件来说明一下。小伙伴们对照下面这张图来看下面的配置文件内容就非常非常清晰了。 - -![插件信息](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/iShot2020-11-13%2016.15.53.png) - -这就非常贴心了!如果这都不能让你点赞,我要这文章有何用! - -![](http://wx1.sinaimg.cn/large/006BkP2Hly1fsxxff7zd9g304g0480td.gif) - -## 03 手动创建 Action - -我们可以把 Action 看作是 IDEA 提供的事件响应处理器,通过 Action 我们可以自定义一些事件处理逻辑/动作。比如说你点击某个菜单的时候,我们进行一个展示对话框的操作。 - -**第一步,右键`java`目录并选择 new 一个 Action** - -![]() - -**第二步,配置 Action 相关信息比如展示名称。** - -![配置动作属性 (1)]() - -创建完成之后,我们的 `plugin.xml` 的 ``节点下会自动生成我们刚刚创建的 Action 信息: - -```xml - - - - - - -``` - -并且 `java` 目录下会生成一个叫做 `HelloAction` 的类。这个类继承了 `AnAction` ,并覆盖了 `actionPerformed()` 方法。这个 `actionPerformed` 方法就好比 JS 中的 `onClick` 方法,会在你点击的时候触发对应的动作。 - -我简单对 `actionPerformed` 方法进行了修改,添加了一行代码。这行代码很简单,就是显示 1 个对话框并展示一些信息。 - -```java -public class HelloAction extends AnAction { - - @Override - public void actionPerformed(AnActionEvent e) { - //显示对话框并展示对应的信息 - Messages.showInfoMessage("素材不够,插件来凑!", "Hello"); - } -} - -``` - -另外,我们上面也说了,每个动作都会归属到一个 Group 中,这个 Group 可以简单看作 IDEA 中已经存在的菜单。 - -举个例子。我上面创建的 Action 的所属 Group 是 **ToolsMenu(Tools)** 。这样的话,我们创建的 Action 所在的位置就在 Tools 这个菜单下。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201113192255689.png) - -再举个例子。加入我上面创建的 Action 所属的 Group 是**MainMenu** (IDEA 最上方的主菜单栏)下的 **FileMenu(File)** 的话。 - -```xml - - - - - - -``` - -我们创建的 Action 所在的位置就在 File 这个菜单下。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201113201634643.png) - -## 04 验收成果 - -点击 `Gradle -> Tasks -> intellij -> runIde` 就会启动一个默认了这个插件的 IDEA。然后,你可以在这个 IDEA 上实际使用这个插件了。 - -![点击 runIde 就会启动一个默认了这个插件的 IDEA](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201118075912490.png) - -效果如下: - -![点击 runIde 就会启动一个默认了这个插件的 IDEA](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201118080358764.png) - -我们点击自定义的 Hello Action 的话就会弹出一个对话框并展示出我们自定义的信息。 - -![IDEA插件HelloWorld](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/IDEA%E6%8F%92%E4%BB%B6HelloWorld.png) - -## 05 完善一下 - -想要弄点界面花里胡哨一下, 我们还可以通过 Swing 来写一个界面。 - -这里我们简单实现一个聊天机器人。代码的话,我是直接参考的我大二刚学 Java 那会写的一个小项目(_当时写的代码实在太烂了!就很菜!_)。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201114100213337.png) - -首先,你需要在[图灵机器人官网](http://www.tuling123.com/ "图灵机器人官网")申请一个机器人。(_其他机器人也一样,感觉这个图灵机器人没有原来好用了,并且免费调用次数也不多_) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201118075453172.png) - -然后,简单写一个方法来请求调用机器人。由于代码比较简单,我这里就不放出来了,大家简单看一下效果就好。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-11/image-20201118075803163.png) - -## 06 打包分发 - -插件写好之后,如果我们想把插件分享给小伙伴使用的话要怎么做呢。 - -### 首先,我们要打包插件 - -执行 Gradle -> Tasks -> intellij -> buildPlugin - -执行完成后,项目中会生成一个 build 文件夹,点击进入后找到 distributions 文件夹,里面会出现一个 .zip 结尾的压缩包,里面打包了插件所需要的依赖、配置文件等。 - -### 其次,分发插件 - -打开 IDEA,在 Settings -> Plugins -> 点击小齿轮后选择 Install Plugin From Disk -![](./pictures/install-plugin-from-disk.png) - -### 最后,提交至官网 - -这步并不是必须的,如果你想把你的插件发布到官网上,别人直接可以在 [应用市场](https://plugins.jetbrains.com/) 中搜到你的插件的话可以做这步。 - - -## 07 深入学习 - -如果你想要深入学习的 IDEA 插件的话,可以看一下官网文档:[https://jetbrains.org/intellij/sdk/docs/basics/basics.html ](https://jetbrains.org/intellij/sdk/docs/basics/basics.html "https://jetbrains.org/intellij/sdk/docs/basics/basics.html ") 。 - -这方面的资料还是比较少的。除了官方文档的话,你还可以简单看看下面这几篇文章: - -- [8 条经验轻松上手 IDEA 插件开发](https://developer.aliyun.com/article/777850?spm=a2c6h.12873581.0.dArticle777850.118d6446r096V4&groupCode=alitech "8 条经验轻松上手 IDEA 插件开发") -- [IDEA 插件开发入门教程](https://blog.xiaohansong.com/idea-plugin-development.html "IDEA 插件开发入门教程") - -## 08 后记 - -我们开发 IDEA 插件主要是为了让 IDEA 更加好用,比如有些框架使用之后可以减少重复代码的编写、有些主题类型的插件可以让你的 IDEA 更好看。 - -我这篇文章的这个案例说实话只是为了让大家简单入门一下 IDEA 开发,没有任何实际应用意义。**如果你想要开发一个不错的 IDEA 插件的话,还要充分发挥想象,利用 IDEA 插件平台的能力。** - -## 常见问题一:JDK版本过低 - -创建好项目之后,运行 Gradle,出现如下报错 - -``` -FAILURE: Build failed with an exception. - -* What went wrong: -A problem occurred configuring root project 'string-template-error-scanner'. -> Could not resolve all artifacts for configuration ':classpath'. - > Could not resolve org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0. - Required by: - project : > org.jetbrains.intellij:org.jetbrains.intellij.gradle.plugin:1.4.0 - > Unable to find a matching variant of org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0: - - Variant 'apiElements' capability org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0: - - Incompatible attributes: - - Required org.gradle.jvm.version '8' and found incompatible value '11'. - - Required org.gradle.usage 'java-runtime' and found incompatible value 'java-api'. - - Other attributes: - - Found org.gradle.category 'library' but wasn't required. - - Required org.gradle.dependency.bundling 'external' and found compatible value 'external'. - - Found org.gradle.jvm.environment 'standard-jvm' but wasn't required. - - Required org.gradle.libraryelements 'jar' and found compatible value 'jar'. - - Found org.gradle.status 'release' but wasn't required. - - Found org.jetbrains.kotlin.platform.type 'jvm' but wasn't required. - - Variant 'runtimeElements' capability org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0: - - Incompatible attribute: - - Required org.gradle.jvm.version '8' and found incompatible value '11'. - - Other attributes: - - Found org.gradle.category 'library' but wasn't required. - - Required org.gradle.dependency.bundling 'external' and found compatible value 'external'. - - Found org.gradle.jvm.environment 'standard-jvm' but wasn't required. - - Required org.gradle.libraryelements 'jar' and found compatible value 'jar'. - - Found org.gradle.status 'release' but wasn't required. - - Required org.gradle.usage 'java-runtime' and found compatible value 'java-runtime'. - - Found org.jetbrains.kotlin.platform.type 'jvm' but wasn't required. - -* Try: -Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. - -* Get more help at https://help.gradle.org - -BUILD FAILED in 94ms -``` - -> 原因分析:一般情况下,我们都是使用 JDK8 进行开发,但是新版的 IDEA 插件的编译需要使用 JAVA11 版本以上,因此要把 JDK8 换成 JDK11。(设置方法:左上角点击 Settings -> Build, Execution, Deployment, Build Tools -> Gradle,在下面找到 Gradle JVM: 改成 Java11 再次运行 Gradle 即可) -> -> - -## 常见问题二:无法创建 org.jetbrains.intellij.utils.ArchiveUtils 的实例 - -``` -Build file 'D:\project\string-template-error-scanner\build.gradle' line: 3 - -An exception occurred applying plugin request [id: 'org.jetbrains.intellij', version: '1.4.0'] -> Failed to apply plugin [id 'org.jetbrains.intellij'] - > Could not create an instance of type org.jetbrains.intellij.utils.ArchiveUtils. - > Could not generate a decorated class for type ArchiveUtils. - > org/gradle/api/file/ArchiveOperations - -``` - -> 原因分析:这个问题我在 StackOverFlow、CSDN 等等网站搜了一大圈都从根源上找到怎么解决(知道的小伙伴可以编辑此页和我说一下~) -> -> 最后通过修改 `build.gradle` 中 org.jetbrains.intellij 的版本解决的,我创建好项目之后版本是 1.4.0,换成 0.6.3,再重新运行一次 Gradle 就可以了 diff --git a/docs/idea-tutorial/idea-tips/idea-refractor-intro.md b/docs/idea-tutorial/idea-tips/idea-refractor-intro.md deleted file mode 100644 index 7c3d4a66..00000000 --- a/docs/idea-tutorial/idea-tips/idea-refractor-intro.md +++ /dev/null @@ -1,75 +0,0 @@ -# IDEA 重构入门 - -我们在使用 IDEA 进行重构之前,先介绍一个方便我们进行重构的快捷键:`ctrl+t(mac)/ctrl+shift+alt+t`(如果忘记快捷键的话,鼠标右键也能找到重构选项),使用这个快捷键可以快速调出常用重构的选项,如下图所示: - -![](./pictures/refractor-help.png) - -### 重命名(rename) - -快捷键:**Shift + F6(mac) / Shift + F6(windows/Linux):** 对类、变量或者方法名重命名。 - -![重命名](./pictures/rename.gif) - -### 提取相关重构手段 - -这部分的快捷键实际很好记忆,我是这样记忆的: - -前面两个键位是 `command + option(mac) / ctrl + alt (Windows/Linux)` 是固定的,只有后面一个键位会变比如Extract constant (提取变量)就是 c(constant)、Extract variable (提取变量)就是 v(variable)。 - -#### 提取常量(extract constant) - -1. **使用场景** :提取未经过定义就直接出现的常量。提取常量使得你的编码更易读,避免硬编码。 -2. **快捷键:** `command + option+ c(mac)/ ctrl + alt + c(Windows/Linux)` - -**示例:** - -![](./pictures/exact/extract-constant.gif) - -#### 提取参数(exact parameter) - -1. **使用场景** :提取参数到方法中。 -2. **快捷键:** `command + option+ p(mac)/ ctrl + alt + p(Windows/Linux)` - -![](./pictures/exact/exact-parameter.gif) - -#### 提取变量(exact variable) - -1. **使用场景** :提取多次出现的表达式。 -2. **快捷键:** `command + option+ v(mac) / ctrl + alt + v(Windows/Linux) ` - -**示例:** - -![](./pictures/exact/exact-variable.gif) - -#### 提取属性(exact field) - -1. **使用场景** :把当前表达式提取成为类的一个属性。 -2. **快捷键:** `command + option+ f(mac) / ctrl + alt + f(Windows/Linux) ` - -**示例:** - -![](./pictures/exact/exact-field.gif) - - -**示例:** - -![](./pictures/exact/exact-variable.gif) - -#### 提取方法(exact method) - -1. **使用场景** :1个或者多个表达式可以提取为一个方法。 提取方法也能使得你的编码更易读,更加语义化。 -2. **快捷键:** `command + option+ m(mac)/ ctrl + alt + m(Windows/Linux)` - -**示例:** - -![](./pictures/exact/exact-method.gif) - -#### 提取接口(exact interface) - -1. **使用场景** :想要把一个类中的1个或多个方法提取到一个接口中的时候。 -2. **快捷键:** `command + option+ m(mac)/ ctrl + alt + m(Windows/Linux)` - -**示例:** - -![](./pictures/exact/exact-interface.gif) - diff --git a/docs/idea-tutorial/idea-tips/idea-source-code-reading-skills.md b/docs/idea-tutorial/idea-tips/idea-source-code-reading-skills.md deleted file mode 100644 index 0064598c..00000000 --- a/docs/idea-tutorial/idea-tips/idea-source-code-reading-skills.md +++ /dev/null @@ -1,189 +0,0 @@ -# IDEA源码阅读技巧 - -项目有个新来了一个小伙伴,他看我查看项目源代码的时候,各种骚操作“花里胡哨”的。于是他向我请教,想让我分享一下我平时使用 IDEA 看源码的小技巧。 - -## 基本操作 - -这一部分的内容主要是一些我平时看源码的时候常用的快捷键/小技巧!非常好用! - -掌握这些快捷键/小技巧,看源码的效率提升一个等级! - -### 查看当前类的层次结构 - -| 使用频率 | 相关快捷键 | -| -------- | ---------- | -| ⭐⭐⭐⭐⭐ | `Ctrl + H` | - -平时,我们阅读源码的时候,经常需要查看类的层次结构。就比如我们遇到抽象类或者接口的时候,经常需要查看其被哪些类实现。 - -拿 Spring 源码为例,`BeanDefinition` 是一个关于 Bean 属性/定义的接口。 - -```java -public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { - ...... -} -``` - -如果我们需要查看 `BeanDefinition` 被哪些类实现的话,只需要把鼠标移动到 `BeanDefinition` 类名上,然后使用快捷键 `Ctrl + H` 即可。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135533686.png) - -同理,如果你想查看接口 `BeanDefinition` 继承的接口 `AttributeAccessor` 被哪些类实现的话,只需要把鼠标移动到 `AttributeAccessor` 类名上,然后使用快捷键 `Ctrl + H` 即可。 - -### 查看类结构 - -| 使用频率 | 相关快捷键 | -| -------- | ------------------------------------- | -| ⭐⭐⭐⭐ | `Alt + 7`(Win) / `Command +7` (Mac) | - -类结构可以让我们快速了解到当前类的方法、变量/常量,非常使用! - -我们在对应的类的任意位置使用快捷键 `Alt + 7`(Win) / `Command +7` (Mac)即可。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135552183.png) - -### 快速检索类 - -| 使用频率 | 相关快捷键 | -| -------- | ---------------------------------------- | -| ⭐⭐⭐⭐⭐ | `Ctrl + N` (Win) / `Command + O` (Mac) | - -使用快捷键 `Ctrl + N` (Win) / `Command + O` (Mac)可以快速检索类/文件。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135629367.png) - -### 关键字检索 - -| 使用频率 | 相关快捷键 | -| -------- | ---------- | -| ⭐⭐⭐⭐⭐ | 见下文 | - -- 当前文件下检索 : `Ctrl + F` (Win) / `Command + F` (Mac) -- 全局的文本检索 : `Ctrl + Shift + F` (Win) / `Command + Shift + F` (Mac) - -### 查看方法/类的实现类 - -| 使用频率 | 相关快捷键 | -| -------- | -------------------------------------------------- | -| ⭐⭐⭐⭐ | `Ctrl + Alt + B` (Win) / `Command + Alt + B` (Mac) | - -如果我们想直接跳转到某个方法/类的实现类,直接在方法名或者类名上使用快捷键 `Ctrl + Alt + B/鼠标左键` (Win) / `Command + Alt + B/鼠标左键` (Mac) 即可。 - -如果对应的方法/类只有一个实现类的话,会直接跳转到对应的实现类。 - -比如 `BeanDefinition` 接口的 `getBeanClassName()` 方法只被 `AbstractBeanDefinition` 抽象类实现,我们对这个方法使用快捷键就可以直接跳转到 `AbstractBeanDefinition` 抽象类中对应的实现方法。 - -```java -public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { - @Nullable - String getBeanClassName(); - ...... -} -``` - -如果对应的方法/类有多个实现类的话,IDEA 会弹出一个选择框让你选择。 - -比如 `BeanDefinition` 接口的 `getParentName()` 方法就有多个不同的实现。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135703164.png) - -### 查看方法被使用的情况 - -| 使用频率 | 相关快捷键 | -| -------- | ---------- | -| ⭐⭐⭐⭐ | `Alt + F7` | - -我们可以通过直接在方法名上使用快捷键 `Alt + F7` 来查看这个方法在哪些地方被调用过。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135712962.png) - -### 查看最近使用的文件 - -| 使用频率 | 相关快捷键 | -| -------- | -------------------------------------- | -| ⭐⭐⭐⭐⭐ | `Ctrl + E`(Win) / `Command +E` (Mac) | - -你可以通过快捷键 `Ctrl + E`(Win) / `Command +E` (Mac)来显示 IDEA 最近使用的一些文件。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135733816.png) - -### 查看图表形式的类继承链 - -| 使用频率 | 相关快捷键 | -| -------- | ------------------------ | -| ⭐⭐⭐⭐ | 相关快捷键较多,不建议记 | - -点击类名 **右键** ,选择 **Shw Diagrams** 即可查看图表形式的类继承链。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135745518.png) - -你还可以对图表进行一些操作。比如,你可以点击图表中具体的类 **右键**,然后选择显示它的实现类或者父类。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135757163.png) - -再比如你还可以选择是否显示类中的属性、方法、内部类等等信息。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135902827.png) - -如果你想跳转到对应类的源码的话,直接点击图表中具体的类 **右键** ,然后选择 **Jump to Source** 。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210527135807668.png) - -## 插件推荐 - -### 一键生成方法的序列图 - -**序列图**(Sequence Diagram),亦称为**循序图**,是一种 UML 行为图。表示系统执行某个方法/操作(如登录操作)时,对象之间的顺序调用关系。 - -这个顺序调用关系可以这样理解:你需要执行系统中某个对象 a 提供的方法/操作 login(登录),但是这个对象又依赖了对象 b 提供的方法 getUser(获取用户)。因此,这里就有了 a -> b 调用关系之说。 - -我们可以通过 **SequenceDiagram** 这个插件一键生成方法的序列图。 - -> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过 IDEA 插件市场的官网手动下载安装。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/2021052218304014.png) - -**如何使用呢?** - -1、选中方法名(注意不要选类名),然后点击鼠标右键,选择 **Sequence Diagram** 选项即可! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20201021170110697.png) - -2、配置生成的序列图的一些基本的参数比如调用深度之后,我们点击 ok 即可! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/c5040f1105c762ddf8689892913bc02d.png) - -3、你还可以通过生成的时序图来定位到相关的代码,这对于我们阅读源码的时候尤其有帮助! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20201021171623809.png) - -4、时序图生成完成之后,你还可以选择将其导出为图片。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20201021170228723.png) - -相关阅读:[《安利一个 IDEA 骚操作:一键生成方法的序列图》](https://mp.weixin.qq.com/s/SG1twZczqdup_EQAOmNERg) 。 - -### 项目代码统计 - -为了快速分析项目情况,我们可以对项目的 **代码的总行数、单个文件的代码行数、注释行数等信息进行统计。** - -**Statistic** 这个插件来帮助我们实现这一需求。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210522183550110.png) - -有了这个插件之后你可以非常直观地看到你的项目中所有类型的文件的信息比如数量、大小等等,可以帮助你更好地了解你们的项目。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210522183616310.png) - -你还可以使用它看所有类的总行数、有效代码行数、注释行数、以及有效代码比重等等这些东西。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/idea/20210522183630459.png) - -如果,你担心插件过多影响 IDEA 速度的话,可以只在有代码统计需求的时候开启这个插件,其他时间禁用它就完事了! - -相关阅读:[快速识别烂项目!试试这款项目代码统计 IDEA 插件](https://mp.weixin.qq.com/s/fVEeMW6elhu79I-rTZB40A) - - - - - diff --git a/docs/idea-tutorial/idea-tips/pictures/exact/exact-field.gif b/docs/idea-tutorial/idea-tips/pictures/exact/exact-field.gif deleted file mode 100644 index f558f20d..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/exact/exact-field.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/exact/exact-interface.gif b/docs/idea-tutorial/idea-tips/pictures/exact/exact-interface.gif deleted file mode 100644 index 83c2f385..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/exact/exact-interface.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/exact/exact-method.gif b/docs/idea-tutorial/idea-tips/pictures/exact/exact-method.gif deleted file mode 100644 index 4ed58ff4..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/exact/exact-method.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/exact/exact-parameter.gif b/docs/idea-tutorial/idea-tips/pictures/exact/exact-parameter.gif deleted file mode 100644 index cda8a2c8..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/exact/exact-parameter.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/exact/exact-variable.gif b/docs/idea-tutorial/idea-tips/pictures/exact/exact-variable.gif deleted file mode 100644 index 93bf4c9f..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/exact/exact-variable.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/exact/extract-constant.gif b/docs/idea-tutorial/idea-tips/pictures/exact/extract-constant.gif deleted file mode 100644 index 52a25c9b..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/exact/extract-constant.gif and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/install-plugin-from-disk.png b/docs/idea-tutorial/idea-tips/pictures/install-plugin-from-disk.png deleted file mode 100644 index 08c664ec..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/install-plugin-from-disk.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/refractor-help.png b/docs/idea-tutorial/idea-tips/pictures/refractor-help.png deleted file mode 100644 index 345ddea7..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/refractor-help.png and /dev/null differ diff --git a/docs/idea-tutorial/idea-tips/pictures/rename.gif b/docs/idea-tutorial/idea-tips/pictures/rename.gif deleted file mode 100644 index 005e08b3..00000000 Binary files a/docs/idea-tutorial/idea-tips/pictures/rename.gif and /dev/null differ diff --git a/docs/idea-tutorial/readme.md b/docs/idea-tutorial/readme.md deleted file mode 100644 index a954a7b7..00000000 --- a/docs/idea-tutorial/readme.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -icon: creative -category: IDEA指南 ---- - -# IntelliJ IDEA 使用指南 | 必备插件推荐 | 插件开发入门 | 重构小技巧 | 源码阅读技巧 - -**项目地址** : - -- Github 地址:[https://github.com/CodingDocs/awesome-idea-tutorial](https://github.com/CodingDocs/awesome-idea-tutorial) -- Gitee 地址:[https://gitee.com/SnailClimb/awesome-idea-tutorial](https://gitee.com/SnailClimb/awesome-idea-tutorial ) (Github 无法访问或者访问速度比较慢的小伙伴可以看码云上的对应内容) - -**常见问题** : - -- [选择IDEA还是Eclipse? - JavaGuide的回答 - 知乎](https://www.zhihu.com/question/305591091/answer/2259316801) -- [IntelliJ IDEA 中有什么让你相见恨晚的技巧? - JavaGuide的回答 - 知乎](https://www.zhihu.com/question/300830746/answer/2255262082) - diff --git a/docs/interview-preparation/interview-experience.md b/docs/interview-preparation/interview-experience.md new file mode 100644 index 00000000..d828d540 --- /dev/null +++ b/docs/interview-preparation/interview-experience.md @@ -0,0 +1,14 @@ +--- +title: 优质面经 +category: 知识星球 +--- + +古人云:“**他山之石,可以攻玉**” 。善于学习借鉴别人的面试的成功经验或者失败的教训,可以让自己少走许多弯路。 + +在 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的 **「面经篇」** ,我分享了 10+ 篇高质量的面经: + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304103521611.png) + +并且,[知识星球](../about-the-author/zhishixingqiu-two-years.md)还有专门分享面经和面试题的专题,里面会分享很多优质的面经和面试题。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304120018731.png) diff --git a/docs/interview-preparation/teach-you-how-to-prepare-for-the-interview-hand-in-hand.md b/docs/interview-preparation/teach-you-how-to-prepare-for-the-interview-hand-in-hand.md new file mode 100644 index 00000000..dc0db88d --- /dev/null +++ b/docs/interview-preparation/teach-you-how-to-prepare-for-the-interview-hand-in-hand.md @@ -0,0 +1,16 @@ +--- +title: 手把手教你如何准备面试 +category: 知识星球 +--- + +在 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的 **「面试准备篇」** ,我写了 10+ 篇文章手把手教你如何准备面试: + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304120532910.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304120629860.png) + +这个系列涵盖项目经验、简历编写、源码学习、算法准备、面试资源等内容。 + +另外,考虑到很多小伙伴缺少项目经历,除了星球内部的 [《手写 RPC 框架》](../zhuanlan/handwritten-rpc-framework.md)之外,我还推荐了很多小众但优质的实战项目,有视频也有开源项目。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/image-20220308132546961.png) diff --git a/docs/java/basis/generics.md b/docs/java/basis/generics.md deleted file mode 100644 index 164794b6..00000000 --- a/docs/java/basis/generics.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: 泛型连环炮 -category: Java -tag: - - Java基础 ---- - -泛型相关的面试题为我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)专属内容,已经整理到了[《Java 面试指北》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)中。 - -《Java 面试指北》的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/1&e=1648742399&token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD:HyfLWy5gNC5F_XukPYrlj_a4EJI=.png) - -我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) - -如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 - -星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) - -**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** - - - - - diff --git a/docs/java/basis/java-basic-questions-03.md b/docs/java/basis/java-basic-questions-03.md index b5a4559f..a02637b1 100644 --- a/docs/java/basis/java-basic-questions-03.md +++ b/docs/java/basis/java-basic-questions-03.md @@ -213,7 +213,7 @@ JDK 提供了很多内置的注解(比如 `@Override` 、`@Deprecated`), 在 Java 中,所有的异常都有一个共同的祖先 `java.lang` 包中的 `Throwable` 类。`Throwable` 类有两个重要的子类: - **`Exception`** :程序本身可以处理的异常,可以通过 `catch` 来进行捕获。`Exception` 又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。 -- **`Error`** :`Error` 属于程序无法处理的错误 ,我们没办法通过 `catch` 来进行捕获 。例如Java 虚拟机运行错误(`Virtual MachineError`)、虚拟机内存不够错误(`OutOfMemoryError`)、类定义错误(`NoClassDefFoundError`)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。 +- **`Error`** :`Error` 属于程序无法处理的错误 ,~~我们没办法通过 `catch` 来进行捕获~~不建议通过`catch`捕获 。例如Java 虚拟机运行错误(`Virtual MachineError`)、虚拟机内存不够错误(`OutOfMemoryError`)、类定义错误(`NoClassDefFoundError`)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。 ### Checked Exception 和 Unchecked Exception 有什么区别? @@ -265,7 +265,17 @@ Catch Exception -> RuntimeException Finally ``` -**注意:不要在 finally 语句块中使用 return!** 当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句不会被执行。 +**注意:不要在 finally 语句块中使用 return!** 当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。 + +[jvm 官方文档](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5)中有明确提到: + +> If the `try` clause executes a *return*, the compiled code does the following: +> +> 1. Saves the return value (if any) in a local variable. +> 2. Executes a *jsr* to the code for the `finally` clause. +> 3. Upon return from the `finally` clause, returns the value saved in the local variable. + +先执行一部分的,先把返回的结果存到一段内存中; 示例: @@ -458,4 +468,4 @@ Java IO 流共涉及 40 多个类,这些类看上去很杂乱,但实际上 问题本质想问:**不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节流操作和字符流操作呢?** -回答:字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。 \ No newline at end of file +回答:字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。 diff --git a/docs/java/collection/java-collection-questions-01.md b/docs/java/collection/java-collection-questions-01.md index 80034e40..900c1c71 100644 --- a/docs/java/collection/java-collection-questions-01.md +++ b/docs/java/collection/java-collection-questions-01.md @@ -107,7 +107,7 @@ public interface RandomAccess { 查看源码我们发现实际上 `RandomAccess` 接口中什么都没有定义。所以,在我看来 `RandomAccess` 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。 -在 `binarySearch()` 方法中,它要判断传入的 list 是否 `RamdomAccess` 的实例,如果是,调用`indexedBinarySearch()`方法,如果不是,那么调用`iteratorBinarySearch()`方法 +在 `binarySearch()` 方法中,它要判断传入的 list 是否 `RandomAccess` 的实例,如果是,调用`indexedBinarySearch()`方法,如果不是,那么调用`iteratorBinarySearch()`方法 ```java public static diff --git a/docs/java/concurrent/java-concurrent-questions-01.md b/docs/java/concurrent/java-concurrent-questions-01.md index 2cf5c7cf..641409fa 100644 --- a/docs/java/concurrent/java-concurrent-questions-01.md +++ b/docs/java/concurrent/java-concurrent-questions-01.md @@ -228,7 +228,7 @@ Thread[线程 2,5,main]waiting get resource1 避免死锁就是在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。 -**安全状态** 指的是系统能够按照某种进程推进顺序(P1、P2、P3.....Pn)来为每个进程分配所需资源,直到满足每个进程对资源的最大需求,使每个进程都可顺利完成。称序列为安全序列。 +> **安全状态** 指的是系统能够按照某种线程推进顺序(P1、P2、P3.....Pn)来为每个线程分配所需资源,直到满足每个线程对资源的最大需求,使每个线程都可顺利完成。称序列为安全序列。 我们对线程 2 的代码修改成下面这样就不会产生死锁了。 diff --git a/docs/java/concurrent/java-concurrent-questions-02.md b/docs/java/concurrent/java-concurrent-questions-02.md index ebfdbc5e..4936cb02 100644 --- a/docs/java/concurrent/java-concurrent-questions-02.md +++ b/docs/java/concurrent/java-concurrent-questions-02.md @@ -184,7 +184,7 @@ JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、 #### 1.5.1. 两者都是可重入锁 -**“可重入锁”** 指的是自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增 1,所以要等到锁的计数器下降为 0 时才能释放锁。 +**“可重入锁”** 指的是自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果是不可重入锁的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增 1,所以要等到锁的计数器下降为 0 时才能释放锁。 #### 1.5.2.synchronized 依赖于 JVM 而 ReentrantLock 依赖于 API diff --git a/docs/javaguide/intro.md b/docs/javaguide/intro.md index e61f407d..96784e23 100644 --- a/docs/javaguide/intro.md +++ b/docs/javaguide/intro.md @@ -16,6 +16,7 @@ category: 走近项目 ## 项目说明 +- [在线阅读网站](https://javaguide.cn)基于 Vuepress 搭建,使用的是主题是 [vuepress-theme-hope](https://github.com/vuepress-theme-hope/vuepress-theme-hope)(很 Nice 的一个主题)。 - 项目的 Markdown 格式参考:[Github Markdown 格式](https://guides.github.com/features/mastering-markdown/),表情素材来自:[EMOJI CHEAT SHEET](https://www.webpagefx.com/tools/emoji-cheat-sheet/)。 - Logo 下的小图标是使用[Shields.IO](https://shields.io/) 生成的。 diff --git a/docs/open-source-project/big-data.md b/docs/open-source-project/big-data.md new file mode 100644 index 00000000..b1ea7f03 --- /dev/null +++ b/docs/open-source-project/big-data.md @@ -0,0 +1,11 @@ +--- +title: 大数据 +category: 开源项目 +--- + +- **[Spark](https://github.com/apache/spark)** :Spark 是用于大规模数据处理的统一分析引擎。 +- **[Flink](https://github.com/apache/flink "flink")** :Apache Flink 是一个框架和分布式处理引擎,用于在*无边界和有边界*数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 +- **[HBase](https://hbase.apache.org/)**: HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。 +- **[Flume](https://flume.apache.org/)** :Apache Flume 是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。 +- **[Storm](https://storm.apache.org/)** : 一个分布式,高容错的实时计算系统。 + diff --git a/docs/open-source-project/machine-learning.md b/docs/open-source-project/machine-learning.md new file mode 100644 index 00000000..7921c0d1 --- /dev/null +++ b/docs/open-source-project/machine-learning.md @@ -0,0 +1,10 @@ +--- +title: 机器学习 +category: 开源项目 +--- + +- **[Deeplearning4j](https://github.com/eclipse/deeplearning4j)** : Deeplearning4j 是第一个为 Java 和 Scala 编写的商业级,开源,分布式深度学习库。 +- **[Smile](https://github.com/haifengl/smile)** :基于 Java 和 Scala 的机器学习库。 + +相关阅读:[Java 能用于机器学习和数据科学吗?-InfoQ](https://www.infoq.cn/article/GA9UeYlv8ohBzBso9eph) + diff --git a/docs/open-source-project/practical-project.md b/docs/open-source-project/practical-project.md new file mode 100644 index 00000000..01533aba --- /dev/null +++ b/docs/open-source-project/practical-project.md @@ -0,0 +1,63 @@ +--- +title: 实战项目 +category: 开源项目 +--- + +## 博客/论坛/考试系统 + +下面这几个项目都是非常适合 Spring Boot 初学者学习的,下面的大部分项目的总体代码架构我都看过,个人觉得还算不错,不会误导没有实际做过项目的朋友。 + +- **[vhr](https://github.com/lenve/vhr "vhr")** :微人事是一个前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发。 +- **[favorites-web](https://github.com/cloudfavorites/favorites-web)** :云收藏 Spring Boot 2.X 开源项目。云收藏是一个使用 Spring Boot 构建的开源网站,可以让用户在线随时随地收藏的一个网站,在网站上分类整理收藏的网站或者文章。 +- **[community](https://github.com/codedrinker/community)** :开源论坛、问答系统,现有功能提问、回复、通知、最新、最热、消除零回复功能。功能持续更新中…… 技术栈 Spring、Spring Boot、MyBatis、MySQL/H2、Bootstrap。 +- **[VBlog](https://github.com/lenve/VBlog)** :V 部落,Vue+SpringBoot 实现的多用户博客管理平台! +- **[My-Blog](https://github.com/ZHENFENG13/My-Blog)** : My Blog 是由 SpringBoot + Mybatis + Thymeleaf 等技术实现的 Java 博客系统,页面美观、功能齐全、部署简单及完善的代码,一定会给使用者无与伦比的体验。 +- **[uexam](https://gitee.com/mindskip/uexam)** :一个非常不错的考试系统!考试系统应用场景还挺多的,不论是对于在校大学生还是已经工作的小伙伴,并且,类似的私活也有很多。相关阅读:[《好一个 Spring Boot 开源在线考试系统!解决了我的燃眉之急》](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247491585%26idx%3D1%26sn%3D8d3c6768c22e72d6bfcbeee9624886a7%26chksm%3Dcea1afcaf9d626dc918760289c37025ad526f6255786bc198d2402203df64c873ad7934f58df%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd) 。 +- **[PassJava-Platform](https://github.com/Jackson0714/PassJava-Platform)** :一个基于微服务(SpringBoot、Spring Cloud)的面试刷题系统!相关阅读:[《一个基于 Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽》](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247497045%26idx%3D1%26sn%3D577175bfd6c040a0df5a494fce6f9758%26chksm%3Dcea1ba9ef9d633883a2e213c0fb9a88bdc87051347d4b3fad2c2befb65d8b16e1ea81d8146dd%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd)。 + +相关文章:[想要搭建个人博客?我调研了 100 来个 Java 开源博客系统,发现这 5 个最好用!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247491191&idx=1&sn=fd5efa645c2f2e09f088f6a018cea028&chksm=cea251bcf9d5d8aac8653c686b7a331ffe4e13aa9ffc9beab2c378ea2497a9bd3295ff8d2c51&token=747074901&lang=zh_CN#rd) + +## 商城 + +下面的商城系统大多比较复杂比如 mall ,如果没有 Java 基础和 Spring Boot 都还没有摸熟的话不推荐过度研究下面几个项目或者使用这些项目当作毕业设计。 + +- **[mall](https://github.com/macrozheng/mall "mall")** :mall 项目是一套电商系统,包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现。 +- **[mall-swarm](https://github.com/macrozheng/mall-swarm "mall-swarm")** : mall-swarm 是一套微服务商城系统,采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch 等核心技术,同时提供了基于 Vue 的管理后台方便快速搭建系统。 +- **[onemall](https://github.com/YunaiV/onemall)** :mall 商城,基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。 +- **[litemall](https://github.com/linlinjava/litemall "litemall")** : 又一个小商城。litemall = Spring Boot 后端 + Vue 管理员前端 + 微信小程序用户前端 + Vue 用户移动端。 +- **[xmall](https://github.com/Exrick/xmall)** :基于 SOA 架构的分布式电商购物商城 前后端分离 前台商城:Vue 全家桶 后台管理系统:Spring/Dubbo/SSM/Elasticsearch/Redis/MySQL/ActiveMQ/Shiro/Zookeeper 等 +- **[newbee-mall](https://github.com/newbee-ltd/newbee-mall)** :newbee-mall 项目(新蜂商城)是一套电商系统,包括 newbee-mall 商城系统及 newbee-mall-admin 商城后台管理系统,基于 Spring Boot 2.X 及相关技术栈开发。 + +## 权限管理系统 + +权限管理系统在企业级的项目中一般都是非常重要的,如果你需求去实际了解一个不错的权限系统是如何设计的话,推荐你可以参考下面这些开源项目。 + +- **[Spring-Cloud-Admin](https://github.com/wxiaoqi/Spring-Cloud-Admin "Spring-Cloud-Admin")** :Cloud-Admin 是国内首个基于 Spring Cloud 微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关 API 管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用 Spring Boot2 以及 Spring Cloud Gateway 相关核心组件,前端采用 vue-element-admin 组件。 +- **[pig](https://gitee.com/log4j/pig "pig")**:(gitee)基于 Spring Boot 2.2、 Spring Cloud Hoxton & Alibaba、 OAuth2 的 RBAC 权限管理系统。 +- **[FEBS-Shiro](https://github.com/wuyouzhuguli/FEBS-Shiro "FEBS-Shiro")** :Spring Boot 2.1.3,Shiro1.4.0 & Layui 2.5.4 权限管理系统。 +- **[eladmin](https://github.com/elunez/eladmin)** : 项目基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue 的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持数据字典与数据权限管理,支持一键生成前后端代码,支持动态路由。 +- **[SpringBoot-Shiro-Vue](https://github.com/Heeexy/SpringBoot-Shiro-Vue)** :提供一套基于 Spring Boot-Shiro-Vue 的权限管理思路.前后端都加以控制,做到按钮/接口级别的权限。 + +## 快速开发脚手架 + +- **[RuoYi](https://gitee.com/y_project/RuoYi)** :RuoYi 一款基于基于 SpringBoot 的权限管理系统 易读易懂、界面简洁美观,直接运行即可用 。 +- **[ruoyi-vue-pro](https://github.com/YunaiV/ruoyi-vue-pro)** : 基于 SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统。 +- **[Guns](https://gitee.com/stylefeng/guns)** : 我在上大学的时候就了解和接触过了这个项目,当时我还是一个 Spring 入门不太久的小菜鸟。一晃,不经意间已经过去快 3 年了。Guns 功能齐全 ,采用主流框架 Spring Boot2.0+开发,并且支持 Spring Cloud Alibaba 微服务)。 适合企业后台管理网站的快速开发场景,不论是对于单体和微服务都有支持。 +- **[JHipster](https://github.com/jhipster/generator-jhipster)** :开源应用程序平台,可在几秒钟内创建 Spring Boot + Angular / React 项目! +- **[JeecgBoot](https://github.com/zhangdaiscott/jeecg-boot)** :一款基于代码生成器的 JAVA 快速开发平台,开源界“小普元”超越传统商业企业级开发平台! +- **[zuihou-admin-cloud](https://github.com/zuihou/zuihou-admin-cloud)** :基于`SpringCloud(Hoxton.SR7)` + `SpringBoot(2.2.9.RELEASE)` 的 SaaS 型微服务快速开发平台,具备用户管理、资源权限管理、网关统一鉴权、Xss 防跨站攻击、自动代码生成、多存储系统、分布式事务、分布式定时任务等多个模块,支持多业务系统并行开发, 支持多服务并行开发,可以作为后端服务的开发脚手架。 +- **[Erupt](https://gitee.com/erupt/erupt)** : 使用 Java 注解,快速开发 Admin 管理后台。零前端代码、零 CURD、不生成任何代码、自动建表、注解式 API,支持所有主流数据库,支持自定义页面,支持多数据源,提供二十几类业务组件,十几种展示形式,支持逻辑删除,动态定时任务,前端后端分离等。 核心技术:Spring Boot、JPA、Reflect、TypeScript、NG-ZORRO 等。 +- **[SmartAdmin](https://gitee.com/lab1024/smart-admin)** : 互联网企业级的通用型中后台解决方案!使用最前沿的前后台技术栈 SpringBoot 和 Vue,前后端分离!代码质量非常高! +- **[BallCat](https://github.com/ballcat-projects/ballcat)** :一个功能完善的快速开发脚手架!除了最基本的权限管理,定时任务功能之外,还额外支持 XSS 过滤,SQL 防注入、数据脱敏等多种功能 + +**相关文章** : + +- [听说你要接私活?Guide 连夜整理了 5 个开源免费的 Java 项目快速开发脚手架。](https://sourl.cn/cFyLTR) +- [解放双手,再来推荐 5 个 Java 项目开发快速开发脚手架!项目经验和私活都不愁了!](https://sourl.cn/StkiAv) + +## 造轮子 + +- **[guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework)** :一款基于 Netty+Kyro+Zookeeper 实现的自定义 RPC 框架-附详细实现过程和相关教程。 +- **[mini-spring](https://github.com/DerekYRC/mini-spring)** :简化版的 Spring 框架,能帮助你快速熟悉 Spring 源码和掌握 Spring 的核心原理。代码极度简化,保留了 Spring 的核心功能,如 IoC 和 AOP、资源加载器等核心功能。 +- **[itstack-demo-jvm](https://github.com/fuzhengwei/itstack-demo-jvm)** :通过 Java 代码来实现 JVM 的基础功能(搜索解析 class 文件、字节码命令、运行时数据区等。相关阅读:[《zachaxy 的手写 JVM 系列》](https://zachaxy.github.io/tags/JVM/) +- **[Freedom](https://github.com/alchemystar/Freedom)** :自己 DIY 一个具有 ACID 的数据库。相关项目:[MYDB](https://github.com/CN-GuoZiyang/MYDB)(一个简单的数据库实现)、[toyDB](https://github.com/erikgrinaker/toydb)(Rust 实现的分布式 SQL 数据库)。 \ No newline at end of file diff --git a/docs/open-source-project/readme.md b/docs/open-source-project/readme.md new file mode 100644 index 00000000..c8384e4f --- /dev/null +++ b/docs/open-source-project/readme.md @@ -0,0 +1,14 @@ +--- +title: Java 开源项目精选 +category: 开源项目 +--- + +精选 Github 和 Gitee 上优质的 Java 开源项目,希望能够帮助到你。 + +欢迎大家在 [issues 区](https://github.com/CodingDocs/awesome-java/issues)推荐自己认可的 Java 开源项目,让我们共同维护一个优质的 Java 开源项目精选集! + +- Github 地址:[https://github.com/CodingDocs/awesome-java](https://github.com/CodingDocs/awesome-java) +- Gitee 地址:[https://gitee.com/SnailClimb/awesome-java](https://gitee.com/SnailClimb/awesome-java) + +如果内容对你有帮助的话,欢迎给本项目点个 Star。我会用我的业余时间持续完善这份名单,感谢! + diff --git a/docs/open-source-project/system-design.md b/docs/open-source-project/system-design.md new file mode 100644 index 00000000..2ab69d78 --- /dev/null +++ b/docs/open-source-project/system-design.md @@ -0,0 +1,203 @@ +--- +title: 系统设计 +category: 开源项目 +--- + +## 基础框架 + +- **[Spring Boot ](https://github.com/spring-projects/spring-boot "spring-boot")** :Spring Boot 可以轻松创建独立的生产级基于 Spring 的应用程序,内置 web 服务器让你可以像运行普通 Java 程序一样运行项 目。另外,大部分 Spring Boot 项目只需要少量的配置即可,这有别于 Spring 的重配置。 +- **[Quarkus](https://github.com/quarkusio/quarkus)** : 用于编写 Java 应用程序的云原生和容器优先的框架。 +- **[Guice](https://github.com/google/guice)** :Google 开源的一个轻量级依赖注入框架,相当于一个功能极简化的轻量级 Spring Boot。在某些情况下非常实用,就比如说我们的项目只需要使用依赖注入,不需要 AOP 等功能特性。 +- **[SOFABoot](https://github.com/sofastack/sofa-boot)** :SOFABoot 基于 Spring Boot ,不过在其基础上增加了 Readiness Check,类隔离,日志空间隔离等等能力。 配套提供的还有:SOFARPC(RPC 框架)、SOFABolt(基于 Netty 的远程通信框架)、SOFARegistry(注册中心)...详情请参考:[SOFAStack ](https://github.com/sofastack) 。 +- [**Spring Batch**](https://github.com/spring-projects/spring-batch) : Spring Batch 是一个轻量级但功能又十分全面的批处理框架,主要用于批处理场景比如从数据库、文件或队列中读取大量记录。不过,需要注意的是:**Spring Batch 不是调度框架**。商业和开源领域都有许多优秀的企业调度框架比如 Quartz、XXL-JOB、Elastic-Job。它旨在与调度程序一起工作,而不是取代调度程序。更多介绍请参考 [Spring Batch 官方文档](https://docs.spring.io/spring-batch/docs/4.3.x/reference/html/spring-batch-intro.html#spring-batch-intro),入门教程可以参考 [Spring Batch 从入门到实战](https://mrbird.cc/Spring-Batch入门.html)。 + +## 数据库 + +### 连接池 + +- **[Druid](https://github.com/alibaba/druid)** : 阿里巴巴数据库事业部出品,为监控而生的数据库连接池。 +- **[HikariCP](https://github.com/brettwooldridge/HikariCP)** : 一个可靠的高性能 JDBC 连接池。Springboot 2.0 选择 HikariCP 作为默认数据库连接池。 + +### 框架 + +- **[MyBatis-Plus](https://github.com/baomidou/mybatis-plus)** : [MyBatis-Plus](https://github.com/baomidou/mybatis-plus)(简称 MP)是一个 [MyBatis](http://www.mybatis.org/mybatis-3/) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 +- **[Redisson](https://github.com/redisson/redisson "redisson")** : Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Grid),支持超过 30 个对象和服务:`Set`,`SortedSet`, `Map`, `List`, `Queue`, `Deque` ......,并且提供了多种分布式锁的实现。更多介绍请看:[《Redisson 项目介绍》](https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D "Redisson项目介绍")。 + +### 缓存 + +- **[Caffeine](https://github.com/ben-manes/caffeine)** : 一款强大的本地缓存解决方案,性能非常 🐂。 +- **[Redis](https://github.com/redis/redis)** :一个使用 C 语言开发的内存数据库,分布式缓存首选。 + +### 数据库建模 + +- **[CHINER](https://gitee.com/robergroup/chiner)** :开源免费的国产数据库建模工具。目标是做一款丰富数据库生态,独立于具体数据库之外的,数据库关系模型设计平台。前生是 [PDMan](https://gitee.com/robergroup/pdman),定位为 PowerDesigner 的免费替代方案。 + +开源的数据库建模工具比较少,以下是一些非开源的数据库建模工具(部分需要付费才能使用) : + +- **[MySQL Workbench](https://www.mysql.com/products/workbench/)** : MySQL 官方为数据库架构师、开发人员和 DBA 提供的一个可视化工具。 MySQL Workbench 支持数据建模,SQL 开发以及服务器配置、用户管理、性能优化、数据库备份以及迁移等功能,支持 Windows、Linux 和 Mac OS X 平台。 +- **[Navicat Data Modeler](https://www.navicat.com.cn/products/navicat-data-modeler)** : 一款强大的和符合成本效益的数据库设计工具,它能帮助用户创建高质素的概念、逻辑和物理数据模型。让你可视化地设计数据库结构、执行逆向或正向工程程序、从 ODBC 数据源导入模型、生成复杂的 SQL/DDL 和打印模型到文件等。付费。 +- **[DbSchema](https://dbschema.com/)** : 一款功能强大的数据库设计和管理的可视化工具,支持几乎所有的关系型和 NoSQL 数据库。付费。 +- **[dbdiagram.io](https://dbdiagram.io/home)** : 是一款简单免费的在线 ER 图绘制工具,通过编写代码创建模型,专为开发人员和数据分析师而设计。它通过一个简单的自定义语言来生成数据模型,支持 MySQL、PostgreSQL、SQL Server 数据库 DDL 文件的正向工程和逆向工程、版本历史、在线共享、导出图片或者 PDF 等功能。dbdiagram.io 提供了免费版。 + +### 数据库管理 + +- **[Beekeeper Studio](https://github.com/beekeeper-studio/beekeeper-studio)** :跨平台数据库管理工具,颜值高,支持 SQLite、MySQL、MariaDB、Postgres、CockroachDB、SQL Server、Amazon Redshift。 +- **[Sequel Pro](https://github.com/sequelpro/sequelpro)** :适用于 macOS 的 MySQL/MariaDB 数据库管理工具。 +- **[DBeaver](https://github.com/dbeaver/dbeaver)** :一个基于 Java 开发 ,并且支持几乎所有的数据库产品的开源数据库管理工具。DBeaver 社区版不光支持关系型数据库比如 MySQL、PostgreSQL、MariaDB、SQLite、Oracle、Db2、SQL Server,还比如 SQLite、H2 这些内嵌数据库。还支持常见的全文搜索引擎比如 Elasticsearch 和 Solr、大数据相关的工具比如 Hive 和 Spark。 +- **[Kangaroo](https://gitee.com/dbkangaroo/kangaroo)** :袋鼠 是一款为热门数据库系统打造的管理客户端(SQLite / MySQL / PostgreSQL / ...) ,支持建表、查询、模型、同步、导入导出等功能,支持 Windows / Mac / Linux 等操作系统,力求打造成好用、好玩、开发友好的 SQL 工具。 +- **[Mongood](https://github.com/RenzHoly/Mongood)** : MongoDB 图形化的管理工具。基于微软 Fluent UI,支持自动黑暗模式。 + +### 数据同步 + +- **[Canal](https://github.com/alibaba/canal "canal")** [kə'næl] : Canal 译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 +- **[DataX](https://github.com/alibaba/DataX "DataX")** :DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。相关项目:**[DataX-Web](https://github.com/WeiYe-Jing/datax-web)** (DataX 集成可视化页面,选择数据源即可一键生成数据同步任务)。 + +其他:**[Flinkx](https://github.com/DTStack/flinkx)** (基于 Flink 的分布式数据同步工具)。 + +## 搜索引擎 + +- **[Elasticsearch](https://github.com/elastic/elasticsearch "elasticsearch")** (推荐):开源,分布式,RESTful 搜索引擎。 +- **[Solr](https://lucene.apache.org/solr/)** : Solr(读作“solar”)是 Apache Lucene 项目的开源企业搜索平台。 + +## 认证授权 + +- **[WxJava](https://github.com/Wechat-Group/WxJava)** : WxJava (微信开发 Java SDK),支持包括微信支付、开放平台、小程序、企业微信/企业号和公众号等的后端开发。 +- **[Sa-Token](https://github.com/dromara/sa-token)** :轻量级 Java 权限认证框架。支持认证授权、单点登录、踢人下线、自动续签等功能。 +- **[JustAuth](https://github.com/justauth/JustAuth)** :小而全而美的第三方登录开源组件。目前已经集成了诸如:Github、Gitee、支付宝、新浪微博、微信、Google、Facebook、Twitter、StackOverflow 等国内外数十家第三方平台。 + +## 网络通讯 + +- **[Netty](https://github.com/netty/netty)** : 一个基于 NIO 的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。 +- **[Retrofit](https://github.com/square/retrofit)** :适用于 Android 和 Java 的类型安全的 HTTP 客户端。Retrofit 的 HTTP 请求使用的是 [OkHttp](https://square.github.io/okhttp/) 库(一款被广泛使用网络框架)。 +- **[Forest](https://gitee.com/dromara/forest)** :轻量级 HTTP 客户端 API 框架,让 Java 发送 HTTP/HTTPS 请求不再难。它比 OkHttp 和 HttpClient 更高层,是封装调用第三方 restful api client 接口的好帮手,是 retrofit 和 feign 之外另一个选择。 +- **[netty-websocket-spring-boot-starter](https://github.com/YeautyYE/netty-websocket-spring-boot-starter)** :帮助你在 Spring Boot 中使用 Netty 来开发 WebSocket 服务器,并像 spring-websocket 的注解开发一样简单。 + +## 测试 + +为了能让我们编写的系统更加健壮,必要的测试(UI 测试、单元测试...)是必须的。 + +### 测试框架 + +- **[JUnit](http://junit.org/)** : Java 测试框架。 +- **[Mockito](https://github.com/mockito/mockito)** :Mockito 是一个模拟测试框架,可以让你用优雅,简洁的接口写出漂亮的单元测试。(对那些不容易构建的对象用一个虚拟对象来代替,使其在调试期间用来作为真实对象的替代品) +- **[PowerMock](https://github.com/powermock/powermock)** : 编写单元测试仅靠 Mockito 是不够。因为 Mockito 无法 mock 私有方法、final 方法及静态方法等。PowerMock 这个 framework,主要是为了扩展其他 mock 框架,如 Mockito、EasyMock。它使用一个自定义的类加载器,纂改字节码,突破 Mockito 无法 mock 静态方法、构造方法、final 类、final 方法以及私有方法的限制。 +- **[WireMock](https://github.com/tomakehurst/wiremock)** :模拟 HTTP 服务的工具(Mock your APIs)。 + +相关阅读: + +- [The Practical Test Pyramid- Martin Fowler](https://martinfowler.com/articles/practical-test-pyramid.html) (很赞的一篇文章,不过是英文的) +- [浅谈测试之 PowerMock](https://juejin.im/post/6844903982058618894) + +### 测试平台 + +- **[MeterSphere](https://github.com/metersphere/metersphere)** : 一站式开源持续测试平台,涵盖测试跟踪、接口测试、性能测试、团队协作等功能,全面兼容 JMeter、Postman、Swagger 等开源、主流标准。 +- **[Apifox](https://www.apifox.cn/)** :API 文档、API 调试、API Mock、API 自动化测试。 + +### API 调试 + +- **[Insomnia](https://insomnia.rest/)** :像人类而不是机器人一样调试 API。我平时经常用的,界面美观且轻量,总之很喜欢。 +- **[Postman](https://www.getpostman.com/)** :API 请求生成器。 +- **[Postwoman](https://github.com/liyasthomas/postwoman "postwoman")** :API 请求生成器-一个免费、快速、漂亮的 Postma 替代品。 + +## 任务调度 + +- **[Quartz](https://github.com/quartz-scheduler/quartz)** :一个很火的开源任务调度框架,Java 定时任务领域的老大哥或者说参考标准, 很多其他任务调度框架都是基于 `quartz` 开发的,比如当当网的`elastic-job`就是基于`quartz`二次开发之后的分布式调度解决方案 +- **[XXL-JOB](https://github.com/xuxueli/xxl-job)** :XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 +- **[Elastic-Job](http://elasticjob.io/index_zh.html)** :Elastic-Job 是当当网开源的一个基于 Quartz 和 Zookeeper 的分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成,一般我们只要使用 Elastic-Job-Lite 就好。 +- **[EasyScheduler](https://github.com/analysys/EasyScheduler "EasyScheduler")** (已经更名为 DolphinScheduler,已经成为 Apache 孵化器项目): Easy Scheduler 是一个分布式工作流任务调度系统,主要解决“复杂任务依赖但无法直接监控任务健康状态”的问题。Easy Scheduler 以 DAG 方式组装任务,可以实时监控任务的运行状态。同时,它支持重试,重新运行等操作... 。 +- **[PowerJob](https://gitee.com/KFCFans/PowerJob)** :新一代分布式任务调度与计算框架,支持 CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,使用简单,功能强大,文档齐全,欢迎各位接入使用!http://www.powerjob.tech/ 。 +- **[DolphinScheduler](https://github.com/apache/dolphinscheduler)** :分布式易扩展的可视化工作流任务调度平台。 + +相关阅读: + +- [Spring Job、Quartz、XXL-Job 对比+全解析](https://mp.weixin.qq.com/s/jqN4noo5NazckPCehWFgpA) +- [推荐 5 个 YYDS 的 Java 项目](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247518215&idx=1&sn=91e467f39322d2e7979b85fe235822d2&chksm=cea1c7ccf9d64edaf966c95923d72d337bf5e655a773a3d295d65fc92e4535ae5d8b0e6d9d86&token=2063686030&lang=zh_CN#rd) + +## 分布式 + +### API 网关 + +微服务下一个系统被拆分为多个服务,但是像 安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局的视图来统一管理这些功能。 + +综上:**一般情况下,网关一般都会提供请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、容灾、日志、监控这些功能。** + +上面介绍了这么多功能实际上网关主要做了一件事情:**请求过滤** 。权限校验、流量控制这些都可以通过过滤器实现,请求转也是通过过滤器实现的。 + +1. **[Kong](https://github.com/Kong/kong "kong")** :Kong 是一个云原生、快速的、可伸缩的分布式微服务抽象层(也称为 API 网关、API 中间件或在某些情况下称为服务网格)。2015 年作为开源项目发布,其核心价值是高性能和可扩展性。 +2. **[Soul](https://github.com/Dromara/soul "soul")** :高性能、基于 webflux 的反应式 Java API 网关 +3. **[Spring Cloud Gateway](https://github.com/spring-cloud/spring-cloud-gateway)** : 基于 Spring Framework 5.x 和 Spring Boot 2.x 构建的高性能网关。 +4. **[Zuul](https://github.com/Netflix/zuul)** : Zuul 是一个 L7 应用程序网关,它提供了动态路由,监视,弹性,安全性等功能。 + +### 配置中心 + +- **[Apollo](https://github.com/ctripcorp/apollo "apollo")**(推荐) :Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。 +- **[Nacos](https://github.com/alibaba/nacos)**(推荐):Nacos 是 Spring Cloud Alibaba 提供的服务注册发现组件,类似于 Consul、Eureka。并且,提供了分布式配置管理功能。 +- **[Spring Cloud Config](https://github.com/spring-cloud/spring-cloud-config)** : Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Cloud 项目,通过简单的配置即可实现功能。 +- **[Consul](https://github.com/hashicorp/consul)** :Consul 是 HashiCorp 公司推出的开源软件,提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案。 + +### 链路追踪 + +目前分布式链路追踪系统基本都是根据谷歌的《Dapper 大规模分布式系统的跟踪系统》这篇论文发展而来,主流的有 Pinpoint,Skywalking ,CAT(当然也有其他的例如 Zipkin,Jaeger 等产品,不过总体来说不如前面选取的 3 个完成度高)等。 + +1. **[Skywalking](https://github.com/apache/skywalking "skywalking")** : 针对分布式系统的应用性能监控,尤其是针对微服务、云原生和面向容器的分布式系统架构。 +2. **[Zipkin](https://github.com/openzipkin/zipkin "zipkin")** :Zipkin 是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。功能包括该数据的收集和查找。 +3. **[CAT](https://github.com/dianping/cat "cat")** : CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC 框架,RPC 框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。 + +相关阅读: [Skywalking 官网对于主流开源链路追踪系统的对比](https://skywalking.apache.org/zh/blog/2019-03-29-introduction-of-skywalking-and-simple-practice.html) + +## 高并发 + +### 高性能 + +#### 消息队列 + +**分布式队列** : + +1. **[RocketMQ](https://github.com/apache/rocketmq "RocketMQ")** :阿里巴巴开源的一款高性能、高吞吐量的分布式消息中间件。 +2. **[Kafaka](https://github.com/apache/kafka "Kafaka")**: Kafka 是一种分布式的,基于发布 / 订阅的消息系统。关于它的入门可以查看:[Kafka 入门看这一篇就够了](https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/data-communication/Kafka入门看这一篇就够了.md "Kafka入门看这一篇就够了") +3. **[RabbitMQ](https://github.com/rabbitmq "RabbitMQ")** :由 erlang 开发的基于 AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列。 + +**内存队列** : + +**[Disruptor](https://github.com/LMAX-Exchange/disruptor)** : Disruptor 是英国外汇交易公司 LMAX 开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与 I/O 操作处于同样的数量级)。相关阅读 :[《高性能内存队列——Disruptor》](https://tech.meituan.com/2016/11/18/disruptor.html) 。 + +**管理工具** : + +1. **[Kafdrop](https://github.com/obsidiandynamics/kafdrop)** : 一个用于查看 Kafka 主题和浏览消费者组的 Web UI。 +2. **[EFAK](https://github.com/smartloli/EFAK)** (Eagle For Apache Kafka,以前叫做 Kafka Eagle) :一个简单的高性能监控系统,用于对 Kafka 集群进行全面的监控和管理。 + +#### 多数据源&读写分离&分库分表 + +- **[ShardingSphere](https://github.com/apache/shardingsphere)** :ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(计划中)这 3 款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。中文文档:[https://shardingsphere.apache.org/document/current/cn/overview/](https://shardingsphere.apache.org/document/current/cn/overview/) 。 +- **[MyCat](https://github.com/MyCatApache/MyCat2)** : MyCat 是数据库分库分表的中间件,MyCat 使用最多的两个功能是:读写分离和分库分表。MyCat 是一些社区爱好者在阿里 Cobar 的基础上进行二次开发,解决了 Cobar 当时存 在的一些问题,并且加入了许多新的功能在其中。 +- **[dynamic-datasource-spring-boot-starter](https://github.com/baomidou/dynamic-datasource-spring-boot-starter])** :dynamic-datasource-spring-boot-starter 是一个基于 springboot 的快速集成多数据源的启动器。如果说你有配置多数据源、读写分离等需求的话,可以了解一下这个项目。 + +相关阅读:[数据库中间件详解(精品长文)](https://zhuanlan.zhihu.com/p/87144535) + +### 高可用 + +#### 限流 + +**分布式限流** : + +- **[ Sentinel](https://github.com/alibaba/Sentinel)**(推荐):面向分布式服务架构的高可用防护组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。 +- **[Hystrix](https://github.com/Netflix/Hystrix)** :类似于 Sentinel 。 + +相关阅读:[Sentinel 与 Hystrix 的对比](https://sentinelguard.io/zh-cn/blog/sentinel-vs-hystrix.html) + +**单机限流** : + +- **[Bucket4j](https://github.com/vladimir-bukhtoyarov/bucket4j)** :一个非常不错的基于令牌/漏桶算法的限流库。 +- **[Resilience4j](https://github.com/resilience4j/resilience4j)** :一个轻量级的容错组件,其灵感来自于 Hystrix。 + +#### 监控 + +- **[Spring Boot Admin](https://github.com/codecentric/spring-boot-admin)** :管理和监控 Spring Boot 应用程序。 +- **[Metrics](https://github.com/dropwizard/metrics)** :捕获**JVM**和应用程序级别的指标。所以你知道发生了什么事。 + +## 日志 + +- **EKL 老三件套** : 最原始的时候,ELK 是由 3 个开源项目的首字母构成,分别是 **E**lasticsearch 、**L**ogstash、**K**ibana。 +- **新一代 ELK 架构** : Elasticsearch+Logstash+Kibana+Beats。 +- **EFK** : EFK 中的 F 代表的是 [Fluentd](https://github.com/fluent/fluentd)。 +- **[TLog](https://gitee.com/dromara/TLog)** :一个轻量级的分布式日志标记追踪神器,10 分钟即可接入,自动对日志打标签完成微服务的链路追踪。 diff --git a/docs/open-source-project/tool-library.md b/docs/open-source-project/tool-library.md new file mode 100644 index 00000000..4443c3e3 --- /dev/null +++ b/docs/open-source-project/tool-library.md @@ -0,0 +1,44 @@ +--- +title: 工具类库 +category: 开源项目 +--- + +## 代码质量 + +- **[lombok](https://github.com/rzwitserloot/lombok)** :使用 Lombok 我们可以简化我们的 Java 代码,比如使用它之后我们通过注释就可以实现 getter/setter、equals 等方法。 +- **[guava](https://github.com/google/guava "guava")** :Guava 是一组核心库,其中包括新的集合类型(例如 multimap 和 multiset),不可变集合,图形库以及用于并发、I / O、哈希、原始类型、字符串等的实用程序! +- **[p3c](https://github.com/alibaba/p3c "p3c")** :Alibaba Java Coding Guidelines pmd implements and IDE plugin。Eclipse 和 IDEA 上都有该插件,推荐使用! +- **[arthas](https://github.com/alibaba/arthas "arthas")** : Arthas 是 Alibaba 开源的 Java 诊断工具。 +- **[sonarqube](https://github.com/SonarSource/sonarqube "sonarqube")** :SonarQube 支持所有开发人员编写更干净,更安全的代码。 +- **[checkstyle](https://github.com/checkstyle/checkstyle "checkstyle")** :Checkstyle 是一种开发工具,可帮助程序员编写符合编码标准的 Java 代码。它使检查 Java 代码的过程自动化,从而使人们不必执行这项无聊(但很重要)的任务。这使其成为想要实施编码标准的项目的理想选择。 +- **[pmd](https://github.com/pmd/pmd "pmd")** : 可扩展的多语言静态代码分析器。 +- **[spotbugs](https://github.com/spotbugs/spotbugs "spotbugs")** :SpotBugs 是 FindBugs 的继任者。静态分析工具,用于查找 Java 代码中的错误。 +- **[hutool](https://github.com/looly/hutool "hutool")** : Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语言也可以“甜甜的”。 + +## 文档处理 + +### Excel + +- **[easyexcel](https://github.com/alibaba/easyexcel)** :快速、简单避免 OOM 的 java 处理 Excel 工具。 + +### JSON + +- **[JsonPath](https://github.com/json-path/JsonPath)** :处理 JSON 数据的工具库。 + +### PDF + +- **[pdfbox](https://github.com/apache/pdfbox)** :用于处理 PDF 文档的开放源码 Java 工具。该项目允许创建新的 PDF 文档、对现有文档进行操作以及从文档中提取内容。PDFBox 还包括几个命令行实用程序。PDFBox 是在 Apache 2.0 版许可下发布的。 +- **[OpenPDF](https://github.com/LibrePDF/OpenPDF)** :OpenPDF 是一个免费的 Java 库,用于使用 LGPL 和 MPL 开源许可创建和编辑 PDF 文件。OpenPDF 基于 iText 的一个分支。 +- **[itext7](https://github.com/itext/itext7)** :iText 7 代表了想要利用利用好 PDF 的开发人员的更高级别的 sdk。iText 7 配备了更好的文档引擎、高级和低级编程功能以及创建、编辑和增强 PDF 文档的能力,几乎对每个工作流都有好处。 +- **[FOP](https://xmlgraphics.apache.org/fop/)** :Apache FOP 项目的主要的输出目标是 PDF。 + +## 验证码 + +- **[EasyCaptcha](https://gitee.com/whvse/EasyCaptcha)** :Java 图形验证码,支持 gif、中文、算术等类型,可用于 Java Web、JavaSE 等项目。 +- **[AJ-Captcha](https://gitee.com/anji-plus/captcha)** :行为验证码(滑动拼图、点选文字),前后端(java)交互。 +- **[tianai-captcha](https://gitee.com/tianai/tianai-captcha)** :好看又好用的滑块验证码。 + +## 其他 + +- **[oshi](https://github.com/oshi/oshi "oshi")** :一款为 Java 语言提供的基于 JNA 的(本机)操作系统和硬件信息库。 +- **[ip2region](https://github.com/lionsoul2014/ip2region)** :最自由的 ip 地址查询库,ip 到地区的映射库,提供 Binary,B 树和纯内存三种查询算法,妈妈再也不用担心我的 ip 地址定位。 \ No newline at end of file diff --git a/docs/open-source-project/tools.md b/docs/open-source-project/tools.md new file mode 100644 index 00000000..0dbe6700 --- /dev/null +++ b/docs/open-source-project/tools.md @@ -0,0 +1,28 @@ +--- +title: 开发工具 +category: 开源项目 +--- + +## Java 相关 + +- **[JADX](https://github.com/skylot/jadx)** :一款功能强大的反编译工具。 +- **[Recaf](https://github.com/Col-E/Recaf)** : Java 字节码编辑器,基于 ASM(Java 字节码操作框架) 来修改字节码,可简化编辑已编译 Java 应用程序的过程。 + +## Redis 可视化管理 + +- **[Another Redis Desktop Manager](https://github.com/qishibo/AnotherRedisDesktopManager/blob/master/README.zh-CN.md)** :更快、更好、更稳定的 Redis 桌面(GUI)管理客户端。 +- **[Redis Manager](https://github.com/ngbdf/redis-manager)** :Redis 一站式管理平台,支持集群(cluster、master-replica、sentinel)的监控、安装(除 sentinel)、管理、告警以及基本的数据操作功能。 + +## Docker & Kubernetes 可视化管理 + +- **[Portainer](https://github.com/portainer/portainer)** :可视化管理 Docker 和 Kubernetes。相关阅读:[《吊炸天的 Docker 图形化工具 Portainer,必须推荐给你!》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247504221&idx=1&sn=85a3c69d64fba1b0d6d8485ab28ab4c4&chksm=cea19e96f9d617802920d5769bafc824b3b80afdfb6166a00532f0caa3b6f5bdac930e4e89de&token=693114125&lang=zh_CN#rd)。 + +## ZooKeeper 可视化管理 + +- **[PrettyZoo](https://github.com/vran-dev/PrettyZoo)** : 一个基于 Apache Curator 和 JavaFX 实现的 ZooKeeper 图形化管理客户端,颜值非常高,支持 Mac / Windows / Linux 。你可以使用 PrettyZoo 来实现对 ZooKeeper 的可视化增删改查。 + +## Markdown + +- **[MarkText](https://github.com/marktext/marktext)** :一个简单而优雅的开源 Markdown 编辑器,专注于速度和可用性。Linux、macOS 和 Windows 均适用。 +- **[Typora](https://www.typora.io/)** :我一直用的一款 Markdown 工具,直接文件夹试图和目录试图,支持 Markdown 格式直接导出成 PDF、HTML 等格式。 +- **[Markdown Here](https://github.com/adam-p/markdown-here)** :使用 Markdown 语法发邮件,并且提供多种主题,快来拯救你的邮件格式吧! \ No newline at end of file diff --git a/docs/open-source-project/tutorial.md b/docs/open-source-project/tutorial.md new file mode 100644 index 00000000..5ce54a06 --- /dev/null +++ b/docs/open-source-project/tutorial.md @@ -0,0 +1,56 @@ +--- +title: 教程 +category: 开源项目 +--- + +## Java + +- **[JavaGuide](https://github.com/Snailclimb/JavaGuide "JavaGuide")** :【Java 学习+面试指南】 一份涵盖大部分 Java 程序员所需要掌握的核心知识。 +- **[interview-guide](https://github.com/csguide-dabai/interview-guide)** :总结了后端面试八股文中的重点,希望能帮助各位准备互联网开发岗校招面试的同学。 +- **[toBeBetterJavaer](https://github.com/itwanger/toBeBetterJavaer)** :一份通俗易懂、风趣幽默的 Java 学习指南,内容涵盖 Java 基础、Java 集合框架、Java 并发编程、JVM、Java 企业级开发(Git、SSM、Spring Boot)等知识点。 +- **[advanced-java](https://github.com/doocs/advanced-java "advanced-java")** :互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识。 +- **[architect-awesome](https://github.com/xingshaocheng/architect-awesome "architect-awesome")** :后端架构师技术图谱。 +- **[toBeTopJavaer](https://github.com/hollischuang/toBeTopJavaer "toBeTopJavaer")** :Java 工程师成神之路 。 +- **[technology-talk](https://github.com/aalansehaiyang/technology-talk)** : 汇总 java 生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识 +- **[tutorials](https://github.com/eugenp/tutorials "tutorials")**:该项目是一系列小而专注的教程 - 每个教程都涵盖 Java 生态系统中单一且定义明确的开发领域。 当然,它们的重点是 Spring Framework - Spring,Spring Boot 和 Spring Securiyt。 除了 Spring 之外,还有以下技术:核心 Java,Jackson,HttpClient,Guava。 +- **[JCSprout](https://github.com/crossoverJie/JCSprout "JCSprout")** :处于萌芽阶段的 Java 核心知识库。 +- **[bestJavaer](https://github.com/crisxuan/bestJavaer)** : 这是一个成为更好的 Java 程序员的系列教程。 +- **[java-design-patterns](https://github.com/iluwatar/java-design-patterns "java-design-patterns")** : 用 Java 实现的设计模式。 + +## 计算机基础 + +- **[CS-Notes](https://github.com/CyC2018/CS-Notes "CS-Notes")** :技术面试必备基础知识、Leetcode 题解、后端面试、Java 面试、春招、秋招、操作系统、计算机网络、系统设计。 +- **[Waking-Up](https://github.com/wolverinn/Waking-Up)** :计算机基础(计算机网络/操作系统/数据库/Git...)面试问题全面总结,包含详细的 follow-up question 以及答案;全部采用【问题+追问+答案】的形式,即拿即用,直击互联网大厂面试 🚀;可用于模拟面试、面试前复习、短期内快速备战面试...。 + +## SpringBoot + +- **[springboot-guide](https://github.com/Snailclimb/springboot-guide)** :SpringBoot 核心知识点总结。 基于 Spring Boot 2.19+。 +- **[SpringAll](https://github.com/wuyouzhuguli/SpringAll "SpringAll")** :循序渐进,学习 Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客 Spring 系列源码。 +- **[Springboot-Notebook](https://github.com/chengxy-nds/Springboot-Notebook)** :一系列以 Spring Boot 为基础开发框架,整合 Redis 、 Rabbitmq 、ES 、MongoDB 、Spring Cloud、Kafka、Skywalking 等互联网主流技术,实现各种常见功能点的综合性案例。 +- **[springboot-learning-example](https://github.com/JeffLi1993/springboot-learning-example "springboot-learning-example")** :Spring Boot 实践学习案例,是 Spring Boot 初学者及核心技术巩固的最佳实践。 +- **[spring-boot-demo](https://github.com/xkcoding/spring-boot-demo "spring-boot-demo")** :spring boot demo 是一个用来深度学习并实战 spring boot 的项目,目前总共包含 63 个集成 demo,已经完成 52 个。 +- **[SpringBoot-Labs](https://github.com/YunaiV/SpringBoot-Labs)** :Spring Boot 系列教程。 + +相关文章:[Github 点赞接近 100k 的 SpringBoot 学习教程+实战推荐!牛批!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247488298&idx=3&sn=0a8fd88ec5a050de131c2a3305482ac4&chksm=cea25ce1f9d5d5f7f53a0237d27489326bce4546353b038085c03b086d91ef396bf824d3a155&token=496868067&lang=zh_CN#rd) + +## SpringCloud + +- **[SpringCloudLearning](https://github.com/forezp/SpringCloudLearning "SpringCloudLearning")** : 方志朋的《史上最简单的 Spring Cloud 教程源码》。 +- **[springcloud-learning](https://github.com/macrozheng/springcloud-learning)** : 一套涵盖大部分核心组件使用的 Spring Cloud 教程。 +- **[SpringCloud](https://github.com/zhoutaoo/SpringCloud "SpringCloud")** :基于 SpringCloud2.1 的微服务开发脚手架,整合了 spring-security-oauth2、nacos、feign、sentinel、springcloud-gateway 等。 + +相关文章:[Github 点赞接近 70k 的 Spring Cloud 学习教程+实战项目推荐!牛批!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247488377&idx=1&sn=0fb33ef330159db5a9c8bc0f029cd739&chksm=cea25cb2f9d5d5a4c7bacc9dcfc90ed86e89f4262e32b40c7aa47af84c747cb6c0429f753e1d&token=496868067&lang=zh_CN#rd) + +## 大数据 + +- **[BigData-Notes](https://github.com/heibaiying/BigData-Notes "BigData-Notes")** :大数据入门指南 ⭐️。 +- **[flink-learning](https://github.com/zhisheng17/flink-learning "flink-learning")** :含 Flink 入门、概念、原理、实战、性能调优、源码解析等内容。 + +## 开源书籍 + +- **[《Effective Java(第 3 版)各章节的中英文学习参考》](https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual)** +- **[《On Java 8 中文版》](https://github.com/LingCoder/OnJava8)** +- **[《DDIA(设计数据密集型应用) 中文翻译》](https://github.com/Vonng/ddia)** +- **[《图说设计模式》](https://github.com/me115/design_patterns)** +- **[《Java 8 简明教程 中文版》](https://github.com/wizardforcel/modern-java-zh)** +- **[《凤凰架构》](https://github.com/fenixsoft/awesome-fenix)** \ No newline at end of file diff --git a/docs/readme.md b/docs/readme.md index 39d35129..bc64e33f 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -5,28 +5,28 @@ title: 主页 heroImage: /logo.svg heroText: JavaGuide tagline: 「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide! -action: +actions: - text: 开始阅读 link: /home/ type: primary - - text: 关于作者 - link: /about-the-author/ + - text: 知识星球 + link: /about-the-author/zhishixingqiu-two-years.md + type: default --- -## 👍官方知识星球 +## 必看专栏 - [JavaGuide 官方知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)来啦!!!如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 +- **[《Java 面试指北》](./zhuanlan/java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补! +- **[《手写 RPC 框架》](./zhuanlan/handwritten-rpc-framework.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 -**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** - -## 👉推荐阅读 +## 推荐阅读 - [Java学习路线](https://zhuanlan.zhihu.com/p/379041500) : 一份涵盖 Java 后端开发必备技能的学习路线!全面且清晰! - [Java开源项目精选](https://gitee.com/SnailClimb/awesome-java) :收集整理了 Gitee/Github 上非常棒的 Java 开源项目集合。Java 开发必备! - [Java技术文章精选集](/high-quality-technical-articles/) : 精选一些和 Java 相关的优质技术文章,每一篇都值得你阅读 3 遍以上! - [Java书单精选](https://gitee.com/SnailClimb/awesome-cs) : Java 后端开发值得一读的一些书籍。 -## 🔥PDF 资源 +## PDF - [《JavaGuide 面试突击版》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100029614&idx=1&sn=62993c5cf10265cb7018db7f1ec67250&chksm=4ea1fb6579d67273499b7243641d4ef372decd08047bfbb6dfb5843ef81c7ccba209086cf345#rd) - [《消息队列常见知识点&面试题总结》](https://t.1yb.co/Fy0u) @@ -34,13 +34,13 @@ action: - [《分布式相关面试题汇总》](https://t.1yb.co/GXLF) - [《图解计算机基础》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100021725&idx=1&sn=2db9664ca25363139a81691043e9fd8f&chksm=4ea19a1679d61300d8990f7e43bfc7f476577a81b712cf0f9c6f6552a8b219bc081efddb5c54#rd) -## 💡官方公众号 +## 公众号 最新更新会第一时间同步在公众号,强烈推荐大家关注一波!另外,公众号上有很多干货不会同步在线阅读网站。 ![我的公众号](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-08/167598cd2e17b8ec.png) -## 📧联系我 +## 联系我 交流/加群/互看朋友圈,欢迎添加我的微信(备注“Github”即可)。 diff --git a/docs/system-design/basis/RESTfulAPI.md b/docs/system-design/basis/RESTfulAPI.md index 142c0f73..07709863 100644 --- a/docs/system-design/basis/RESTfulAPI.md +++ b/docs/system-design/basis/RESTfulAPI.md @@ -1,6 +1,7 @@ - -# RestFul API 简明教程 - +--- +title: RestFul API +category: 代码质量 +--- ![](https://img-blog.csdnimg.cn/2021050713553862.png) diff --git a/docs/system-design/basis/naming.md b/docs/system-design/basis/naming.md index d9574e56..8cbf954a 100644 --- a/docs/system-design/basis/naming.md +++ b/docs/system-design/basis/naming.md @@ -1,6 +1,7 @@ - - -# Java 命名之道 +--- +title: 命名 +category: 代码质量 +--- 我还记得我刚工作那一段时间, 项目 Code Review 的时候,我经常因为变量命名不规范而被 “diss”! diff --git a/docs/system-design/basis/refactoring.md b/docs/system-design/basis/refactoring.md new file mode 100644 index 00000000..8cf33fba --- /dev/null +++ b/docs/system-design/basis/refactoring.md @@ -0,0 +1,138 @@ +--- +title: 重构 +category: 代码质量 +--- + +前段时间重读了[《重构:改善代码既有设计》](https://book.douban.com/subject/30468597/),收货颇多。于是,简单写了一篇文章来聊聊我对重构的看法。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/image-20220311155746549.png) + +## 何谓重构? + +学习重构必看的一本神书《重构:改善代码既有设计》从两个角度给出了重构的定义: + +> - 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 +> - 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 + +用更贴近工程师的语言来说: **重构就是利用设计模式(如组合模式、策略模式、责任链模式)、软件设计原则(如 SOLID 原则、YAGNI 原则、KISS 原则)和重构手段(如封装、继承、构建测试体系)来让代码更容易理解,更易于修改。** + +软件设计原则指导着我们组织和规范代码,同时,重构也是为了能够尽量设计出尽量满足软件设计原则的软件。 + +正确重构的核心在于 **步子一定要小,每一步的重构都不会影响软件的正常运行,可以随时停止重构。** + +**常见的设计模式如下** : + +![常见的设计模式](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/image-20220311160610999.png) + + + +更全面的设计模式总结,可以看 **[java-design-patterns](https://github.com/iluwatar/java-design-patterns)** 这个开源项目。 + +**常见的软件设计原则如下** : + +![常见的软件设计原](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/programming-principles%20.png) + +更全面的设计原则总结,可以看 **[java-design-patterns](https://github.com/iluwatar/java-design-patterns)** 和 **[hacker-laws-zh](https://github.com/nusr/hacker-laws-zh)** 这两个开源项目。 + +## 为什么要重构? + +在上面介绍重构定义的时候,我从比较抽象的角度介绍了重构的好处:重构的主要目的主要是提升代码&架构的灵活性/可扩展性以及复用性。 + +如果对应到一个真实的项目,重构具体能为我们带来什么好处呢? + +1. **让代码更容易理解** : 通过添加注释、命名规范、逻辑优化等手段可以让我们的代码更容易被理解; +2. **避免代码腐化** :通过重构干掉坏味道代码; +3. **加深对代码的理解** :重构代码的过程会加深你对某部分代码的理解; +4. **发现潜在 bug** :是这样的,很多潜在的 bug ,都是我们在重构的过程中发现的; +5. ...... + +看了上面介绍的关于重构带来的好处之后,你会发现重构的最终目标是 **提高软件开发速度和质量** 。 + +重构并不会减慢软件开发速度,相反,如果代码质量和软件设计较差,当我们想要添加新功能的话,开发速度会越来越慢。到了最后,甚至都有想要重写整个系统的冲动。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/bad&good-design.png) + +《重构:改善代码既有设计》这本书中这样说: + +> 重构的唯一目的就是让我们开发更快,用更少的工作量创造更大的价值。 + +## 何时进行重构? + +重构在是开发过程中随时可以进行的,见机行事即可,并不需要单独分配一两天的时间专门用来重构。 + +### 提交代码之前 + +《重构:改善代码既有设计》这本书介绍了一个 **营地法则** 的概念: + +> 编程时,需要遵循营地法则:保证你离开时的代码库一定比来时更健康。 + +这个概念表达的核心思想其实很简单:在你提交代码的之前,花一会时间想一想,我这次的提交是让项目代码变得更健康了,还是更腐化了,或者说没什么变化? + +项目团队的每一个人只有保证自己的提交没有让项目代码变得更腐化,项目代码才会朝着健康的方向发展。 + +**当我们离开营地(项目代码)的时候,请不要留下垃圾(代码花味道)!尽量确保营地变得更干净了!** + +### 开发一个新功能之后&之前 + +在开发一个新功能之后,我们应该回过头看看是不是有可以改进的地方。在添加一个新功能之前,我们可以思考一下自己是否可以重构代码以让新功能的开发更容易。 + +一个新功能的开发不应该仅仅只有功能验证通过那么简单,我们还应该尽量保证代码质量。 + +有一个两顶帽子的比喻:在我开发新功能之前,我发现重构可以让新功能的开发更容易,于是我戴上了重构的帽子。重构之后,我换回原来的帽子,继续开发新能功能。新功能开发完成之后,我又发现自己的代码难以理解,于是我又戴上了重构帽子。比较好的开发状态就是就是这样在重构和开发新功能之间来回切换。 + +![refractor-two-hats](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/refractor-two-hats.png) + +### Code Review 之后 + +Code Review 可以非常有效提高代码的整体质量,它会帮助我们发现代码中的坏味道以及可能存在问题的地方。并且, Code Review 可以帮助项目团队其他程序员理解你负责的业务模块,有效避免人员方面的单点风险。 + +经历一次 Code Review ,你的代码可能会收到很多改进建议。 + +### 捡垃圾式重构 + +当我们发现坏味道代码(垃圾)的时候,如果我们不想停下手头自己正在做的工作,但又不想放着垃圾不管,我们可以这样做: + +- 如果这个垃圾很容易重构的话,我们可以立即重构它。 +- 如果这个垃圾不太容易重构的话,我们可以先记录下来,当完成当下的任务再回来重构它。 + +### 阅读理解代码的时候 + +搞开发的小伙伴应该非常有体会:我们经常需要阅读项目团队中其他人写的代码,也经常需要阅读自己过去写的代码。阅读代码的时候,通常要比我们写代码的时间还要多很多。 + +我们在阅读理解代码的时候,如果发现一些坏味道的话,我们就可以对其进行重构。 + +就比如说你在阅读张三写的某段代码的时候,你发现这段代码逻辑过于复杂难以理解,你有更好的写法,那你就可以对张三的这段代码逻辑进行重构。 + +## 重构有哪些注意事项? + +### 单元测试是重构的保护网 + +**单元测试可以为重构提供信心,降低重构的成本。我们要像重视生产代码那样,重视单元测试。** + +另外,多提一句:持续集成也要依赖单元测试,当持续集成服务自动构建新代码之后,会自动运行单元测试来发现代码错误。 + +**怎样才能算单元测试呢?** 网上的定义很多,很抽象,很容易把人给看迷糊了。我觉得对于单元测试的定义主要取决于你的项目,一个函数甚至是一个类都可以看作是一个单元。就比如说我们写了一个计算个人股票收益率的方法,我们为了验证它的正确性专门为它写了一个单元测试。再比如说我们代码有一个类专门负责数据脱敏,我们为了验证脱敏是否符合预期专门为这个类写了一个单元测试。 + +**单元测试也是需要重构或者修改的。** [《代码整洁之道:敏捷软件开发手册》](https://book.douban.com/subject/4199741/)这本书这样写到: + +> 测试代码需要随着生产代码的演进而修改,如果测试不能保持整洁,只会越来越难修改。 + +### 不要为了重构而重构 + +**重构一定是要为项目带来价值的!** 某些情况下我们不应该进行重构: + +- 学习了某个设计模式/工程实践之后,不顾项目实际情况,刻意使用在项目上(避免货物崇拜编程); +- 项目进展比较急的时候,重构项目调用的某个 API 的底层代码(重构之后对项目调用这个 API 并没有带来什么价值); +- 重写比重构更容易更省事; +- ...... + +### 遵循方法 + +《重构:改善代码既有设计》这本书中列举除了代码常见的一些坏味道(比如重复代码、过长函数)和重构手段(如提炼函数、提炼变量、提炼类)。我们应该花时间去学习这些重构相关的理论知识,并在代码中去实践这些重构理论。 + +## 如何练习重构? + +除了可以在重构项目代码的过程中练习精进重构之外,你还可以有下面这些手段: + +- [重构实战练习](https://linesh.gitbook.io/refactoring/) :通过几个小案例一步一步带你学习重构! +- [设计模式+重构学习网站](https://refactoringguru.cn/) :免费在线学习代码重构、 设计模式、 SOLID 原则 (单一职责、 开闭原则、 里氏替换、 接口隔离以及依赖反转) 。 \ No newline at end of file diff --git a/docs/system-design/framework/netty.md b/docs/system-design/framework/netty.md index 19b03f87..fcd75b36 100644 --- a/docs/system-design/framework/netty.md +++ b/docs/system-design/framework/netty.md @@ -7,17 +7,4 @@ Netty 相关的面试题为我的[知识星球](https://www.yuque.com/docs/share 《Java 面试指北》的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。 -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/1&e=1648742399&token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD:HyfLWy5gNC5F_XukPYrlj_a4EJI=.png) - -我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) - -如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 - -星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) - -**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** - +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102536445.png) diff --git a/docs/system-design/framework/spring/images/spring-transaction/ae964c2c-7289-441c-bddd-511161f51ee1.png b/docs/system-design/framework/spring/images/spring-transaction/PlatformTransactionManager.png similarity index 100% rename from docs/system-design/framework/spring/images/spring-transaction/ae964c2c-7289-441c-bddd-511161f51ee1.png rename to docs/system-design/framework/spring/images/spring-transaction/PlatformTransactionManager.png diff --git a/docs/system-design/framework/spring/images/spring-transaction/a616b84d-9eea-4ad1-b4fc-461ff05e951d.png b/docs/system-design/framework/spring/images/spring-transaction/a616b84d-9eea-4ad1-b4fc-461ff05e951d.png deleted file mode 100644 index d4f3f027..00000000 Binary files a/docs/system-design/framework/spring/images/spring-transaction/a616b84d-9eea-4ad1-b4fc-461ff05e951d.png and /dev/null differ diff --git a/docs/system-design/framework/spring/images/spring-transaction/bda7231b-ab05-4e23-95ee-89ac90ac7fcf.png b/docs/system-design/framework/spring/images/spring-transaction/bda7231b-ab05-4e23-95ee-89ac90ac7fcf.png deleted file mode 100644 index 6b641c86..00000000 Binary files a/docs/system-design/framework/spring/images/spring-transaction/bda7231b-ab05-4e23-95ee-89ac90ac7fcf.png and /dev/null differ diff --git a/docs/system-design/framework/spring/images/spring-transaction/f6c6f0aa-0f26-49e1-84b3-7f838c7379d1.png b/docs/system-design/framework/spring/images/spring-transaction/roollbackFor.png similarity index 100% rename from docs/system-design/framework/spring/images/spring-transaction/f6c6f0aa-0f26-49e1-84b3-7f838c7379d1.png rename to docs/system-design/framework/spring/images/spring-transaction/roollbackFor.png diff --git a/docs/system-design/framework/spring/images/spring-transaction/接口使用原因.png b/docs/system-design/framework/spring/images/spring-transaction/接口使用原因.png deleted file mode 100644 index 92671788..00000000 Binary files a/docs/system-design/framework/spring/images/spring-transaction/接口使用原因.png and /dev/null differ diff --git a/docs/system-design/framework/spring/spring-common-annotations.md b/docs/system-design/framework/spring/spring-common-annotations.md index 496f0322..f2d89274 100644 --- a/docs/system-design/framework/spring/spring-common-annotations.md +++ b/docs/system-design/framework/spring/spring-common-annotations.md @@ -8,10 +8,6 @@ tag: ### 0.前言 -_大家好,我是 Guide 哥!这是我的 221 篇优质原创文章。如需转载,请在文首注明地址,蟹蟹!_ - -本文已经收录进我的 75K Star 的 Java 开源项目 JavaGuide:[https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide)。 - 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没啥大问题了! **为什么要写这篇文章?** @@ -356,7 +352,7 @@ class WebSite { } ``` -更多内容请查看我的这篇文章:《[10 分钟搞定 SpringBoot 如何优雅读取配置文件?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486181&idx=2&sn=10db0ae64ef501f96a5b0dbc4bd78786&chksm=cea2452ef9d5cc384678e456427328600971180a77e40c13936b19369672ca3e342c26e92b50&token=816772476&lang=zh_CN#rd)》 。 +更多内容请查看我的这篇文章:[《10 分钟搞定 SpringBoot 如何优雅读取配置文件?》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486181&idx=2&sn=10db0ae64ef501f96a5b0dbc4bd78786&chksm=cea2452ef9d5cc384678e456427328600971180a77e40c13936b19369672ca3e342c26e92b50&token=816772476&lang=zh_CN#rd) 。 ### 6. 参数校验 @@ -818,10 +814,7 @@ public void save() { - **作用于类**:当把`@Transactional` 注解放在类上时,表示所有该类的 public 方法都配置相同的事务属性信息。 - **作用于方法**:当类配置了`@Transactional`,方法也配置了`@Transactional`,方法的事务会覆盖类的事务配置信息。 -更多关于 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) +更多关于 Spring 事务的内容请查看我的这篇文章:[可能是最漂亮的 Spring 事务管理详解](./spring-transaction.md) 。 ### 10. json 数据处理 diff --git a/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md b/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md index 36808cd6..7b67dc41 100644 --- a/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md +++ b/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md @@ -77,7 +77,7 @@ Spring 的测试模块对 JUnit(单元测试框架)、TestNG(类似 JUnit ### 谈谈自己对于 Spring IoC 的了解 -**IoC(Inverse of Control:控制反转)** 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spirng 特有,在其他语言中也有应用。 +**IoC(Inverse of Control:控制反转)** 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。 **为什么叫控制反转?** diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index 4be94772..d85cc992 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -5,15 +5,13 @@ tag: - Spring --- -大家好,我是 Guide 哥,前段时间答应读者的 **Spring 事务**分析总结终于来了。这部分内容比较重要,不论是对于工作还是面试,但是网上比较好的参考资料比较少。 +前段时间答应读者的 **Spring 事务** 分析总结终于来了。这部分内容比较重要,不论是对于工作还是面试,但是网上比较好的参考资料比较少。 -如果本文有任何不对或者需要完善的地方,请帮忙指出!Guide 哥感激不尽! - -## 1. 什么是事务? +## 什么是事务? **事务是逻辑上的一组操作,要么都执行,要么都不执行。** -_Guide 哥:大家应该都能背上面这句话了,下面我结合我们日常的真实开发来谈一谈。_ +相信大家应该都能背上面这句话了,下面我结合我们日常的真实开发来谈一谈。 我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如下面的 `savePerson()` 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。 @@ -24,13 +22,12 @@ _Guide 哥:大家应该都能背上面这句话了,下面我结合我们日 } ``` -另外,需要格外注意的是:**事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的`innodb`引擎。但是,如果把数据库引擎变为 `myisam`,那么程序也就不再支持事务了!** +另外,需要格外注意的是:**事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 `innodb`引擎。但是,如果把数据库引擎变为 `myisam`,那么程序也就不再支持事务了!** 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账 1000 元,这个转账会涉及到两个关键操作就是: -1. 将小明的余额减少 1000 元 - -2. 将小红的余额增加 1000 元。 +> 1. 将小明的余额减少 1000 元。 +> 2. 将小红的余额增加 1000 元。 万一在这两个操作之间突然出现错误比如银行系统崩溃或者网络故障,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 @@ -58,9 +55,7 @@ public class OrdersService { 另外,数据库事务的 ACID 四大特性是事务的基础,下面简单来了解一下。 -## 2. 事务的特性(ACID)了解么? - -![](./images/spring-transaction/bda7231b-ab05-4e23-95ee-89ac90ac7fcf.png) +## 事务的特性(ACID)了解么? - **原子性(Atomicity):** 一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。 - **一致性(Consistency):** 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。 @@ -69,17 +64,17 @@ public class OrdersService { 参考 :[https://zh.wikipedia.org/wiki/ACID](https://zh.wikipedia.org/wiki/ACID) 。 -## 3. 详谈 Spring 对事务的支持 +## 详谈 Spring 对事务的支持 -**再提醒一次:你的程序是否支持事务首先取决于数据库 ,比如使用 MySQL 的话,如果你选择的是 innodb 引擎,那么恭喜你,是可以支持事务的。但是,如果你的 MySQL 数据库使用的是 myisam 引擎的话,那不好意思,从根上就是不支持事务的。** +> ⚠️ 再提醒一次:你的程序是否支持事务首先取决于数据库 ,比如使用 MySQL 的话,如果你选择的是 innodb 引擎,那么恭喜你,是可以支持事务的。但是,如果你的 MySQL 数据库使用的是 myisam 引擎的话,那不好意思,从根上就是不支持事务的。 这里再多提一下一个非常重要的知识点: **MySQL 怎么保证原子性的?** 我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行**回滚**,在 MySQL 中,恢复机制是通过 **回滚日志(undo log)** 实现的,所有事务进行的修改都会先先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 **回滚日志** 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。 -### 3.1. Spring 支持两种方式的事务管理 +### Spring 支持两种方式的事务管理 -#### 1).编程式事务管理 +#### 编程式事务管理 通过 `TransactionTemplate`或者`TransactionManager`手动管理事务,实际应用中很少使用,但是对于你理解 Spring 事务管理原理有帮助。 @@ -125,7 +120,7 @@ public void testTransaction() { } ``` -#### 2)声明式事务管理 +#### 声明式事务管理 推荐使用(代码侵入性最小),实际是通过 AOP 实现(基于`@Transactional` 的全注解方式使用最多)。 @@ -142,7 +137,7 @@ public void aMethod { } ``` -### 3.2. Spring 事务管理接口介绍 +### Spring 事务管理接口介绍 Spring 框架中,事务管理相关最重要的 3 个接口如下: @@ -154,7 +149,7 @@ Spring 框架中,事务管理相关最重要的 3 个接口如下: **`PlatformTransactionManager`** 会根据 **`TransactionDefinition`** 的定义比如事务超时时间、隔离级别、传播行为等来进行事务管理 ,而 **`TransactionStatus`** 接口则提供了一些方法来获取事务相应的状态比如是否新事务、是否可以回滚等等。 -#### 3.2.1. PlatformTransactionManager:事务管理接口 +#### PlatformTransactionManager:事务管理接口 **Spring 并不直接管理事务,而是提供了多种事务管理器** 。Spring 事务管理器的接口是: **`PlatformTransactionManager`** 。 @@ -162,7 +157,7 @@ Spring 框架中,事务管理相关最重要的 3 个接口如下: **`PlatformTransactionManager` 接口的具体实现如下:** -![](./images/spring-transaction/ae964c2c-7289-441c-bddd-511161f51ee1.png) +![](./images/spring-transaction/PlatformTransactionManager.png) `PlatformTransactionManager`接口中定义了三个方法: @@ -184,21 +179,36 @@ public interface PlatformTransactionManager { **这里多插一嘴。为什么要定义或者说抽象出来`PlatformTransactionManager`这个接口呢?** -主要是因为要将事务管理行为抽象出来,然后不同的平台去实现它,这样我们可以保证提供给外部的行为不变,方便我们扩展。我前段时间分享过:**“为什么我们要用接口?”** +主要是因为要将事务管理行为抽象出来,然后不同的平台去实现它,这样我们可以保证提供给外部的行为不变,方便我们扩展。 -![](./images/spring-transaction/接口使用原因.png) +我前段时间在我的[知识星球](https://www.yuque.com/snailclimb/rpkqw1/pvak2w)分享过:**“为什么我们要用接口?”** 。 -#### 3.2.2. TransactionDefinition:事务属性 +> 《设计模式》(GOF 那本)这本书在很多年前都提到过说要基于接口而非实现编程,你真的知道为什么要基于接口编程么? +> +> 纵观开源框架和项目的源码,接口是它们不可或缺的重要组成部分。要理解为什么要用接口,首先要搞懂接口提供了什么功能。我们可以把接口理解为提供了一系列功能列表的约定,接口本身不提供功能,它只定义行为。但是谁要用,就要先实现我,遵守我的约定,然后再自己去实现我定义的要实现的功能。 +> +> 举个例子,我上个项目有发送短信的需求,为此,我们定了一个接口,接口只有两个方法: +> +> 1.发送短信 +> 2.处理发送结果的方法。 +> +> 刚开始我们用的是阿里云短信服务,然后我们实现这个接口完成了一个阿里云短信的服务。后来,我们突然又换到了别的短信服务平台,我们这个时候只需要再实现这个接口即可。这样保证了我们提供给外部的行为不变。几乎不需要改变什么代码,我们就轻松完成了需求的转变,提高了代码的灵活性和可扩展性。 +> +> 什么时候用接口?当你要实现的功能模块设计抽象行为的时候,比如发送短信的服务,图床的存储服务等等。 + +#### TransactionDefinition:事务属性 事务管理器接口 **`PlatformTransactionManager`** 通过 **`getTransaction(TransactionDefinition definition)`** 方法来得到一个事务,这个方法里面的参数是 **`TransactionDefinition`** 类 ,这个类就定义了一些基本的事务属性。 -那么什么是 **事务属性** 呢? - -事务属性可以理解成事务的一些基本配置,描述了事务策略如何应用到方法上。 +**什么是事务属性呢?** 事务属性可以理解成事务的一些基本配置,描述了事务策略如何应用到方法上。 事务属性包含了 5 个方面: -![](./images/spring-transaction/a616b84d-9eea-4ad1-b4fc-461ff05e951d.png) +- 隔离级别 +- 传播行为 +- 回滚规则 +- 是否只读 +- 事务超时 `TransactionDefinition` 接口中定义了 5 个方法以及一些表示事务属性的常量比如隔离级别、传播行为等等。 @@ -235,7 +245,7 @@ public interface TransactionDefinition { } ``` -#### 3.2.3. TransactionStatus:事务状态 +#### TransactionStatus:事务状态 `TransactionStatus`接口用来记录事务的状态 该接口定义了一组方法,用来获取或判断事务的相应状态信息。 @@ -253,19 +263,17 @@ public interface TransactionStatus{ } ``` -### 3.3. 事务属性详解 +### 事务属性详解 -_实际业务开发中,大家一般都是使用 `@Transactional` 注解来开启事务,很多人并不清楚这个参数里面的参数是什么意思,有什么用。为了更好的在项目中使用事务管理,强烈推荐好好阅读一下下面的内容。_ +际业务开发中,大家一般都是使用 `@Transactional` 注解来开启事务,很多人并不清楚这个参数里面的参数是什么意思,有什么用。为了更好的在项目中使用事务管理,强烈推荐好好阅读一下下面的内容。 -#### 3.3.1. 事务传播行为 +#### 事务传播行为 **事务传播行为是为了解决业务层方法之间互相调用的事务问题**。 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。 -**举个例子!** - -我们在 A 类的`aMethod()`方法中调用了 B 类的 `bMethod()` 方法。这个时候就涉及到业务层方法之间互相调用的事务问题。如果我们的 `bMethod()`如果发生异常需要回滚,如何配置事务传播行为才能让 `aMethod()`也跟着回滚呢?这个时候就需要事务传播行为的知识了,如果你不知道的话一定要好好看一下。 +举个例子:我们在 A 类的`aMethod()`方法中调用了 B 类的 `bMethod()` 方法。这个时候就涉及到业务层方法之间互相调用的事务问题。如果我们的 `bMethod()`如果发生异常需要回滚,如何配置事务传播行为才能让 `aMethod()`也跟着回滚呢?这个时候就需要事务传播行为的知识了,如果你不知道的话一定要好好看一下。 ```java Class A { @@ -309,30 +317,29 @@ import org.springframework.transaction.TransactionDefinition; public enum Propagation { - REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), + REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), - SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), + SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), - MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), + MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), - REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), + REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), - NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), + NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), - NEVER(TransactionDefinition.PROPAGATION_NEVER), + NEVER(TransactionDefinition.PROPAGATION_NEVER), - NESTED(TransactionDefinition.PROPAGATION_NESTED); + NESTED(TransactionDefinition.PROPAGATION_NESTED); + private final int value; - private final int value; + Propagation(int value) { + this.value = value; + } - Propagation(int value) { - this.value = value; - } - - public int value() { - return this.value; - } + public int value() { + return this.value; + } } @@ -344,8 +351,8 @@ public enum Propagation { 使用的最多的一个事务传播行为,我们平时经常使用的`@Transactional`注解默认使用就是这个事务传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。也就是说: -1. 如果外部方法没有开启事务的话,`Propagation.REQUIRED`修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。 -2. 如果外部方法开启事务并且被`Propagation.REQUIRED`的话,所有`Propagation.REQUIRED`修饰的内部方法和外部方法均属于同一事务 ,只要一个方法回滚,整个事务均回滚。 +- 如果外部方法没有开启事务的话,`Propagation.REQUIRED`修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。 +- 如果外部方法开启事务并且被`Propagation.REQUIRED`的话,所有`Propagation.REQUIRED`修饰的内部方法和外部方法均属于同一事务 ,只要一个方法回滚,整个事务均回滚。 举个例子:如果我们上面的`aMethod()`和`bMethod()`使用的都是`PROPAGATION_REQUIRED`传播行为的话,两者使用的就是同一个事务,只要其中一个方法回滚,整个事务均回滚。 @@ -393,14 +400,12 @@ Class B { **3.`TransactionDefinition.PROPAGATION_NESTED`**: -如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于`TransactionDefinition.PROPAGATION_REQUIRED`。也就是说: +如果当前存在事务,就在嵌套事务内执行;如果当前没有事务,就执行与`TransactionDefinition.PROPAGATION_REQUIRED`类似的操作。也就是说: -1. 在外部方法未开启事务的情况下`Propagation.NESTED`和`Propagation.REQUIRED`作用相同,修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰。 -2. 如果外部方法开启事务的话,`Propagation.NESTED`修饰的内部方法属于外部事务的子事务,外部主事务回滚的话,子事务也会回滚,而内部子事务可以单独回滚而不影响外部主事务和其他子事务。 +- 在外部方法开启事务的情况下,在内部开启一个新的事务,作为嵌套事务存在。 +- 如果外部方法无事务,则单独开启一个事务,与 `PROPAGATION_REQUIRED` 类似。 -这里还是简单举个例子: - -如果 `aMethod()` 回滚的话,`bMethod()`和`bMethod2()`都要回滚,而`bMethod()`回滚的话,并不会造成 `aMethod()` 和`bMethod()2`回滚。 +这里还是简单举个例子:如果 `bMethod()` 回滚的话,`aMethod()`也会回滚。 ```java Class A { @@ -409,7 +414,6 @@ Class A { //do something B b = new B(); b.bMethod(); - b.bMethod2(); } } @@ -418,10 +422,6 @@ Class B { public void bMethod { //do something } - @Transactional(propagation=propagation.PROPAGATION_NESTED) - public void bMethod2 { - //do something - } } ``` @@ -439,7 +439,7 @@ Class B { 更多关于事务传播行为的内容请看这篇文章:[《太难了~面试官让我结合案例讲讲自己对 Spring 事务传播行为的理解。》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486668&idx=2&sn=0381e8c836442f46bdc5367170234abb&chksm=cea24307f9d5ca11c96943b3ccfa1fc70dc97dd87d9c540388581f8fe6d805ff548dff5f6b5b&token=1776990505&lang=zh_CN#rd) -#### 3.3.2 事务隔离级别 +#### 事务隔离级别 `TransactionDefinition` 接口中定义了五个表示隔离级别的常量: @@ -460,25 +460,25 @@ public interface TransactionDefinition { ```java public enum Isolation { - DEFAULT(TransactionDefinition.ISOLATION_DEFAULT), + DEFAULT(TransactionDefinition.ISOLATION_DEFAULT), - READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED), + READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED), - READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED), + READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED), - REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ), + REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ), - SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE); + SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE); - private final int value; + private final int value; - Isolation(int value) { - this.value = value; - } + Isolation(int value) { + this.value = value; + } - public int value() { - return this.value; - } + public int value() { + return this.value; + } } ``` @@ -504,23 +504,23 @@ mysql> SELECT @@tx_isolation; +-----------------+ ``` -~~这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 **REPEATABLE-READ(可重读)** 事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)** 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的 **SERIALIZABLE(可串行化)** 隔离级别。~~ +~~这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 **REPEATABLE-READ(可重读)** 事务隔离级别下使用的是 Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说 InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)** 已经可以完全保证事务的隔离性要求,即达到了 SQL 标准的 **SERIALIZABLE(可串行化)** 隔离级别。~~ -🐛问题更正:**MySQL InnoDB的REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁读使用到的机制就是 Next-Key Locks。** +🐛 问题更正:**MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁读使用到的机制就是 Next-Key Locks。** -因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 **READ-COMMITTED(读取提交内容)** ,但是你要知道的是InnoDB 存储引擎默认使用 **REPEAaTABLE-READ(可重读)** 并不会有任何性能损失。 +因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 **READ-COMMITTED(读取提交内容)** ,但是你要知道的是 InnoDB 存储引擎默认使用 **REPEAaTABLE-READ(可重读)** 并不会有任何性能损失。 InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到 **SERIALIZABLE(可串行化)** 隔离级别。 -🌈拓展一下(以下内容摘自《MySQL技术内幕:InnoDB存储引擎(第2版)》7.7章): +🌈 拓展一下(以下内容摘自《MySQL 技术内幕:InnoDB 存储引擎(第 2 版)》7.7 章): -> InnoDB存储引擎提供了对XA事务的支持,并通过XA事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transactional resources)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的ACID要求又有了提高。另外,在使用分布式事务时,InnoDB存储引擎的事务隔离级别必须设置为SERIALIZABLE。 +> InnoDB 存储引擎提供了对 XA 事务的支持,并通过 XA 事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transactional resources)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。另外,在使用分布式事务时,InnoDB 存储引擎的事务隔离级别必须设置为 SERIALIZABLE。 -#### 3.3.3. 事务超时属性 +#### 事务超时属性 所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 `TransactionDefinition` 中以 int 的值来表示超时时间,其单位是秒,默认值为-1。 -#### 3.3.4. 事务只读属性 +#### 事务只读属性 ```java package org.springframework.transaction; @@ -549,14 +549,14 @@ public interface TransactionDefinition { 分享一下关于事务只读属性,其他人的解答: -1. 如果你一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持 SQL 执行期间的读一致性; -2. 如果你一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询 SQL 必须保证整体的读一致性,否则,在前条 SQL 查询之后,后条 SQL 查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持 +- 如果你一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持 SQL 执行期间的读一致性; +- 如果你一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询 SQL 必须保证整体的读一致性,否则,在前条 SQL 查询之后,后条 SQL 查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持 -#### 3.3.5. 事务回滚规则 +#### 事务回滚规则 -这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常(RuntimeException 的子类)时才会回滚,Error 也会导致事务回滚,但是,在遇到检查型(Checked)异常时不会回滚。 +这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常(`RuntimeException` 的子类)时才会回滚,`Error` 也会导致事务回滚,但是,在遇到检查型(Checked)异常时不会回滚。 -![](./images/spring-transaction/f6c6f0aa-0f26-49e1-84b3-7f838c7379d1.png) +![](./images/spring-transaction/roollbackFor.png) 如果你想要回滚你定义的特定的异常类型的话,可以这样: @@ -564,15 +564,15 @@ public interface TransactionDefinition { @Transactional(rollbackFor= MyException.class) ``` -### 3.4. @Transactional 注解使用详解 +### @Transactional 注解使用详解 -#### 1) `@Transactional` 的作用范围 +#### `@Transactional` 的作用范围 1. **方法** :推荐将注解使用于方法上,不过需要注意的是:**该注解只能应用到 public 方法上,否则不生效。** 2. **类** :如果这个注解使用在类上的话,表明该注解对该类中所有的 public 方法都生效。 3. **接口** :不推荐在接口上使用。 -#### 2) `@Transactional` 的常用配置参数 +#### `@Transactional` 的常用配置参数 `@Transactional`注解源码如下,里面包含了基本事务属性的配置: @@ -610,15 +610,15 @@ public @interface Transactional { **`@Transactional` 的常用配置参数总结(只列出了 5 个我平时比较常用的):** -| 属性名 | 说明 | -| :---------- | :------------------------------------------------------------------------------------------- | -| propagation | 事务的传播行为,默认值为 REQUIRED,可选的值在上面介绍过 | -| isolation | 事务的隔离级别,默认值采用 DEFAULT,可选的值在上面介绍过 | +| 属性名 | 说明 | +| :---------- | :----------------------------------------------------------- | +| propagation | 事务的传播行为,默认值为 REQUIRED,可选的值在上面介绍过 | +| isolation | 事务的隔离级别,默认值采用 DEFAULT,可选的值在上面介绍过 | | timeout | 事务的超时时间,默认值为-1(不会超时)。如果超过该时间限制但事务还没有完成,则自动回滚事务。 | -| readOnly | 指定事务是否为只读事务,默认值为 false。 | -| rollbackFor | 用于指定能够触发事务回滚的异常类型,并且可以指定多个异常类型。 | +| readOnly | 指定事务是否为只读事务,默认值为 false。 | +| rollbackFor | 用于指定能够触发事务回滚的异常类型,并且可以指定多个异常类型。 | -#### 3)`@Transactional` 事务注解原理 +#### `@Transactional` 事务注解原理 面试中在问 AOP 的时候可能会被问到的一个问题。简单说下吧! @@ -654,7 +654,7 @@ public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { > `TransactionInterceptor` 类中的 `invoke()`方法内部实际调用的是 `TransactionAspectSupport` 类的 `invokeWithinTransaction()`方法。由于新版本的 Spring 对这部分重写很大,而且用到了很多响应式编程的知识,这里就不列源码了。 -#### 4) Spring AOP 自调用问题 +#### Spring AOP 自调用问题 若同一类中的其他没有 `@Transactional` 注解的方法内部调用有 `@Transactional` 注解的方法,有`@Transactional` 注解的方法的事务会失效。 @@ -679,28 +679,22 @@ private void method1() { 解决办法就是避免同一类中自调用或者使用 AspectJ 取代 Spring AOP 代理。 -#### 5) `@Transactional` 的使用注意事项总结 +#### `@Transactional` 的使用注意事项总结 -1. `@Transactional` 注解只有作用到 public 方法上事务才生效,不推荐在接口上使用; -2. 避免同一个类中调用 `@Transactional` 注解的方法,这样会导致事务失效; -3. 正确的设置 `@Transactional` 的 `rollbackFor` 和 `propagation` 属性,否则事务可能会回滚失败; -3. 被 `@Transactional` 注解的方法所在的类必须被 Spring 管理,否则不生效; -3. 底层使用的数据库必须支持事务机制,否则不生效; -4. ...... +- `@Transactional` 注解只有作用到 public 方法上事务才生效,不推荐在接口上使用; +- 避免同一个类中调用 `@Transactional` 注解的方法,这样会导致事务失效; +- 正确的设置 `@Transactional` 的 `rollbackFor` 和 `propagation` 属性,否则事务可能会回滚失败; +- 被 `@Transactional` 注解的方法所在的类必须被 Spring 管理,否则不生效; +- 底层使用的数据库必须支持事务机制,否则不生效; +- ...... -## 4. Reference +## 参考 -1. [总结]Spring 事务管理中@Transactional 的参数:[http://www.mobabel.net/spring 事务管理中 transactional 的参数/](http://www.mobabel.net/spring事务管理中transactional的参数/) - -2. Spring 官方文档:[https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html) - -3. 《Spring5 高级编程》 - -4. 透彻的掌握 Spring 中@transactional 的使用: [https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html](https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html) - -5. Spring 事务的传播特性:[https://github.com/love-somnus/Spring/wiki/Spring 事务的传播特性](https://github.com/love-somnus/Spring/wiki/Spring事务的传播特性) - -6. [Spring 事务传播行为详解](https://segmentfault.com/a/1190000013341344) :[https://segmentfault.com/a/1190000013341344](https://segmentfault.com/a/1190000013341344) - -7. 全面分析 Spring 的编程式事务管理及声明式事务管理:[https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/index.html](https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/index.html) +- [总结]Spring 事务管理中@Transactional 的参数:[http://www.mobabel.net/spring 事务管理中 transactional 的参数/](http://www.mobabel.net/spring事务管理中transactional的参数/) +- Spring 官方文档:[https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html) +- 《Spring5 高级编程》 +- 透彻的掌握 Spring 中@transactional 的使用: [https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html](https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html) +- Spring 事务的传播特性:[https://github.com/love-somnus/Spring/wiki/Spring 事务的传播特性](https://github.com/love-somnus/Spring/wiki/Spring事务的传播特性) +- [Spring 事务传播行为详解](https://segmentfault.com/a/1190000013341344) :[https://segmentfault.com/a/1190000013341344](https://segmentfault.com/a/1190000013341344) +- 全面分析 Spring 的编程式事务管理及声明式事务管理:[https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/index.html](https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/index.html) diff --git a/docs/system-design/system-design-questions.md b/docs/system-design/system-design-questions.md index 76c77f69..cdb4489c 100644 --- a/docs/system-design/system-design-questions.md +++ b/docs/system-design/system-design-questions.md @@ -7,17 +7,4 @@ category: Java面试指北 《Java 面试指北》的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。 -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/1&e=1648742399&token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD:HyfLWy5gNC5F_XukPYrlj_a4EJI=.png) - -我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) - -如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 - -星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) - -**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** - +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102536445.png) diff --git a/docs/tools/database/CHINER.md b/docs/tools/database/CHINER.md deleted file mode 100644 index eb8c4c0a..00000000 --- a/docs/tools/database/CHINER.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: CHINER:干掉 PowerDesigner,这个国产数据库建模工具很强! -category: 数据库 -tag: - - 开发工具 ---- - -大家好,我是 Guide! - -今天给小伙伴们分享一个我平时经常使用的国产数据库建模工具,非常好用! - -这个数据库建模工具的名字叫做 **CHINER** [kaɪˈnər] 。可能大部分小伙伴都没有听过这个工具,不过,相信大部分小伙伴应该都听说过 CHINER 的前身 **PDMan**。 - -CHINER 是 CHINESE Entity Relation 的缩写,翻译过来就是国产实体关系图工具,中文名称为:**元数建模**,也作:"**CHINER[元数建模]**"公开使用。 - -CHINER 对 PDMan 的架构设计进行了大幅改善,并对 PDMan 做到高度兼容。 - -CHINER 的界面简单,功能简洁,非常容易上手。并且,可以直接导入 PowerDesigner 文件、PDMan 文件,还可以直接从数据库或者 DDL 语句直接导入。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/c877cb96e03e4de8920dd22a79d6fba1.png) - -CHINER 的技术栈:React+Electron+Java 。 - -* Gitee 地址:https://gitee.com/robergroup/chiner 。 -* 操作手册: https://www.yuque.com/chiner/docs/manual 。 - -## 快速体验 - -### 下载安装 - -CHINER 提供了 **Windows** 、**Mac** 、**Linux** 下的一键安装包,我们直接下载即可。 - -> 下载地址:https://gitee.com/robergroup/chiner/releases - -需要注意的是:如果你当前使用的 Chrome 浏览器的话,无法直接点击链接下载。你可以更换浏览器下载或者右键链接选择链接存储为...。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/de3f014d52254bc3b181bd601fada431.png) - -打开软件之后,界面如下图所示。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20211016084319216.png) - -我这里以电商项目参考模板来演示 CHINER 的基本操作。 - -### 模块化管理 - -电商项目比较复杂,我们可以将其拆分为一个一个独立的模块(表分组),每个模块下有数据表,视图,关系图,数据字典。 - -像这个电商项目就创建了 3 个模块:消费端、商家端、平台端。 - -![](https://img-blog.csdnimg.cn/c23a46c0a32442e38962c1ec63a59ecc.png) - -不过,对于一些比较简单的项目比如博客系统、企业管理系统直接使用简单模式即可。 - -### 数据库表管理 - -右键数据表即可创建新的数据库表,点击指定的数据库表即可对指定的数据库表进行设计。 - -![](https://img-blog.csdnimg.cn/d106ad816e7f429b95a1050c8a8ee734.png) - -并且,数据表字段可以直接关联数据字典。 - -![](https://img-blog.csdnimg.cn/7dc3085aeded4cac8da6d22ee596101a.png) - -如果需要创建视图的话,直接右键视图即可。视图是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。 - -![](https://img-blog.csdnimg.cn/6983993063e743ef93a0ad13f39edb4a.png) - -数据库视图可以方便我们进行查询。不过,数据库视图会影响数据库性能,通常不建议使用。 - -### 关系图 - -我平时在项目中比较常见的 **ER 关联关系图** ,可以使用 CHINER 进行手动维护。 - -如果你需要添加新的数据库表到关系图的话,直接拖拽指定的数据库表到右边的关系图展示界面即可。另外,表与表之间的关联也需要你手动对相关联的字段进行连接。 - -![](https://img-blog.csdnimg.cn/7f7d0ae74e3f42068c9f084d1ff39af1.png) - -手动进行维护,说实话还是比较麻烦的,也比较容易出错。 - -像 [Navicat Data Modeler](https://www.navicat.com.cn/products/navicat-data-modeler) 在这方面就强多了,它可以自动生成 ER 图。 - -![](https://img-blog.csdnimg.cn/08740807c2d746a3ab44d939b79d4d8f.png) - -### 数据库表代码模板 - -支持直接生成对应表的 SQL 代码(支持 MySQL、Oracle、SQL Server、PostgreSQL 等数据库)并且还提供了 Java 和 C# 的 JavaBean。 - -![](https://img-blog.csdnimg.cn/ab758108b5e540f0bcff0a09f0513636.png) - -### 导出数据库表 - -你可以选择导出 DDL、Word 文档、数据字典 SQL、当前关系图的图片。 - -![](https://img-blog.csdnimg.cn/1497089d38a7416db1fd6da7c01b41ea.png) - -### 数据库逆向 - -你还可以连接数据库,逆向解析数据库。 - -![](https://img-blog.csdnimg.cn/e93ee1d31f0f4cf894e330eee1420b89.png) - -数据库连接成功之后,我们点击右上角的菜单 `导入—> 从数据库导入` 即可。 - -![](https://img-blog.csdnimg.cn/377f8aef4f4e4b17afda532362bdbeae.png) diff --git a/docs/tools/database/DBeaver.md b/docs/tools/database/DBeaver.md deleted file mode 100644 index a645907c..00000000 --- a/docs/tools/database/DBeaver.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: DBeaver:开源数据库管理工具 -category: 数据库 -tag: - - 开发工具 ---- - -# DBeaver:开源数据库管理工具。 - -[《再见,Navicat!同事安利的这个IDEA的兄弟,真香!》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247489523&idx=1&sn=4e96972842bdcea2e05cb267d17c5e8e&chksm=cea25838f9d5d12e45a9939370eccf2bff7177038e70437ea0e01d64030118852ee66ae72284&token=2000865596&lang=zh_CN#rd) 这篇文章发了之后很多人抱怨Datagrip 的占用内存太大,很多人推荐了 DBeaver 这款开源免费的数据库管理工具。于是,我昨夜简单体验了一下 DBeaver ,然后写了这篇文章。 - -## DBeaver 概览 - -DBeaver 是一个基于 Java 开发 ,并且支持几乎所有的数据库产品的开源数据库管理工具。 - -DBeaver 社区版不光支持关系型数据库比如MySQL、PostgreSQL、MariaDB、SQLite、Oracle、Db2、SQL Server,还比如 SQLite、H2这些内嵌数据库。还支持常见的全文搜索引擎比如 Elasticsearch 和 Solr、大数据相关的工具比如Hive和 Spark。 - -![DBeaver 支持的数据库概览](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/%E6%9C%AA%E5%91%BD%E5%90%8D%E6%8B%BC%E5%9B%BE.jpg) - -甚至说,DBeaver 的商业版本还支持各种 NoSQL 数据库。 - -![DBeaver 的商业版本还支持各种 NoSQL 数据库](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200803074546854.png) - -## 使用 - -**DBeaver 虽然小巧,但是功能还是十分强大的。基本的表设计、SQL执行、ER图、数据导入导出等等常用功能都不在话下。** - -**我下面只简单演示一下基本的数据库的创建以及表的创建。** - -### 下载安装 - -官方网提供的下载地址:https://dbeaver.io/download/ ,你可以根据自己的操作系统选择合适的版本进行下载安装。 - -比较简单,这里就不演示了。 - -### 连接数据库 - -**1.选择自己想要的连接的数据库,然后点击下一步即可(第一次连接可能需要下载相关驱动)。** - -我这里以MySQL为例。 - -![image-20200803082419586](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200803082419586.png) - -**2.输入数据库的地址、用户名和密码等信息,然后点击完成即可连接** - -点击完成之前,你可以先通过左下方的测试连接来看一下数据库是否可以被成功连接上。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200803082107033.png) - -### 新建数据库 - -右键-> 新建数据库(MySQL 用户记得使用 utf8mb4而不是 utf8) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812200954000.png) - -### 数据库表相关操作 - -#### 新建表 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812201130467.png) - -#### 新建列 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812203427352.png) - -#### 创建约束(主键、唯一键) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812202618448.png) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812204054048.png) - -#### 插入数据 - -我们通过 SQL 编辑器插入数据: - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812205208540.png) - -```java -INSERT into user(id,name,phone,password) values ('A00001','guide哥','181631312315','123456'); -INSERT into user(id,name,phone,password) values ('A00002','guide哥2','181631312313','123456'); -INSERT into user(id,name,phone,password) values ('A00003','guide哥3','181631312312','123456'); -``` - -## 总结 - -总的来说,简单体验之后感觉还是很不错的,占用内存也确实比 DataGrip 确实要小很多。 - -各位小伙伴可以自行体验一下。毕竟免费并且开源,还是很香的! - - - - diff --git a/docs/tools/database/DataGrip.md b/docs/tools/database/DataGrip.md deleted file mode 100644 index 2bdc0edf..00000000 --- a/docs/tools/database/DataGrip.md +++ /dev/null @@ -1,289 +0,0 @@ ---- -title: DataGrip:IDEA官方的这个数据库管理神器真香! -category: 数据库 -tag: - - 开发工具 ---- - -> Atzuge | https://www.cnblogs.com/zuge/p/7397255.html - -DataGrip 是由 JetBrains 公司(就是那个出品 Intellij IDEA 的公司,JetBrains出品,必属精品)推出的数据库管理软件。如果你不爱折腾的话,这家公司出品的很多 IDE 都是你的最佳选择,比如你进行 Python 开发的可以选择 JetBrains 全家桶中的 PyCharm 。 - -**DataGrip 支持几乎所有主流的关系数据库产品,如 DB2、Derby、H2、MySQL、Oracle、PostgreSQL、SQL Server、SQLite 及 Sybase 等,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。** - -我相信,当你第一眼看到 DataGrip 以后,会有一种惊艳的感觉,就好比你第一眼看到一个姑娘,就是那么一瞥,你对自己说,就是她了!废话不多说,来看看 DataGrip 的常用功能。 - -## 下载 - -DataGrip 下载链接如下 [https://www.jetbrains.com/datagrip/download](https://www.jetbrains.com/datagrip/download)。安装过程也很简单,双击安装,下一步,中间会让你选择主题,本人选择的是经典的 Darcula,安装完成后,启动,界面如下 - -![](http://dl2.iteye.com/upload/attachment/0119/1201/1a20c170-1d14-3f98-a418-4b951c6548c4.png) - -## 配置 Data Source - -相信使用过 IDEA 的同学看到这个界面都会感到很亲切。`File->DataSource` :配置数据源。 - -![](http://dl2.iteye.com/upload/attachment/0119/1203/d6311108-d7a2-3ece-9cd7-613dd27688cf.png) -DataGrip 支持主流的数据库。你也可以在 Database 视图中展开绿色的+号,添加数据库连接 - -![](http://dl2.iteye.com/upload/attachment/0119/1217/3298f379-102f-3dc7-ad30-20cfb5d6126d.jpg) -选择需要连接的数据库类型 - -![](http://dl2.iteye.com/upload/attachment/0119/1219/93e106e6-8e06-3eb5-b507-fe6ee88a2ac8.png) - -在面板中,左上部分列出了已经建立的数据库连接,点击各项,右侧会展示当前连接的配置信息,General 面板中,可以配置数据库连接的信息,如主机、用户名、密码等,不同数据库配置信息不完全相同,填入数据库 URL,注意,URL 后有个选项,可以选择直接填入 url,那么就不需要单独填主机名、端口等信息了。 - -Driver 部分显示数据库驱动信息,如果还没有下载过驱动,底部会有个警告,提示缺少驱动 - -![](http://dl2.iteye.com/upload/attachment/0119/1236/9879937b-3abf-300d-8b00-23a848f5db04.png) -点击 Driver 后的数据库类型,会跳转到驱动下载页面,点击 download,下载完会显示驱动包 - -![](http://dl2.iteye.com/upload/attachment/0119/1242/76cdb03e-b8a0-33dd-8dc3-3f2b5c5f5e57.png) - -![](http://dl2.iteye.com/upload/attachment/0119/1246/1496c2e6-e180-3fd4-bf4a-cab8a601ce59.png) -如果下载的驱动有问题,可以手动添加本地驱动包,在试用过程中,创建 Oracle 连接时,下载的驱动包就有问题,提示缺少 class,点击右侧绿色的+号,选择本地下载好的 jar 包,通过右侧上下箭头,将导入的 jar 包移到最上位置就 OK 了 - -![](http://dl2.iteye.com/upload/attachment/0119/1248/1684afeb-e45e-328a-aeab-44ced763b1f9.png) - -点击 Test Connection,查看配置是否正确,接下来就可以使用了。 - -## 常用设置 - -打开 DataGrip,选择 `File->Settings`,当前面板显示了常用设置项 - -![](http://dl2.iteye.com/upload/attachment/0119/1252/e074472a-ee46-317d-a18b-63e6c251f919.png) -基本上默认设置就足够了,要更改设置也很简单,左侧菜单已经分类好了,第一项是数据库相关的配置,第二项是配置外观的,在这里可以修改主题,key map 修改快捷键,editor 配置编辑器相关设置,在这里可以修改编辑器字体,展开 edit 项: `Editor->Color & Fonts->Font` - -![](http://dl2.iteye.com/upload/attachment/0119/1256/080b78d6-c01b-346b-adb7-840b792372f8.png) -需要将当前主题保存一下,点击 save as,起个名,选择重命名后的主题就能修改了,这里我选择习惯的 Conurier New 字体,大小为 14 号,点击右下角的 apply,点击 OK - -![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0119/1258/c0d34593-f845-3e44-ba9b-7ba9fcdd8183.png) - -其他的没啥好设置的了。 - -## 数据库常用操作 - -接下来,我们来使用 DataGrip 完成数据库的常用操作,包括查询数据、修改数据,创建数据库、表等。 - -![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0119/1263/6b0ffcc8-5829-326c-815b-80a476e19c2c.png) -左上区域显示了当前数据库连接,展开后会显示数据库表等信息,如果展开后没有任何信息,需要选中数据库连接,点击上面的旋转图标同步一下,下方有个 More Schema 选项,点击可以切换不同的 schema。 - -### sql 语句编写 - -右键选中的数据库连接,选择 open console,就可以在右侧的控制台中书写 sql 语句了。 - -![img](http://dl2.iteye.com/upload/attachment/0119/1265/f2fc1c17-288a-3991-887b-716f59f8dab5.png) - -**DataGrip 的智能提示非常爽,无论是标准的 sql 关键字,还是表名、字段名,甚至数据库特定的字段,都能提示,不得不感叹这智能提示太强大了,Intellij IDEA 的智能提示也是秒杀 eclipse。** - -写完 sql 语句后,可以选中,电子左上侧绿色箭头执行 - -![](http://dl2.iteye.com/upload/attachment/0119/1273/bebf5996-5c3e-37a8-8065-33243f8a5265.png) -也可以使用快捷键 `Ctrl+Enter`,选中情况下,会直接执行该 sql,未选中情况下,如果控制台中有多条 sql,会提示你要执行哪条 sql。 - -之前习惯了 dbvisualizer 中的操作,dbvisualizer 中光标停留在当前 sql 上(sql 以分号结尾),按下`Ctrl+.`快捷键会自动执行当前 sql,其实 DataGrip 也能设置,在 `setting->Database-General`中 - -![](http://dl2.iteye.com/upload/attachment/0119/1283/b4c05671-600a-3305-af48-3112ef44bf17.png) -语句执行时默认是提示,改成 smallest statement 后,光标停留在当前语句时,按下 Ctrl+Enter 就会直接执行当前语句。 - -语句的执行结果在底部显示 - -![](http://dl2.iteye.com/upload/attachment/0119/1291/e6fc6a18-da4d-32b6-8c8e-670248b372b5.png) -如果某列的宽度太窄,可以鼠标点击该列的任意一个,使用快捷键`Ctrl+Shift+左右箭头`可以调整宽度,如果要调整所有列的宽度,可以点击左上角红框部分,选择所有行,使用快捷键`Ctrl+Shift+左右箭头调整` - -### 修改数据 - -添加行、删除行也很方便,上部的+、-按钮能直接添加行或删除选中的行,编辑列同样也很方便,双击要修改的列,输入修改后的值,鼠标在其他部分点击就完成修改了 - -![](http://dl2.iteye.com/upload/attachment/0119/1295/0bc1c527-2d48-369b-bcf5-acada66255b9.png) -有的时候我们要把某个字段置为 null,不是空字符串"",DataGrip 也提供了渐变的操作,直接在列上右键,选择 set null - -![](http://dl2.iteye.com/upload/attachment/0119/1297/6fc97e37-fb7f-3c01-a146-c9fba9e7cfa3.png) -对于需要多窗口查看结果的,即希望查询结果在新的 tab 中展示,可以点击 pin tab 按钮,那新查询将不会再当前 tab 中展示,而是新打开一个 tab - -![](http://dl2.iteye.com/upload/attachment/0119/1301/3eb0023a-740b-3f80-8014-464d885d7dbc.png) - -旁边的 output 控制台显示了执行 sql 的日志信息,能看到 sql 执行的时间等信息 - -![](http://dl2.iteye.com/upload/attachment/0119/1299/83fa531c-91b4-3a02-b02f-296195f51058.png) -我就问这么吊的工具,还有谁!!! - -### 新建表 - -要新建表也是相当简单、智能,选中数据库连接,点击绿色+号下选择 table - -![](http://dl2.iteye.com/upload/attachment/0119/1303/25102ef8-ac5b-303b-9c06-ee4308ffac9e.png) -在新打开的窗口中,可以填写表信息 - -![](http://dl2.iteye.com/upload/attachment/0119/1306/f00179e9-0fe9-351d-9455-66537440f5cc.png) -我就问你看到这个窗口兴奋不兴奋!!! - -顶部可以填写表名、表注释,中间可以点击右侧绿色+号添加列,列类型 type 也是能自动补全,default 右侧的消息框图标点击后能对列添加注释,旁边的几个 tab 可以设置索引及外键 - -所有这些操作的 DDL 都会直接在底部显示 - -![](http://dl2.iteye.com/upload/attachment/0119/1310/32c24402-023f-3cad-a2dd-c8a42ace32d1.png) -我就问你怕不怕 - -表建完后,可以点击下图中的 table 图标,打开表查看视图 - -![](http://dl2.iteye.com/upload/attachment/0119/1312/9894cfcf-48b6-382d-ab2e-57e6be6a2a5f.png) -可以查看表的数据,也能查看 DDL 语句 - -### 数据库导出 - -这些基本功能的设计、体验,已经惊艳到我了,接下来就是数据的导出。 - -DataGrip 的导出功能也是相当强大 - -选择需要导出数据的表,右键,Dump Data To File - -![](http://dl2.iteye.com/upload/attachment/0119/1315/6520ee08-7ef1-3463-be63-9e8c96861df5.png) -即可以导出 insert、update 形式的 sql 语句,也能导出为 html、csv、json 格式的数据 - -也可以在查询结果视图中导出 - -![](http://dl2.iteye.com/upload/attachment/0119/1317/354a6ef4-9ea4-3a32-bc1e-53e02c7f0231.png) -点击右上角下载图标,在弹出窗口中可以选择不同的导出方式,如 sql insert、sql update、csv 格式等 - -![](http://dl2.iteye.com/upload/attachment/0119/1319/3a9da4d9-0b91-3dc6-b3c1-176b8eaea63b.png) - -如果是导出到 csv 格式,还能控制导出的格式 - -![](http://dl2.iteye.com/upload/attachment/0119/1321/2893f834-9098-322f-8253-5741ab6893cb.png) - -导出后用 excel 打开是这种结果 - -![](http://dl2.iteye.com/upload/attachment/0119/1323/5b5956d0-6cad-3c06-83f4-1a715fa94654.png) -除了能导出数据外,还能导入数据 - -选择表,右键->Import from File,选择要导入的文件 - -![](http://dl2.iteye.com/upload/attachment/0119/1325/6926c5c8-be4d-3ebc-b8cb-9737e6838ed3.png) -注意,导出的时候如果勾选了左侧的两个 header 选项,导入的时候如果有 header,也要勾选,不然会提示列个数不匹配 - -## 小技巧 - -### 导航+全局搜索 - -#### 关键字导航 - -当在 datagrip 的文本编辑区域编写 sql 时,按住键盘 Ctrl 键不放,同时鼠标移动到 sql 关键字上,比如表名、字段名称、或者是函数名上,鼠标会变成手型,关键字会变蓝,并加了下划线,点击,会自动定位到左侧对象树,并选中点击的对象 - -![](http://dl2.iteye.com/upload/attachment/0121/5964/c29da366-7d43-3aa0-9bce-042285f8771e.png) - -#### 快速导航到指定的表、视图、函数等 - -在 datagrip 中,使用 Ctrl+N 快捷键,弹出一个搜索框,输入需要导航的名称,回车即可 - -![](http://dl2.iteye.com/upload/attachment/0121/5966/d9ca4280-67a1-3d26-b2aa-796b70cf3e95.png) - -#### 全局搜索 - -连续两次按下 shift 键,或者鼠标点击右上角的搜索图标,弹出搜索框,搜索任何你想搜索的东西 - -![](http://dl2.iteye.com/upload/attachment/0121/5970/d6bfaa7f-0713-3938-8efc-6c86f354c05e.png) - -#### 结果集搜索 - -在查询结果集视图区域点击鼠标,按下 Ctrl+F 快捷键,弹出搜索框,输入搜索内容,支持正则表达式、过滤结果 - -![](http://dl2.iteye.com/upload/attachment/0121/5978/7c84cc4f-2337-3767-9a06-4db2747fde40.png) - -#### 导航到关联数据 - -表之间会有外检关联,查询的时候,能直接定位到关联数据,或者被关联数据,例如 user1 表有个外检字段 classroom 指向 classroom 表的主键 id,在查询 classroom 表数据的时候,可以在 id 字段上右键,go to,referencing data - -![](http://dl2.iteye.com/upload/attachment/0121/5982/a9dc35f0-12a9-3bfe-aa68-c5396d628253.png) -选择要显示第一条数据还是显示所有数据 - -![](http://dl2.iteye.com/upload/attachment/0121/5984/421da02c-cd94-33cc-9fbc-cd854991090c.png) -会自动打开关联表的数据 - -![](http://dl2.iteye.com/upload/attachment/0121/5986/fcde71af-c071-38d2-affd-d08dab7483d5.png) -相反,查询字表的数据时,也能自动定位到父表 - -### 数据转换 - -#### 结果集数据过滤 - -对于使用 table edit(对象树中选中表,右键->table editor)打开的结果集,可以使用条件继续过滤结果集,如下图所示,可以在结果集左上角输入款中输入 where 条件过滤 - -![](http://dl2.iteye.com/upload/attachment/0121/5994/bbbb92b4-0e49-33cf-8448-cf59e1992986.png) -也可以对着需要过滤数据的列右键,filter by 过滤 - -![](http://dl2.iteye.com/upload/attachment/0121/5990/84a2bcc7-8722-311e-8b30-0a75618281a6.png) - -#### 行转列 - -对于字段比较多的表,查看数据要左右推动,可以切换成列显示,在结果集视图区域使用 Ctrl+Q 快捷键 - -![](http://dl2.iteye.com/upload/attachment/0121/5992/4a242dd4-c1e4-3b6f-9204-1468e767906a.png) - -#### 变量重命名 - -鼠标点击需要重命名的变量,按下 Shift+F6 快捷键,弹出重命名对话框,输入新的名称 - -![](http://dl2.iteye.com/upload/attachment/0121/5996/2587d544-9641-3635-a987-2755bac6a760.png) - -#### 自动检测无法解析的对象 - -如果表名、字段名不存在,datagrip 会自动提示,此时对着有问题的表名或字段名,按下 Alt+Enter,会自动提示是否创建表或添加字段 - -![](http://dl2.iteye.com/upload/attachment/0121/5998/bb21ae31-209d-3f44-9604-fbf78209e926.png) - -#### 权限定字段名 - -对于查询使用表别名的,而字段中没有使用别名前缀的,datagrip 能自动添加前缀,鼠标停留在需要添加别名前缀的字段上,使用 Alt+Enter 快捷键 - -![](http://dl2.iteye.com/upload/attachment/0121/6000/38babb30-fcef-3db6-9b06-efb040f3ee12.png) - -### 格式化 - -#### \*通配符自动展开 - -查询的时候我们会使用 select *查询所有列,这是不好的习惯,datagrip 能快速展开列,光标定位到*后面,按下 Alt+Enter 快捷键 - -![](http://dl2.iteye.com/upload/attachment/0121/6002/a1b9a749-c223-3197-a073-2f4fc15f30f9.png) - -#### 大写自动转换 - -sql 使用大写形式是个好的习惯,如果使用了小写,可以将光标停留在需要转换的字段或表名上,使用 Ctrl+shift+U 快捷键自动转换 - -#### sql 格式化 - -选中需要格式化的 sql 代码,使用 Ctrl+Alt+L 快捷键 - -datagrip 提供了一个功能强大的编辑器,实现了 notepad++的列编辑模式 - -### 列编辑 - -#### 多光标模式 - -在编辑 sql 的时候,可能需要同时输入或同时删除一些字符,按下 alt+shift,同时鼠标在不同的位置点击,会出现多个光标 - -![](http://dl2.iteye.com/upload/attachment/0121/6004/cf942465-18ba-3d0a-92c0-2fef52635990.png) - -#### 代码注释 - -选中要注释的代码,按下 Ctrl+/或 Ctrl+shift+/快捷键,能注释代码,或取消注释 - -![](http://dl2.iteye.com/upload/attachment/0121/6006/daa4c7e7-548a-3b46-a787-e335d001aa1a.png) - -#### 列编辑 - -按住键盘 Alt 键,同时按下鼠标左键拖动,能选择多列,拷贝黏贴等操作 - -![](http://dl2.iteye.com/upload/attachment/0121/6008/4fd42813-8602-3520-8d63-446c22e942de.png) - -### 历史记录 - -#### 代码历史 - -在文本编辑器中,邮件,local history,show history,可以查看使用过的 sql 历史 - -![](http://dl2.iteye.com/upload/attachment/0121/6010/cc243a75-f7ef-366b-b184-f5635855d9f6.png) - -#### 命令历史 - -![](http://dl2.iteye.com/upload/attachment/0121/6012/cf962c1c-0dfe-3241-b137-fef4eac9f1f0.png) diff --git a/docs/tools/database/chiner.md b/docs/tools/database/chiner.md deleted file mode 100644 index eb8c4c0a..00000000 --- a/docs/tools/database/chiner.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: CHINER:干掉 PowerDesigner,这个国产数据库建模工具很强! -category: 数据库 -tag: - - 开发工具 ---- - -大家好,我是 Guide! - -今天给小伙伴们分享一个我平时经常使用的国产数据库建模工具,非常好用! - -这个数据库建模工具的名字叫做 **CHINER** [kaɪˈnər] 。可能大部分小伙伴都没有听过这个工具,不过,相信大部分小伙伴应该都听说过 CHINER 的前身 **PDMan**。 - -CHINER 是 CHINESE Entity Relation 的缩写,翻译过来就是国产实体关系图工具,中文名称为:**元数建模**,也作:"**CHINER[元数建模]**"公开使用。 - -CHINER 对 PDMan 的架构设计进行了大幅改善,并对 PDMan 做到高度兼容。 - -CHINER 的界面简单,功能简洁,非常容易上手。并且,可以直接导入 PowerDesigner 文件、PDMan 文件,还可以直接从数据库或者 DDL 语句直接导入。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/c877cb96e03e4de8920dd22a79d6fba1.png) - -CHINER 的技术栈:React+Electron+Java 。 - -* Gitee 地址:https://gitee.com/robergroup/chiner 。 -* 操作手册: https://www.yuque.com/chiner/docs/manual 。 - -## 快速体验 - -### 下载安装 - -CHINER 提供了 **Windows** 、**Mac** 、**Linux** 下的一键安装包,我们直接下载即可。 - -> 下载地址:https://gitee.com/robergroup/chiner/releases - -需要注意的是:如果你当前使用的 Chrome 浏览器的话,无法直接点击链接下载。你可以更换浏览器下载或者右键链接选择链接存储为...。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/de3f014d52254bc3b181bd601fada431.png) - -打开软件之后,界面如下图所示。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20211016084319216.png) - -我这里以电商项目参考模板来演示 CHINER 的基本操作。 - -### 模块化管理 - -电商项目比较复杂,我们可以将其拆分为一个一个独立的模块(表分组),每个模块下有数据表,视图,关系图,数据字典。 - -像这个电商项目就创建了 3 个模块:消费端、商家端、平台端。 - -![](https://img-blog.csdnimg.cn/c23a46c0a32442e38962c1ec63a59ecc.png) - -不过,对于一些比较简单的项目比如博客系统、企业管理系统直接使用简单模式即可。 - -### 数据库表管理 - -右键数据表即可创建新的数据库表,点击指定的数据库表即可对指定的数据库表进行设计。 - -![](https://img-blog.csdnimg.cn/d106ad816e7f429b95a1050c8a8ee734.png) - -并且,数据表字段可以直接关联数据字典。 - -![](https://img-blog.csdnimg.cn/7dc3085aeded4cac8da6d22ee596101a.png) - -如果需要创建视图的话,直接右键视图即可。视图是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。 - -![](https://img-blog.csdnimg.cn/6983993063e743ef93a0ad13f39edb4a.png) - -数据库视图可以方便我们进行查询。不过,数据库视图会影响数据库性能,通常不建议使用。 - -### 关系图 - -我平时在项目中比较常见的 **ER 关联关系图** ,可以使用 CHINER 进行手动维护。 - -如果你需要添加新的数据库表到关系图的话,直接拖拽指定的数据库表到右边的关系图展示界面即可。另外,表与表之间的关联也需要你手动对相关联的字段进行连接。 - -![](https://img-blog.csdnimg.cn/7f7d0ae74e3f42068c9f084d1ff39af1.png) - -手动进行维护,说实话还是比较麻烦的,也比较容易出错。 - -像 [Navicat Data Modeler](https://www.navicat.com.cn/products/navicat-data-modeler) 在这方面就强多了,它可以自动生成 ER 图。 - -![](https://img-blog.csdnimg.cn/08740807c2d746a3ab44d939b79d4d8f.png) - -### 数据库表代码模板 - -支持直接生成对应表的 SQL 代码(支持 MySQL、Oracle、SQL Server、PostgreSQL 等数据库)并且还提供了 Java 和 C# 的 JavaBean。 - -![](https://img-blog.csdnimg.cn/ab758108b5e540f0bcff0a09f0513636.png) - -### 导出数据库表 - -你可以选择导出 DDL、Word 文档、数据字典 SQL、当前关系图的图片。 - -![](https://img-blog.csdnimg.cn/1497089d38a7416db1fd6da7c01b41ea.png) - -### 数据库逆向 - -你还可以连接数据库,逆向解析数据库。 - -![](https://img-blog.csdnimg.cn/e93ee1d31f0f4cf894e330eee1420b89.png) - -数据库连接成功之后,我们点击右上角的菜单 `导入—> 从数据库导入` 即可。 - -![](https://img-blog.csdnimg.cn/377f8aef4f4e4b17afda532362bdbeae.png) diff --git a/docs/tools/database/datagrip.md b/docs/tools/database/datagrip.md deleted file mode 100644 index 2bdc0edf..00000000 --- a/docs/tools/database/datagrip.md +++ /dev/null @@ -1,289 +0,0 @@ ---- -title: DataGrip:IDEA官方的这个数据库管理神器真香! -category: 数据库 -tag: - - 开发工具 ---- - -> Atzuge | https://www.cnblogs.com/zuge/p/7397255.html - -DataGrip 是由 JetBrains 公司(就是那个出品 Intellij IDEA 的公司,JetBrains出品,必属精品)推出的数据库管理软件。如果你不爱折腾的话,这家公司出品的很多 IDE 都是你的最佳选择,比如你进行 Python 开发的可以选择 JetBrains 全家桶中的 PyCharm 。 - -**DataGrip 支持几乎所有主流的关系数据库产品,如 DB2、Derby、H2、MySQL、Oracle、PostgreSQL、SQL Server、SQLite 及 Sybase 等,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。** - -我相信,当你第一眼看到 DataGrip 以后,会有一种惊艳的感觉,就好比你第一眼看到一个姑娘,就是那么一瞥,你对自己说,就是她了!废话不多说,来看看 DataGrip 的常用功能。 - -## 下载 - -DataGrip 下载链接如下 [https://www.jetbrains.com/datagrip/download](https://www.jetbrains.com/datagrip/download)。安装过程也很简单,双击安装,下一步,中间会让你选择主题,本人选择的是经典的 Darcula,安装完成后,启动,界面如下 - -![](http://dl2.iteye.com/upload/attachment/0119/1201/1a20c170-1d14-3f98-a418-4b951c6548c4.png) - -## 配置 Data Source - -相信使用过 IDEA 的同学看到这个界面都会感到很亲切。`File->DataSource` :配置数据源。 - -![](http://dl2.iteye.com/upload/attachment/0119/1203/d6311108-d7a2-3ece-9cd7-613dd27688cf.png) -DataGrip 支持主流的数据库。你也可以在 Database 视图中展开绿色的+号,添加数据库连接 - -![](http://dl2.iteye.com/upload/attachment/0119/1217/3298f379-102f-3dc7-ad30-20cfb5d6126d.jpg) -选择需要连接的数据库类型 - -![](http://dl2.iteye.com/upload/attachment/0119/1219/93e106e6-8e06-3eb5-b507-fe6ee88a2ac8.png) - -在面板中,左上部分列出了已经建立的数据库连接,点击各项,右侧会展示当前连接的配置信息,General 面板中,可以配置数据库连接的信息,如主机、用户名、密码等,不同数据库配置信息不完全相同,填入数据库 URL,注意,URL 后有个选项,可以选择直接填入 url,那么就不需要单独填主机名、端口等信息了。 - -Driver 部分显示数据库驱动信息,如果还没有下载过驱动,底部会有个警告,提示缺少驱动 - -![](http://dl2.iteye.com/upload/attachment/0119/1236/9879937b-3abf-300d-8b00-23a848f5db04.png) -点击 Driver 后的数据库类型,会跳转到驱动下载页面,点击 download,下载完会显示驱动包 - -![](http://dl2.iteye.com/upload/attachment/0119/1242/76cdb03e-b8a0-33dd-8dc3-3f2b5c5f5e57.png) - -![](http://dl2.iteye.com/upload/attachment/0119/1246/1496c2e6-e180-3fd4-bf4a-cab8a601ce59.png) -如果下载的驱动有问题,可以手动添加本地驱动包,在试用过程中,创建 Oracle 连接时,下载的驱动包就有问题,提示缺少 class,点击右侧绿色的+号,选择本地下载好的 jar 包,通过右侧上下箭头,将导入的 jar 包移到最上位置就 OK 了 - -![](http://dl2.iteye.com/upload/attachment/0119/1248/1684afeb-e45e-328a-aeab-44ced763b1f9.png) - -点击 Test Connection,查看配置是否正确,接下来就可以使用了。 - -## 常用设置 - -打开 DataGrip,选择 `File->Settings`,当前面板显示了常用设置项 - -![](http://dl2.iteye.com/upload/attachment/0119/1252/e074472a-ee46-317d-a18b-63e6c251f919.png) -基本上默认设置就足够了,要更改设置也很简单,左侧菜单已经分类好了,第一项是数据库相关的配置,第二项是配置外观的,在这里可以修改主题,key map 修改快捷键,editor 配置编辑器相关设置,在这里可以修改编辑器字体,展开 edit 项: `Editor->Color & Fonts->Font` - -![](http://dl2.iteye.com/upload/attachment/0119/1256/080b78d6-c01b-346b-adb7-840b792372f8.png) -需要将当前主题保存一下,点击 save as,起个名,选择重命名后的主题就能修改了,这里我选择习惯的 Conurier New 字体,大小为 14 号,点击右下角的 apply,点击 OK - -![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0119/1258/c0d34593-f845-3e44-ba9b-7ba9fcdd8183.png) - -其他的没啥好设置的了。 - -## 数据库常用操作 - -接下来,我们来使用 DataGrip 完成数据库的常用操作,包括查询数据、修改数据,创建数据库、表等。 - -![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0119/1263/6b0ffcc8-5829-326c-815b-80a476e19c2c.png) -左上区域显示了当前数据库连接,展开后会显示数据库表等信息,如果展开后没有任何信息,需要选中数据库连接,点击上面的旋转图标同步一下,下方有个 More Schema 选项,点击可以切换不同的 schema。 - -### sql 语句编写 - -右键选中的数据库连接,选择 open console,就可以在右侧的控制台中书写 sql 语句了。 - -![img](http://dl2.iteye.com/upload/attachment/0119/1265/f2fc1c17-288a-3991-887b-716f59f8dab5.png) - -**DataGrip 的智能提示非常爽,无论是标准的 sql 关键字,还是表名、字段名,甚至数据库特定的字段,都能提示,不得不感叹这智能提示太强大了,Intellij IDEA 的智能提示也是秒杀 eclipse。** - -写完 sql 语句后,可以选中,电子左上侧绿色箭头执行 - -![](http://dl2.iteye.com/upload/attachment/0119/1273/bebf5996-5c3e-37a8-8065-33243f8a5265.png) -也可以使用快捷键 `Ctrl+Enter`,选中情况下,会直接执行该 sql,未选中情况下,如果控制台中有多条 sql,会提示你要执行哪条 sql。 - -之前习惯了 dbvisualizer 中的操作,dbvisualizer 中光标停留在当前 sql 上(sql 以分号结尾),按下`Ctrl+.`快捷键会自动执行当前 sql,其实 DataGrip 也能设置,在 `setting->Database-General`中 - -![](http://dl2.iteye.com/upload/attachment/0119/1283/b4c05671-600a-3305-af48-3112ef44bf17.png) -语句执行时默认是提示,改成 smallest statement 后,光标停留在当前语句时,按下 Ctrl+Enter 就会直接执行当前语句。 - -语句的执行结果在底部显示 - -![](http://dl2.iteye.com/upload/attachment/0119/1291/e6fc6a18-da4d-32b6-8c8e-670248b372b5.png) -如果某列的宽度太窄,可以鼠标点击该列的任意一个,使用快捷键`Ctrl+Shift+左右箭头`可以调整宽度,如果要调整所有列的宽度,可以点击左上角红框部分,选择所有行,使用快捷键`Ctrl+Shift+左右箭头调整` - -### 修改数据 - -添加行、删除行也很方便,上部的+、-按钮能直接添加行或删除选中的行,编辑列同样也很方便,双击要修改的列,输入修改后的值,鼠标在其他部分点击就完成修改了 - -![](http://dl2.iteye.com/upload/attachment/0119/1295/0bc1c527-2d48-369b-bcf5-acada66255b9.png) -有的时候我们要把某个字段置为 null,不是空字符串"",DataGrip 也提供了渐变的操作,直接在列上右键,选择 set null - -![](http://dl2.iteye.com/upload/attachment/0119/1297/6fc97e37-fb7f-3c01-a146-c9fba9e7cfa3.png) -对于需要多窗口查看结果的,即希望查询结果在新的 tab 中展示,可以点击 pin tab 按钮,那新查询将不会再当前 tab 中展示,而是新打开一个 tab - -![](http://dl2.iteye.com/upload/attachment/0119/1301/3eb0023a-740b-3f80-8014-464d885d7dbc.png) - -旁边的 output 控制台显示了执行 sql 的日志信息,能看到 sql 执行的时间等信息 - -![](http://dl2.iteye.com/upload/attachment/0119/1299/83fa531c-91b4-3a02-b02f-296195f51058.png) -我就问这么吊的工具,还有谁!!! - -### 新建表 - -要新建表也是相当简单、智能,选中数据库连接,点击绿色+号下选择 table - -![](http://dl2.iteye.com/upload/attachment/0119/1303/25102ef8-ac5b-303b-9c06-ee4308ffac9e.png) -在新打开的窗口中,可以填写表信息 - -![](http://dl2.iteye.com/upload/attachment/0119/1306/f00179e9-0fe9-351d-9455-66537440f5cc.png) -我就问你看到这个窗口兴奋不兴奋!!! - -顶部可以填写表名、表注释,中间可以点击右侧绿色+号添加列,列类型 type 也是能自动补全,default 右侧的消息框图标点击后能对列添加注释,旁边的几个 tab 可以设置索引及外键 - -所有这些操作的 DDL 都会直接在底部显示 - -![](http://dl2.iteye.com/upload/attachment/0119/1310/32c24402-023f-3cad-a2dd-c8a42ace32d1.png) -我就问你怕不怕 - -表建完后,可以点击下图中的 table 图标,打开表查看视图 - -![](http://dl2.iteye.com/upload/attachment/0119/1312/9894cfcf-48b6-382d-ab2e-57e6be6a2a5f.png) -可以查看表的数据,也能查看 DDL 语句 - -### 数据库导出 - -这些基本功能的设计、体验,已经惊艳到我了,接下来就是数据的导出。 - -DataGrip 的导出功能也是相当强大 - -选择需要导出数据的表,右键,Dump Data To File - -![](http://dl2.iteye.com/upload/attachment/0119/1315/6520ee08-7ef1-3463-be63-9e8c96861df5.png) -即可以导出 insert、update 形式的 sql 语句,也能导出为 html、csv、json 格式的数据 - -也可以在查询结果视图中导出 - -![](http://dl2.iteye.com/upload/attachment/0119/1317/354a6ef4-9ea4-3a32-bc1e-53e02c7f0231.png) -点击右上角下载图标,在弹出窗口中可以选择不同的导出方式,如 sql insert、sql update、csv 格式等 - -![](http://dl2.iteye.com/upload/attachment/0119/1319/3a9da4d9-0b91-3dc6-b3c1-176b8eaea63b.png) - -如果是导出到 csv 格式,还能控制导出的格式 - -![](http://dl2.iteye.com/upload/attachment/0119/1321/2893f834-9098-322f-8253-5741ab6893cb.png) - -导出后用 excel 打开是这种结果 - -![](http://dl2.iteye.com/upload/attachment/0119/1323/5b5956d0-6cad-3c06-83f4-1a715fa94654.png) -除了能导出数据外,还能导入数据 - -选择表,右键->Import from File,选择要导入的文件 - -![](http://dl2.iteye.com/upload/attachment/0119/1325/6926c5c8-be4d-3ebc-b8cb-9737e6838ed3.png) -注意,导出的时候如果勾选了左侧的两个 header 选项,导入的时候如果有 header,也要勾选,不然会提示列个数不匹配 - -## 小技巧 - -### 导航+全局搜索 - -#### 关键字导航 - -当在 datagrip 的文本编辑区域编写 sql 时,按住键盘 Ctrl 键不放,同时鼠标移动到 sql 关键字上,比如表名、字段名称、或者是函数名上,鼠标会变成手型,关键字会变蓝,并加了下划线,点击,会自动定位到左侧对象树,并选中点击的对象 - -![](http://dl2.iteye.com/upload/attachment/0121/5964/c29da366-7d43-3aa0-9bce-042285f8771e.png) - -#### 快速导航到指定的表、视图、函数等 - -在 datagrip 中,使用 Ctrl+N 快捷键,弹出一个搜索框,输入需要导航的名称,回车即可 - -![](http://dl2.iteye.com/upload/attachment/0121/5966/d9ca4280-67a1-3d26-b2aa-796b70cf3e95.png) - -#### 全局搜索 - -连续两次按下 shift 键,或者鼠标点击右上角的搜索图标,弹出搜索框,搜索任何你想搜索的东西 - -![](http://dl2.iteye.com/upload/attachment/0121/5970/d6bfaa7f-0713-3938-8efc-6c86f354c05e.png) - -#### 结果集搜索 - -在查询结果集视图区域点击鼠标,按下 Ctrl+F 快捷键,弹出搜索框,输入搜索内容,支持正则表达式、过滤结果 - -![](http://dl2.iteye.com/upload/attachment/0121/5978/7c84cc4f-2337-3767-9a06-4db2747fde40.png) - -#### 导航到关联数据 - -表之间会有外检关联,查询的时候,能直接定位到关联数据,或者被关联数据,例如 user1 表有个外检字段 classroom 指向 classroom 表的主键 id,在查询 classroom 表数据的时候,可以在 id 字段上右键,go to,referencing data - -![](http://dl2.iteye.com/upload/attachment/0121/5982/a9dc35f0-12a9-3bfe-aa68-c5396d628253.png) -选择要显示第一条数据还是显示所有数据 - -![](http://dl2.iteye.com/upload/attachment/0121/5984/421da02c-cd94-33cc-9fbc-cd854991090c.png) -会自动打开关联表的数据 - -![](http://dl2.iteye.com/upload/attachment/0121/5986/fcde71af-c071-38d2-affd-d08dab7483d5.png) -相反,查询字表的数据时,也能自动定位到父表 - -### 数据转换 - -#### 结果集数据过滤 - -对于使用 table edit(对象树中选中表,右键->table editor)打开的结果集,可以使用条件继续过滤结果集,如下图所示,可以在结果集左上角输入款中输入 where 条件过滤 - -![](http://dl2.iteye.com/upload/attachment/0121/5994/bbbb92b4-0e49-33cf-8448-cf59e1992986.png) -也可以对着需要过滤数据的列右键,filter by 过滤 - -![](http://dl2.iteye.com/upload/attachment/0121/5990/84a2bcc7-8722-311e-8b30-0a75618281a6.png) - -#### 行转列 - -对于字段比较多的表,查看数据要左右推动,可以切换成列显示,在结果集视图区域使用 Ctrl+Q 快捷键 - -![](http://dl2.iteye.com/upload/attachment/0121/5992/4a242dd4-c1e4-3b6f-9204-1468e767906a.png) - -#### 变量重命名 - -鼠标点击需要重命名的变量,按下 Shift+F6 快捷键,弹出重命名对话框,输入新的名称 - -![](http://dl2.iteye.com/upload/attachment/0121/5996/2587d544-9641-3635-a987-2755bac6a760.png) - -#### 自动检测无法解析的对象 - -如果表名、字段名不存在,datagrip 会自动提示,此时对着有问题的表名或字段名,按下 Alt+Enter,会自动提示是否创建表或添加字段 - -![](http://dl2.iteye.com/upload/attachment/0121/5998/bb21ae31-209d-3f44-9604-fbf78209e926.png) - -#### 权限定字段名 - -对于查询使用表别名的,而字段中没有使用别名前缀的,datagrip 能自动添加前缀,鼠标停留在需要添加别名前缀的字段上,使用 Alt+Enter 快捷键 - -![](http://dl2.iteye.com/upload/attachment/0121/6000/38babb30-fcef-3db6-9b06-efb040f3ee12.png) - -### 格式化 - -#### \*通配符自动展开 - -查询的时候我们会使用 select *查询所有列,这是不好的习惯,datagrip 能快速展开列,光标定位到*后面,按下 Alt+Enter 快捷键 - -![](http://dl2.iteye.com/upload/attachment/0121/6002/a1b9a749-c223-3197-a073-2f4fc15f30f9.png) - -#### 大写自动转换 - -sql 使用大写形式是个好的习惯,如果使用了小写,可以将光标停留在需要转换的字段或表名上,使用 Ctrl+shift+U 快捷键自动转换 - -#### sql 格式化 - -选中需要格式化的 sql 代码,使用 Ctrl+Alt+L 快捷键 - -datagrip 提供了一个功能强大的编辑器,实现了 notepad++的列编辑模式 - -### 列编辑 - -#### 多光标模式 - -在编辑 sql 的时候,可能需要同时输入或同时删除一些字符,按下 alt+shift,同时鼠标在不同的位置点击,会出现多个光标 - -![](http://dl2.iteye.com/upload/attachment/0121/6004/cf942465-18ba-3d0a-92c0-2fef52635990.png) - -#### 代码注释 - -选中要注释的代码,按下 Ctrl+/或 Ctrl+shift+/快捷键,能注释代码,或取消注释 - -![](http://dl2.iteye.com/upload/attachment/0121/6006/daa4c7e7-548a-3b46-a787-e335d001aa1a.png) - -#### 列编辑 - -按住键盘 Alt 键,同时按下鼠标左键拖动,能选择多列,拷贝黏贴等操作 - -![](http://dl2.iteye.com/upload/attachment/0121/6008/4fd42813-8602-3520-8d63-446c22e942de.png) - -### 历史记录 - -#### 代码历史 - -在文本编辑器中,邮件,local history,show history,可以查看使用过的 sql 历史 - -![](http://dl2.iteye.com/upload/attachment/0121/6010/cc243a75-f7ef-366b-b184-f5635855d9f6.png) - -#### 命令历史 - -![](http://dl2.iteye.com/upload/attachment/0121/6012/cf962c1c-0dfe-3241-b137-fef4eac9f1f0.png) diff --git a/docs/tools/database/dbeaver.md b/docs/tools/database/dbeaver.md deleted file mode 100644 index a645907c..00000000 --- a/docs/tools/database/dbeaver.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: DBeaver:开源数据库管理工具 -category: 数据库 -tag: - - 开发工具 ---- - -# DBeaver:开源数据库管理工具。 - -[《再见,Navicat!同事安利的这个IDEA的兄弟,真香!》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247489523&idx=1&sn=4e96972842bdcea2e05cb267d17c5e8e&chksm=cea25838f9d5d12e45a9939370eccf2bff7177038e70437ea0e01d64030118852ee66ae72284&token=2000865596&lang=zh_CN#rd) 这篇文章发了之后很多人抱怨Datagrip 的占用内存太大,很多人推荐了 DBeaver 这款开源免费的数据库管理工具。于是,我昨夜简单体验了一下 DBeaver ,然后写了这篇文章。 - -## DBeaver 概览 - -DBeaver 是一个基于 Java 开发 ,并且支持几乎所有的数据库产品的开源数据库管理工具。 - -DBeaver 社区版不光支持关系型数据库比如MySQL、PostgreSQL、MariaDB、SQLite、Oracle、Db2、SQL Server,还比如 SQLite、H2这些内嵌数据库。还支持常见的全文搜索引擎比如 Elasticsearch 和 Solr、大数据相关的工具比如Hive和 Spark。 - -![DBeaver 支持的数据库概览](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/%E6%9C%AA%E5%91%BD%E5%90%8D%E6%8B%BC%E5%9B%BE.jpg) - -甚至说,DBeaver 的商业版本还支持各种 NoSQL 数据库。 - -![DBeaver 的商业版本还支持各种 NoSQL 数据库](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200803074546854.png) - -## 使用 - -**DBeaver 虽然小巧,但是功能还是十分强大的。基本的表设计、SQL执行、ER图、数据导入导出等等常用功能都不在话下。** - -**我下面只简单演示一下基本的数据库的创建以及表的创建。** - -### 下载安装 - -官方网提供的下载地址:https://dbeaver.io/download/ ,你可以根据自己的操作系统选择合适的版本进行下载安装。 - -比较简单,这里就不演示了。 - -### 连接数据库 - -**1.选择自己想要的连接的数据库,然后点击下一步即可(第一次连接可能需要下载相关驱动)。** - -我这里以MySQL为例。 - -![image-20200803082419586](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200803082419586.png) - -**2.输入数据库的地址、用户名和密码等信息,然后点击完成即可连接** - -点击完成之前,你可以先通过左下方的测试连接来看一下数据库是否可以被成功连接上。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200803082107033.png) - -### 新建数据库 - -右键-> 新建数据库(MySQL 用户记得使用 utf8mb4而不是 utf8) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812200954000.png) - -### 数据库表相关操作 - -#### 新建表 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812201130467.png) - -#### 新建列 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812203427352.png) - -#### 创建约束(主键、唯一键) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812202618448.png) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812204054048.png) - -#### 插入数据 - -我们通过 SQL 编辑器插入数据: - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-8/image-20200812205208540.png) - -```java -INSERT into user(id,name,phone,password) values ('A00001','guide哥','181631312315','123456'); -INSERT into user(id,name,phone,password) values ('A00002','guide哥2','181631312313','123456'); -INSERT into user(id,name,phone,password) values ('A00003','guide哥3','181631312312','123456'); -``` - -## 总结 - -总的来说,简单体验之后感觉还是很不错的,占用内存也确实比 DataGrip 确实要小很多。 - -各位小伙伴可以自行体验一下。毕竟免费并且开源,还是很香的! - - - - diff --git a/docs/tools/database/screw.md b/docs/tools/database/screw.md deleted file mode 100644 index 752af5f8..00000000 --- a/docs/tools/database/screw.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: screw:一键生成数据库文档,堪称数据库界的Swagger -category: 数据库 -tag: - - 开发工具 ---- - -在项目中,我们经常需要整理数据库表结构文档。 - -一般情况下,我们都是手动整理数据库表结构文档,当表结构有变动的时候,自己手动进行维护。 - -数据库表少的时候还好,数据库表多了之后,手动整理和维护数据库表结构文档简直不要太麻烦,而且,还非常容易出错! - -**有没有什么好用的工具帮助我们自动生成数据库表结构文档呢?** - -当然有!Github 上就有一位朋友开源了一款数据库表结构文档自动生成工具—— **screw** 。 - -项目地址: https://github.com/pingfangushi/screw 。 - -![](https://img-blog.csdnimg.cn/cc9556dbe0494e449b7c913f3eb8fe9e.png) - -screw 翻译过来的意思就是螺丝钉,作者希望这个工具能够像螺丝钉一样切实地帮助到我们的开发工作。 - -目前的话,screw 已经支持市面上大部分常见的数据库比如 MySQL、MariaDB、Oracle、SqlServer、PostgreSQL、TiDB。 - -另外,screw 使用起来也非常简单,根据官网提示,不用 10 分钟就能成功在本地使用起来! - -## 快速入门 - -为了验证 screw 自动生成数据库表结构文档的效果,我们首先创建一个简单的存放博客数据的数据库表。 - -```sql -CREATE TABLE `blog` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', - `title` varchar(255) NOT NULL COMMENT '博客标题', - `content` longtext NOT NULL COMMENT '博客内容', - `description` varchar(255) DEFAULT NULL COMMENT '博客简介', - `cover` varchar(255) DEFAULT NULL COMMENT '博客封面图片地址', - `views` int(11) NOT NULL DEFAULT '0' COMMENT '博客阅读次数', - `user_id` bigint(20) DEFAULT '0' COMMENT '发表博客的用户ID', - `channel_id` bigint(20) NOT NULL COMMENT '博客分类ID', - `recommend` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否推荐', - `top` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否置顶', - `comment` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否开启评论', - `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='博客'; -``` - -### 基于 Java 代码 - -#### 引入依赖 - -创建一个普通的 Maven 项目即可!然后引入 screw、HikariCP、MySQL 这 3 个依赖。 - -```xml - - - cn.smallbun.screw - screw-core - 1.0.5 - - - - com.zaxxer - HikariCP - 3.4.5 - - - - mysql - mysql-connector-java - 8.0.20 - -``` - -你可以通过下面的地址在 mvnrepository 获取最新版本的 screw。 - -> https://mvnrepository.com/artifact/cn.smallbun.screw/screw-core - -#### 编写代码 - -生成数据库文档的代码的整个代码逻辑还是比较简单的,我们只需要经过下面 5 步即可: - -```java -// 1.获取数据源 -DataSource dataSource = getDataSource(); -// 2.获取数据库文档生成配置(文件路径、文件类型) -EngineConfig engineConfig = getEngineConfig(); -// 3.获取数据库表的处理配置,可忽略 -ProcessConfig processConfig = getProcessConfig(); -// 4.Screw 完整配置 -Configuration config = getScrewConfig(dataSource, engineConfig, processConfig); -// 5.执行生成数据库文档 -new DocumentationExecute(config).execute(); -``` - -**1、获取数据库源** - -对数据库以及数据库连接池进行相关配置。务必将数据库相关的配置修改成你自己的。 - -```java -/** - * 获取数据库源 - */ -private static DataSource getDataSource() { - //数据源 - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); - hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/javaguide-blog"); - hikariConfig.setUsername("root"); - hikariConfig.setPassword("123456"); - //设置可以获取tables remarks信息 - hikariConfig.addDataSourceProperty("useInformationSchema", "true"); - hikariConfig.setMinimumIdle(2); - hikariConfig.setMaximumPoolSize(5); - return new HikariDataSource(hikariConfig); -} -``` - -**2、获取文件生成配置** - -这一步会指定数据库文档生成的位置、文件类型以及文件名称。 - -```java -/** - * 获取文件生成配置 - */ -private static EngineConfig getEngineConfig() { - //生成配置 - return EngineConfig.builder() - //生成文件路径 - .fileOutputDir("/Users/guide/Documents/代码示例/screw-demo/doc") - //打开目录 - .openOutputDir(true) - //文件类型 - .fileType(EngineFileType.HTML) - //生成模板实现 - .produceType(EngineTemplateType.freemarker) - //自定义文件名称 - .fileName("数据库结构文档").build(); -} -``` - -如果不配置生成文件路径的话,默认也会存放在项目的 `doc` 目录下。 - -另外,我们这里指定生成的文件格式为 HTML。除了 HTML 之外,screw 还支持 Word 、Markdown 这两种文件格式。 - -不太建议生成 Word 格式,比较推荐 Markdown 格式。 - -**3、获取数据库表的处理配置** - -这一步你可以指定只生成哪些表: - -```java -/** - * 获取数据库表的处理配置,可忽略 - */ -private static ProcessConfig getProcessConfig() { - return ProcessConfig.builder() - // 指定只生成 blog 表 - .designatedTableName(new ArrayList<>(Collections.singletonList("blog"))) - .build(); -} -``` - -还可以指定忽略生成哪些表: - -```java -private static ProcessConfig getProcessConfig() { - ArrayList ignoreTableName = new ArrayList<>(); - ignoreTableName.add("test_user"); - ignoreTableName.add("test_group"); - ArrayList ignorePrefix = new ArrayList<>(); - ignorePrefix.add("test_"); - ArrayList ignoreSuffix = new ArrayList<>(); - ignoreSuffix.add("_test"); - return ProcessConfig.builder() - //忽略表名 - .ignoreTableName(ignoreTableName) - //忽略表前缀 - .ignoreTablePrefix(ignorePrefix) - //忽略表后缀 - .ignoreTableSuffix(ignoreSuffix) - .build(); -} -``` - -这一步也可以省略。如果不指定 `ProcessConfig` 的话,就会按照默认配置来! - -**4、生成 screw 完整配置** - -根据前面 3 步,生成 screw 完整配置。 - -```java -private static Configuration getScrewConfig(DataSource dataSource, EngineConfig engineConfig, ProcessConfig processConfig) { - return Configuration.builder() - //版本 - .version("1.0.0") - //描述 - .description("数据库设计文档生成") - //数据源 - .dataSource(dataSource) - //生成配置 - .engineConfig(engineConfig) - //生成配置 - .produceConfig(processConfig) - .build(); -} -``` - -**5、执行生成数据库文档** - -![](https://img-blog.csdnimg.cn/ab2c9ee575304dcdb3c6c231c9eadd17.png) - -下图就是生成的 HTML 格式的数据库设计文档。 - -![](https://img-blog.csdnimg.cn/6ac5a73f27ed4314960fa7671c479525.png) - -### 基于 Maven 插件 - -除了基于 Java 代码这种方式之外,你还可以通过 screw 提供的 Maven 插件来生成数据库文档。方法也非常简单! - -**1、配置 Maven 插件** - -务必将数据库相关的配置修改成你自己的。 - -```xml - - - - cn.smallbun.screw - screw-maven-plugin - 1.0.5 - - - - com.zaxxer - HikariCP - 3.4.5 - - - - mysql - mysql-connector-java - 8.0.20 - - - - - root - - 123456 - - com.mysql.cj.jdbc.Driver - - jdbc:mysql://127.0.0.1:3306/javaguide-blog - - MD - - true - - freemarker - - 数据库结构文档 - - 数据库设计文档生成 - - ${project.version} - - 数据库文档 - - - - compile - - run - - - - - - -``` - -**2、手动执行生成数据库文档** - -![](https://img-blog.csdnimg.cn/9d711f5efba54b44b526cbf5e0173b3d.png) - -我们这里指定生成的是 Markdown 格式。 - -![](https://img-blog.csdnimg.cn/d9debd83fa644b9b8fbd44ac3340530a.png) - -下图就是生成的 Markdown 格式的数据库设计文档,效果还是非常不错的! - -![](https://img-blog.csdnimg.cn/654d93c2faae4a47bd4b8b8a4f5d8376.png) - - - - diff --git a/docs/tools/docker/docker-in-action.md b/docs/tools/docker/docker-in-action.md index 5348b4a5..22b20a7c 100644 --- a/docs/tools/docker/docker-in-action.md +++ b/docs/tools/docker/docker-in-action.md @@ -1,4 +1,9 @@ -# Docker从入门到上手干事 +--- +title: Docker从入门到上手干事 +category: 开发工具 +tag: + - Docker +--- ## Docker介绍 diff --git a/docs/tools/docker/docker-intro.md b/docs/tools/docker/docker-intro.md index 26e0c636..e40d4677 100644 --- a/docs/tools/docker/docker-intro.md +++ b/docs/tools/docker/docker-intro.md @@ -1,4 +1,9 @@ -# Docker 基本概念解读 +--- +title: Docker 基本概念解读 +category: 开发工具 +tag: + - Docker +--- **本文只是对 Docker 的概念做了较为详细的介绍,并不涉及一些像 Docker 环境的安装以及 Docker 的一些常见操作和命令。** diff --git a/docs/tools/java/jadx.md b/docs/tools/java/jadx.md deleted file mode 100644 index 2b9c3a15..00000000 --- a/docs/tools/java/jadx.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: jadx:一款强大的反编译工具! -category: 开发工具 -tag: - - Java ---- - -在[第二期开源项目推荐](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247515981&idx=1&sn=e4b9c06af65f739bdcdf76bdc35d59f6&chksm=cea1f086f9d679908bd6604b1c42d67580160d9789951f3707ad2f5de4d97aa72121d8fe777e&scene=178&cur_album_id=1345382825083895808#rd)中,我推荐了一款强大的反编译工具,我在文中提到说要写一篇专门来介绍这个神器,今天这篇文章就来了。稍有迟到,抱歉(。・_・。)ノ - -![](https://gitee.com/SnailClimb/blog-images/raw/master/network//image-20220111140357573.png) - -jadx 是一款功能强大的反编译工具,使用起来简单方便(拖拽式操作),不光提供了命令行程序,还提供了 GUI 程序。一般情况下,我们直接使用 GUI 程序就可以了。 - -jadx 支持 Windows、Linux、 macOS,能够帮我们打开`.apk`, `.dex`, `.jar`,`.zip`等格式的文件 - -就比如说我们需要反编译一个 jar 包查看其源码的话,直接将 jar 包拖入到 jadx 中就可以了。效果如下: - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-jar.png) - -再比如说我们想看看某个 apk 的源码,我们拿到 apk 之后直接拖入进 jadx 中就可以了。效果如下: - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-apk.png) - -## jadx 安装 - -jadx 是一款开源软件,是可以免费使用的。我们可以在 jadx 的项目主页下载 jadx 最新版。 - -- 项目地址:https://github.com/skylot/jadx -- 下载地址:https://github.com/skylot/jadx/releases/tag/v1.3.1 - -我们直接下载第一个即可。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-download.png) - -下载之后,解压下载好的 jadx 压缩文件后进入 `bin` 目录即可找到可执。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-bin.png) - -- jadx:命令行版本 -- jadx-gui:图形操作界面版本 - -你也可以自己克隆源码,本地编译,这也是我比较推荐的方式。 - -```bash -git clone https://github.com/skylot/jadx.git -``` - -jadx 由 Java 语言编写,使用 Gradle 进行构建。克隆到本地之后,你可以直接使用 Gradle 命令进行构建: - -```bash -cd jadx -# Windows 平台使用 gradlew.bat 而不是 ./gradlew -./gradlew dist -``` - -你也可以直接使用 IDE 打开,然后像运行普通 Java 程序那样使用它: - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-idea-open.png) - -## jadx 使用 - -### 反编译文件 - -通过 File -> Open files... 打开需要反编译的文件或者直接将文件拖拽进 jadx 中就可以了。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-filetype.png) - -从上图可以看出,jadx 支持`.apk`, `.dex`, `.jar`,`.zip`,`.class`等格式的文件。 - -### 搜索功能 - -jadx 自带强大的搜索功能,支持多种匹配模式。 - -通过 `Navigation` 即可打开搜索功能,我们可以选择搜索指定的类,方法,属性,代码,文件,甚至是注释。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/mall4cloud/jadx-search.png) - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-search-view.png) - -### 查看类,变量或者方法使用情况 - -对于某个类、变量或者方法,我们还可以查看哪些地方使用了它。 - -直接选中对应的类、变量或者方法,然后点击右键选择 Find Usage 即可。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-click-find-usage.png) - -很快,jadx 就会帮你找出整个项目有哪些地方使用了它。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-find-usage.png) - -### 添加注释 - -我们还可以自定义注释到源代码中。 - -选中对应的位置之后,点击右键选择 Comment 即可。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/jadx-comment.png) - -### 反混淆 - -一般情况下,为了项目的安全,我们在打包发布一个 apk 之前都会对其代码进行混淆加密比如用无意义的短变量去重命名类、变量、方法,以免代码被轻易破解泄露。 - -经过混淆的代码在功能上是没有变化的,但是去掉了部分名称中的语义信息。 - -为了代码的易读性,我们可以对代码进行反混淆。 - -在 jadx 中,我们通过 Tools -> Deobfuscation 即可开启反混淆功能。 - -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/jadx/image-20211223105444679.png) \ No newline at end of file diff --git a/docs/xingqiu/readme.md b/docs/xingqiu/readme.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/zhuanlan/handwritten-rpc-framework.md b/docs/zhuanlan/handwritten-rpc-framework.md new file mode 100644 index 00000000..4c26d9b6 --- /dev/null +++ b/docs/zhuanlan/handwritten-rpc-framework.md @@ -0,0 +1,77 @@ +--- +title: 《手写 RPC 框架》 +category: 知识星球 +--- + +## 介绍 + +**《手写 RPC 框架》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,我写了 12 篇文章来讲解如何从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 + +麻雀虽小五脏俱全,项目代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。 + +## 内容概览 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/image-20220308100605485.png) + +通过这个简易的轮子,你可以学到 RPC 的底层原理和原理以及各种 Java 编码实践的运用。你甚至可以把它当做你的毕设/项目经验的选择,这是非常不错!对比其他求职者的项目经验都是各种系统,造轮子肯定是更加能赢得面试官的青睐。 + +- Github 地址:[https://github.com/Snailclimb/guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) 。 +- Gitee 地址:[https://gitee.com/SnailClimb/guide-rpc-framework](https://gitee.com/SnailClimb/guide-rpc-framework) 。 + +## 项目基本情况和可优化点 + +为了循序渐进,最初的是时候,我是基于传统的 **BIO** 的方式 **Socket** 进行网络传输,然后利用 **JDK 自带的序列化机制** 来实现这个 RPC 框架的。后面,我对原始版本进行了优化,已完成的优化点和可以完成的优化点我都列在了下面 👇。 + +**为什么要把可优化点列出来?** 主要是想给哪些希望优化这个 RPC 框架的小伙伴一点思路。欢迎大家 fork 本仓库,然后自己进行优化。 + +- [x] **使用 Netty(基于 NIO)替代 BIO 实现网络传输;** +- [x] **使用开源的序列化机制 Kyro(也可以用其它的)替代 JDK 自带的序列化机制;** +- [x] **使用 Zookeeper 管理相关服务地址信息** +- [x] Netty 重用 Channel 避免重复连接服务端 +- [x] 使用 `CompletableFuture` 包装接受客户端返回结果(之前的实现是通过 `AttributeMap` 绑定到 Channel 上实现的) 详见:[使用 CompletableFuture 优化接受服务提供端返回结果](./docs/使用CompletableFuture优化接受服务提供端返回结果.md) +- [x] **增加 Netty 心跳机制** : 保证客户端和服务端的连接不被断掉,避免重连。 +- [x] **客户端调用远程服务的时候进行负载均衡** :调用服务的时候,从很多服务地址中根据相应的负载均衡算法选取一个服务地址。ps:目前实现了随机负载均衡算法与一致性哈希算法。 +- [x] **处理一个接口有多个类实现的情况** :对服务分组,发布服务的时候增加一个 group 参数即可。 +- [x] **集成 Spring 通过注解注册服务** +- [x] **集成 Spring 通过注解进行服务消费** 。参考: [PR#10](https://github.com/Snailclimb/guide-rpc-framework/pull/10) +- [x] **增加服务版本号** :建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级。为什么要增加服务版本号?为后续不兼容升级提供可能,比如服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。 +- [x] **对 SPI 机制的运用** +- [ ] **增加可配置比如序列化方式、注册中心的实现方式,避免硬编码** :通过 API 配置,后续集成 Spring 的话建议使用配置文件的方式进行配置 +- [x] **客户端与服务端通信协议(数据包结构)重新设计** ,可以将原有的 `RpcRequest`和 `RpcReuqest` 对象作为消息体,然后增加如下字段(可以参考:《Netty 入门实战小册》和 Dubbo 框架对这块的设计): + - **魔数** : 通常是 4 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。 + - **序列化器编号** :标识序列化的方式,比如是使用 Java 自带的序列化,还是 json,kyro 等序列化方式。 + - **消息体长度** : 运行时计算出来。 + - ...... +- [ ] **编写测试为重构代码提供信心** +- [ ] **服务监控中心(类似 dubbo admin)** +- [x] **设置 gzip 压缩** + +## 星球其他资源 + +除了 **《从零开始写一个 RPC 框架》** 之外,星球还有 **《Java 面试指北》**、 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码) 、**《Kafka 常见面试题/知识点总结》** 等多个专栏。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) + +另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304124333119.png) + +## 星球限时优惠 + +两年前,[知识星球](../about-the-author/zhishixingqiu-two-years.md)的定价是 **50/年** ,这是星球的最低定价,我还附送了优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。 + +当时的想法真不是为了赚钱,不开玩笑,不打诳语!目前星球有 **8000+** 人,其中有超过 **35%** 的小伙伴都是星球刚开那会就加入了。 + +随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 **159/年**!是的,星球的价格会慢慢升高的,想要加入的小伙伴一定要尽早。 + +你可以添加我的微信领取星球专属优惠券,限时 **100 元/年** 加入。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/IMG_3007.jpg) + +如果你经济确实有困难的话,加我的时候说明一下情况就好,莫欺少年穷,可以理解,一定不要去用什么花呗类借贷产品。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125325364.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125403995.png) + +不过,还是希望大家也不要利用我的好心,感恩!信任!理解! \ No newline at end of file diff --git a/docs/zhuanlan/java-mian-shi-zhi-bei.md b/docs/zhuanlan/java-mian-shi-zhi-bei.md new file mode 100644 index 00000000..eec35735 --- /dev/null +++ b/docs/zhuanlan/java-mian-shi-zhi-bei.md @@ -0,0 +1,102 @@ +--- +title: 《Java 面试指北》 +category: 知识星球 +--- + +你好,我是 Guide。 + +犹豫了很久,还是想借这篇文章来简单介绍以及宣传一下我这两年利用业余时间完成的 [**JavaGuide 开源版**](https://javaguide.cn/)的兄弟 — **《Java 面试指北》**。 + +每次写这种“软文”我还是挺忐忑的,但是转念一想,自己用心做内容,真诚帮助别人,为什么不能宣传一下呢?这内容不比很多几千块钱的训练营强? + +一到面试季,熬夜到转点帮忙修改简历回答问题就成了家常便饭。不过,大家也不用心疼我,我做这些事情是有收获的,不仅仅是多了一份可观的副业收入,内心也更加充实开心。不过,也确实是真的累! + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304123156348.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/IMG_2975_%E5%89%AF%E6%9C%AC.png) + +## 介绍 + +**《Java 面试指北》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,和 [JavaGuide 开源版](https://javaguide.cn/)的内容互补。相比于开源版本来说,《Java 面试指北》添加了下面这些内容(不仅仅是这些内容): + +- 10+ 篇文章手把手教你如何准备面试。 +- 更全面的八股文面试题(系统设计、常见框架、分布式、高并发 ......)。 +- 优质面经精选。 +- 技术面试题自测。 +- 练级攻略(有助于个人成长的经验)。 + +## 内容概览 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102536445.png) + +### 面试准备篇 + +在 **「面试准备篇」** ,我写了 10+ 篇文章手把手教你如何准备面试: + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304120532910.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304120629860.png) + +### 技术面试题篇 + +**「技术面试题篇」** 的内容和 JavaGuide 开源版本互补,不仅仅包括最基本的 Java、常见框架等八股文,还包括系统设计、分布式、高并发等进阶内容。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102904740.png) + +### 面经篇 + +**「面经篇」** 这个系列主要分享优质面经。 + +古人云:“**他山之石,可以攻玉**” 。善于学习借鉴别人的面试的成功经验或者失败的教训,可以让自己少走许多弯路。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304103521611.png) + +星球还有专门分享面经和面试题的专题,里面会分享很多优质的面经和面试题。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304120018731.png) + +### 技术面试题自测篇 + +为了让小伙伴们自测以检查自己的掌握情况,我还推出了 **「技术面试题自测」** 系列。不过,目前只更新了 Java 部分的自测,正在持续更新中。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220213161642408.png) + +### 练级攻略篇 + +**「练级攻略篇」** 这个系列主要内容一些有助于个人成长的经验分享。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102108367.png) + +每一篇内容都非常干货,不少球友看了之后表示收获漫漫。不过,最重要的还是知行合一。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304102815110.png) + +## 星球其他资源 + +除了 **《Java 面试指北》** 之外,星球还有 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》** 等多个专属小册。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) + +另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304124333119.png) + +## 星球限时优惠 + +两年前,[知识星球](../about-the-author/zhishixingqiu-two-years.md)的定价是 **50/年** ,这是星球的最低定价,我还附送了优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。 + +当时的想法真不是为了赚钱,不开玩笑,不打诳语!目前星球有 **8000+** 人,其中有超过 **35%** 的小伙伴都是星球刚开那会就加入了。 + +随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 **159/年**!是的,星球的价格会慢慢升高的,想要加入的小伙伴一定要尽早。 + +你可以添加我的微信领取星球专属优惠券,限时 **100 元/年** 加入。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/IMG_3007.jpg) + +如果你经济确实有困难的话,加我的时候说明一下情况就好,莫欺少年穷,可以理解,一定不要去用什么花呗类借贷产品。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125325364.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125403995.png) + +不过,还是希望大家也不要利用我的好心,感恩!信任!理解! \ No newline at end of file diff --git a/docs/zhuanlan/readme.md b/docs/zhuanlan/readme.md new file mode 100644 index 00000000..bd15b443 --- /dev/null +++ b/docs/zhuanlan/readme.md @@ -0,0 +1,41 @@ +--- +title: 星球专属优质专栏概览 +category: 知识星球 +--- + +这部分的内容为我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)专属,目前已经更新了下面这些专栏: + +- **[《Java 面试指北》](./java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补! +- **[《手写 RPC 框架》](./java-mian-shi-zhi-bei.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 +- ...... + +## 更多专栏 + +除了上面介绍的之外,我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)还有 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码) 、**《Kafka 常见面试题/知识点总结》** 等多个专栏。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) + +另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304124333119.png) + +## 星球限时优惠 + +两年前,[知识星球](../about-the-author/zhishixingqiu-two-years.md)的定价是 **50/年** ,这是星球的最低定价,我还附送了优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。 + +当时的想法真不是为了赚钱,不开玩笑,不打诳语!目前星球有 **8000+** 人,其中有超过 **35%** 的小伙伴都是星球刚开那会就加入了。 + +随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 **159/年**!是的,星球的价格会慢慢升高的,想要加入的小伙伴一定要尽早。 + +你可以添加我的微信领取星球专属优惠券,限时 **100 元/年** 加入。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/IMG_3007.jpg) + +如果你经济确实有困难的话,加我的时候说明一下情况就好,莫欺少年穷,可以理解,一定不要去用什么花呗类借贷产品。 + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125325364.png) + +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220304125403995.png) + +不过,还是希望大家也不要利用我的好心,感恩!信任!理解! + diff --git a/package.json b/package.json index cf4d9e22..576b42b8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "description": "javaguide", "license": "MIT", - "author": "Mr.Hope", + "author": "Guide", "scripts": { "vite-build": "vuepress-vite build docs", "vite-clean-serve": "vuepress-vite dev docs --clean-cache", @@ -14,14 +14,9 @@ "webpack-serve": "vuepress-webpack dev docs" }, "devDependencies": { - "@vuepress/plugin-docsearch": "2.0.0-beta.36", - "@vuepress/plugin-pwa": "2.0.0-beta.36", - "@vuepress/plugin-pwa-popup": "2.0.0-beta.36", - "@vuepress/plugin-register-components": "2.0.0-beta.36", - "@vuepress/plugin-shiki": "2.0.0-beta.36", - "cross-env": "7.0.3", - "vuepress-theme-hope": "2.0.0-alpha.40", + "vuepress-theme-hope": "2.0.0-beta.13", "vuepress-vite": "2.0.0-beta.36", - "vuepress-webpack": "2.0.0-beta.36" + "vuepress-webpack": "2.0.0-beta.36", + "@vuepress/plugin-search": "^2.0.0-beta.36" } }