140
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) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。
|
||||
|
||||
<div align="center">
|
||||
<p>
|
||||
@ -19,22 +19,21 @@
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
> 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 框架,由阿里开源。相关阅读:
|
||||

|
||||
|
||||

|
||||
|
||||
|
@ -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",
|
||||
},
|
||||
],
|
||||
],
|
||||
|
@ -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" },
|
||||
]);
|
||||
|
@ -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: "常用框架",
|
||||
|
@ -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",
|
||||
|
106
docs/about-the-author/zhishixingqiu-two-years.md
Normal file
@ -0,0 +1,106 @@
|
||||
---
|
||||
title: 我的知识星球运营两年多了!
|
||||
category: 知识星球
|
||||
---
|
||||
|
||||
时间过的真快,知识星球我已经运营了有 2 年多了!
|
||||
|
||||
在 2019 年 12 月 29 号,经过了大概一年左右的犹豫期,我正式确定要开始做一个自己的星球。
|
||||
|
||||

|
||||
|
||||
## 什么是知识星球?
|
||||
|
||||
简单来说,知识星球就是一个私密交流圈子,主要用途是知识创作者连接铁杆读者/粉丝。相比于微信群,知识星球内容沉淀、信息管理更高效。
|
||||
|
||||

|
||||
|
||||
## 我的知识星球能为你提供什么?
|
||||
|
||||
努力做一个最优质的 Java 面试交流星球!加入到我的星球之后,你将获得:
|
||||
|
||||
1. 6 个高质量的小册永久阅读,内容涵盖面试,源码解析,项目实战等内容!价值远超门票!
|
||||
2. 专属求职指南和建议,帮助你逆袭大厂!
|
||||
3. 一对一免费提问交流(专属建议,走心回答)。
|
||||
4. 免费的简历修改服务(已经累计帮助 1800+ 位球友)。
|
||||
5. 海量 Java 优质面试资源分享!价值远超门票!
|
||||
6. 读书交流,学习交流,让我们一起努力创造一个纯粹的学习交流社区。
|
||||
7. 不定期福利:节日抽奖、送书送课、球友线下聚会等等。
|
||||
7. ......
|
||||
|
||||
### 简历修改
|
||||
|
||||
星球运行 2 年多,我累计帮助 **2000+** 位球友提供了免费的简历修改服务,回答了 **1000+** 个读者提问,产出了 **3800+** 个主题。
|
||||
|
||||

|
||||
|
||||
### 专属专栏
|
||||
|
||||
星球更新了 **《Java 面试指北》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》** 等多个优质专栏。
|
||||
|
||||

|
||||
|
||||
各种手绘图解,内容质量非常高!
|
||||
|
||||

|
||||
|
||||
### 提问交流
|
||||
|
||||
你可以和我进行一对一免费提问交流,我会很走心地回答你的问题。
|
||||
|
||||

|
||||
|
||||
### 读书活动
|
||||
|
||||
每个月至少还会又一次有奖励的读书活动,我会带着大家一起读一些优秀的技术书籍!
|
||||
|
||||

|
||||
|
||||
毫不夸张!每一期读书活动的获奖率都非常非常非常高!直接超过门票价!!!
|
||||
|
||||
### 学习打卡
|
||||
|
||||
星球的学习打卡活动可以督促自己和其他球友们一起学习交流。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 是否收费?
|
||||
|
||||
星球是需要付费才能进入的。 **为什么要收费呢?**
|
||||
|
||||
1、维护好星球是一件费时费力的事情,每到面试季,我经常凌晨还在看简历和回答球友问题。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
除此之外,我还要抽时间写星球的专属的一些专栏,单单是这些专栏的价值就远超星球门票了。
|
||||
|
||||
2、如果我是免费提供这些服务的话,我自己是肯定忙不过来的。付费这个门槛可以帮我筛选出真正需要帮助的那批人。
|
||||
|
||||
3、网站的运行也需要花钱,不管是服务器还是 CDN 都是一笔不小的开支(1w 左右/年)。
|
||||
|
||||
4、我觉得合理的收费是对我付出劳动的一种正向激励,促进我继续输出!
|
||||
|
||||
## 如何加入?
|
||||
|
||||
两年前,[知识星球](../about-the-author/zhishixingqiu-two-years.md)的定价是 **50/年** ,这是星球的最低定价,我还附送了优惠券。扣除了星球手续费,发了各种福利之后,几乎就是纯粹做公益。
|
||||
|
||||
当时的想法真不是为了赚钱,不开玩笑,不打诳语!目前星球有 **8000+** 人,其中有超过 **35%** 的小伙伴都是星球刚开那会就加入了。
|
||||
|
||||
随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多。于是,我将星球的定价慢慢调整为了 **159/年**!是的,星球的价格会慢慢升高的,想要加入的小伙伴一定要尽早。
|
||||
|
||||
你可以添加我的微信领取星球专属优惠券,限时 **100 元/年** 加入。
|
||||
|
||||

|
||||
|
||||
如果你经济确实有困难的话,加我的时候说明一下情况就好,莫欺少年穷,可以理解,一定不要去用什么花呗类借贷产品。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
不过,还是希望大家也不要利用我的好心,感恩!信任!理解!
|
||||
|
@ -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 证书中)。
|
||||
|
@ -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
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
但是!哈希算法有个 **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 也支持了全文索引。
|
||||
|
||||
二级索引:
|
||||
|
||||

|
||||
|
||||
## 聚集索引与非聚集索引
|
||||
@ -128,9 +127,7 @@ InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索
|
||||
#### 聚集索引的缺点
|
||||
|
||||
1. **依赖于有序的数据** :因为 B+树是多路平衡树,如果索引的数据不是有序的,那么就需要在插入时排序,如果数据是整型还好,否则类似于字符串或 UUID 这种又长又难比较的数据,插入或查找的速度肯定比较慢。
|
||||
2. **更新代价大** : 如果对索引列的数据被修改时,那么对应的索引也将会被修改,
|
||||
而且况聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,
|
||||
所以对于主键索引来说,主键一般都是不可被修改的。
|
||||
2. **更新代价大** : 如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。
|
||||
|
||||
### 非聚集索引
|
||||
|
||||
|
@ -5,15 +5,13 @@ tag:
|
||||
- MySQL
|
||||
---
|
||||
|
||||
|
||||
|
||||
> 本文来自公号程序猿阿星投稿,JavaGuide 对其做了补充完善。
|
||||
|
||||
## 前言
|
||||
|
||||
`MySQL` 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 `binlog`(归档日志)和事务日志 `redo log`(重做日志)和 `undo log`(回滚日志)。
|
||||
|
||||

|
||||

|
||||
|
||||
今天就来聊聊 `redo log`(重做日志)、`binlog`(归档日志)、两阶段提交、`undo log` (回滚日志)。
|
||||
|
||||
@ -23,7 +21,7 @@ tag:
|
||||
|
||||
比如 `MySQL` 实例挂了或宕机了,重启时,`InnoDB`存储引擎会使用`redo log`恢复数据,保证数据的持久性与完整性。
|
||||
|
||||

|
||||

|
||||
|
||||
`MySQL` 中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 `Buffer Pool` 中。
|
||||
|
||||
@ -33,9 +31,9 @@ tag:
|
||||
|
||||
然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(`redo log buffer`)里,接着刷盘到 `redo log` 文件里。
|
||||
|
||||

|
||||

|
||||
|
||||
> 图片笔误提示:第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` 刷盘。
|
||||
|
||||

|
||||

|
||||
|
||||
也就是说,一个没有提交事务的 `redo log` 记录,也可能会刷盘。
|
||||
|
||||
@ -61,7 +59,7 @@ tag:
|
||||
|
||||
因为在事务执行过程 `redo log` 记录是会写入`redo log buffer` 中,这些 `redo log` 记录会被后台线程刷盘。
|
||||
|
||||

|
||||

|
||||
|
||||
除了后台线程每秒`1`次的轮询操作,还有一种情况,当 `redo log buffer` 占用的空间即将达到 `innodb_log_buffer_size` 一半的时候,后台线程会主动刷盘。
|
||||
|
||||
@ -69,13 +67,13 @@ tag:
|
||||
|
||||
#### innodb_flush_log_at_trx_commit=0
|
||||
|
||||

|
||||

|
||||
|
||||
为`0`时,如果`MySQL`挂了或宕机可能会有`1`秒数据的丢失。
|
||||
|
||||
#### innodb_flush_log_at_trx_commit=1
|
||||
|
||||

|
||||

|
||||
|
||||
为`1`时, 只要事务提交成功,`redo log`记录就一定在硬盘里,不会有任何数据丢失。
|
||||
|
||||
@ -83,7 +81,7 @@ tag:
|
||||
|
||||
#### innodb_flush_log_at_trx_commit=2
|
||||
|
||||

|
||||

|
||||
|
||||
为`2`时, 只要事务提交成功,`redo log buffer`中的内容只写入文件系统缓存(`page cache`)。
|
||||
|
||||
@ -97,7 +95,7 @@ tag:
|
||||
|
||||
它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。
|
||||
|
||||

|
||||

|
||||
|
||||
在个**日志文件组**中还有两个重要的属性,分别是 `write pos、checkpoint`
|
||||
|
||||
@ -110,11 +108,11 @@ tag:
|
||||
|
||||
`write pos` 和 `checkpoint` 之间的还空着的部分可以用来写入新的 `redo log` 记录。
|
||||
|
||||

|
||||

|
||||
|
||||
如果 `write pos` 追上 `checkpoint` ,表示**日志文件组**满了,这时候不能再写入新的 `redo log` 记录,`MySQL` 得停下来,清空一些记录,把 `checkpoint` 推进一下。
|
||||
|
||||

|
||||

|
||||
|
||||
### redo log 小结
|
||||
|
||||
@ -155,7 +153,7 @@ tag:
|
||||
|
||||
可以说`MySQL`数据库的**数据备份、主备、主主、主从**都离不开`binlog`,需要依靠`binlog`来同步数据,保证数据一致性。
|
||||
|
||||

|
||||

|
||||
|
||||
`binlog`会记录所有涉及更新数据的逻辑操作,并且是顺序写。
|
||||
|
||||
@ -169,13 +167,13 @@ tag:
|
||||
|
||||
指定`statement`,记录的内容是`SQL`语句原文,比如执行一条`update T set update_time=now() where id=1`,记录的内容如下。
|
||||
|
||||

|
||||

|
||||
|
||||
同步数据时,会执行记录的`SQL`语句,但是有个问题,`update_time=now()`这里会获取当前系统时间,直接执行会导致与原库的数据不一致。
|
||||
|
||||
为了解决这种问题,我们需要指定为`row`,记录的内容不再是简单的`SQL`语句了,还包含操作的具体数据,记录内容如下。
|
||||
|
||||

|
||||

|
||||
|
||||
`row`格式记录的内容看不到详细信息,要通过`mysqlbinlog`工具解析出来。
|
||||
|
||||
@ -199,7 +197,7 @@ tag:
|
||||
|
||||
`binlog`日志刷盘流程如下
|
||||
|
||||

|
||||

|
||||
|
||||
- **上图的 write,是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快**
|
||||
- **上图的 fsync,才是将数据持久化到磁盘的操作**
|
||||
@ -208,15 +206,15 @@ tag:
|
||||
|
||||
为`0`的时候,表示每次提交事务都只`write`,由系统自行判断什么时候执行`fsync`。
|
||||
|
||||

|
||||

|
||||
|
||||
虽然性能得到提升,但是机器宕机,`page cache`里面的 binlog 会丢失。
|
||||
|
||||
为了安全起见,可以设置为`1`,表示每次提交事务都会执行`fsync`,就如同**binlog 日志刷盘流程**一样。
|
||||
为了安全起见,可以设置为`1`,表示每次提交事务都会执行`fsync`,就如同 **redo log 日志刷盘流程** 一样。
|
||||
|
||||
最后还有一种折中方式,可以设置为`N(N>1)`,表示每次提交事务都`write`,但累积`N`个事务后才`fsync`。
|
||||
|
||||

|
||||

|
||||
|
||||
在出现`IO`瓶颈的场景里,将`sync_binlog`设置成一个比较大的值,可以提升性能。
|
||||
|
||||
@ -232,7 +230,7 @@ tag:
|
||||
|
||||
在执行更新语句过程,会记录`redo log`与`binlog`两块日志,以基本的事务为单位,`redo log`在事务执行过程中可以不断写入,而`binlog`只有在提交事务时才写入,所以`redo log`与`binlog`的写入时机不一样。
|
||||
|
||||

|
||||

|
||||
|
||||
回到正题,`redo log`与`binlog`两份日志之间的逻辑不一致,会出现什么问题?
|
||||
|
||||
@ -240,25 +238,25 @@ tag:
|
||||
|
||||
假设执行过程中写完`redo log`日志后,`binlog`日志写期间发生了异常,会出现什么情况呢?
|
||||
|
||||

|
||||

|
||||
|
||||
由于`binlog`没写完就异常,这时候`binlog`里面没有对应的修改记录。因此,之后用`binlog`日志恢复数据时,就会少这一次更新,恢复出来的这一行`c`值是`0`,而原库因为`redo log`日志恢复,这一行`c`值是`1`,最终数据不一致。
|
||||
|
||||

|
||||

|
||||
|
||||
为了解决两份日志之间的逻辑一致问题,`InnoDB`存储引擎使用**两阶段提交**方案。
|
||||
|
||||
原理很简单,将`redo log`的写入拆成了两个步骤`prepare`和`commit`,这就是**两阶段提交**。
|
||||
|
||||

|
||||

|
||||
|
||||
使用**两阶段提交**后,写入`binlog`时发生异常也不会有影响,因为`MySQL`根据`redo log`日志恢复数据时,发现`redo log`还处于`prepare`阶段,并且没有对应`binlog`日志,就会回滚该事务。
|
||||
|
||||

|
||||

|
||||
|
||||
再看一个场景,`redo log`设置`commit`阶段发生异常,那会不会回滚事务呢?
|
||||
|
||||

|
||||

|
||||
|
||||
并不会回滚事务,它会执行上图框住的逻辑,虽然`redo log`是处于`prepare`阶段,但是能通过事务`id`找到对应的`binlog`日志,所以`MySQL`认为是完整的,就会提交事务恢复数据。
|
||||
|
||||
|
@ -111,7 +111,7 @@ MyISAM 不支持,而 InnoDB 支持。
|
||||
|
||||
讲真,这个对比有点废话,毕竟 MyISAM 连行级锁都不支持。
|
||||
|
||||
MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提供性能。
|
||||
MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提高性能。
|
||||
|
||||
### 关于 MyISAM 和 InnoDB 的选择问题
|
||||
|
||||
|
@ -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 即可。**
|
||||
|
@ -7,17 +7,4 @@ category: 分布式
|
||||
|
||||
《Java 面试指北》的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
|
||||
|
||||

|
||||
|
||||
我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。
|
||||
|
||||

|
||||
|
||||
如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。
|
||||
|
||||
星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”!
|
||||
|
||||

|
||||
|
||||
**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!**
|
||||
|
||||

|
||||
|
@ -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 共识算法
|
||||
|
||||
|
@ -4,19 +4,4 @@
|
||||
|
||||
《Java 面试指北》的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
|
||||
|
||||

|
||||
|
||||
我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。
|
||||
|
||||

|
||||
|
||||
如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。
|
||||
|
||||
星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”!
|
||||
|
||||

|
||||
|
||||
**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!**
|
||||
|
||||
|
||||
|
||||

|
||||
|
30
docs/home.md
@ -9,28 +9,22 @@ title: JavaGuide(Java学习&&面试指南)
|
||||
<img src="../media/sponsor/xingqiu.png" style="margin: 0 auto; width: 850px;" />
|
||||
</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://github.com/Snailclimb/JavaGuide" target="_blank">
|
||||
<img src="https://img-blog.csdnimg.cn/img_convert/1c00413c65d1995993bf2b0daf7b4f03.png#pic_center" width="" />
|
||||
</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://javaguide.cn/"><img src="https://img.shields.io/badge/阅读-read-brightgreen.svg" alt="阅读" /></a>
|
||||
<img src="https://img.shields.io/github/stars/Snailclimb/JavaGuide" alt="stars" />
|
||||
<img src="https://img.shields.io/github/forks/Snailclimb/JavaGuide" alt="forks" />
|
||||
<img src="https://img.shields.io/github/issues/Snailclimb/JavaGuide" alt="issues" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
> 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)
|
||||
|
||||
## 面试资源
|
||||
|
||||
|
@ -1,26 +0,0 @@
|
||||
---
|
||||
title: Camel Case:命名之间快速切换
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
非常有用!这个插件可以实现包含6种常见命名格式之间的切换。并且,你还可以对转换格式进行相关配置(转换格式) *Preferences / Settings | Camel Case* 。
|
||||
|
||||

|
||||
|
||||
有了这个插件之后,点击你想要修改的变量或者方法名使用快捷键 `shift+option+u(mac)` / `shift+alt+u` 即可实现在多种命名格式之间切换。
|
||||
|
||||

|
||||
|
||||
如果你突然忘记快捷键的话,可以直接在IDEA的菜单栏的 Edit 部分找到。
|
||||
|
||||

|
||||
|
||||
使用这个插件对开发效率提升高吗?拿我之前项目组的情况举个例子:
|
||||
|
||||
我之前有一个项目组的测试名字是驼峰这种形式: `ShouldReturnTicketWhenRobotSaveBagGiven1LockersWith2FreeSpace` 。但是,使用驼峰形式命名测试方法的名字不太明显,一般建议用下划线_的形式: `should_return_ticket_when_robot_save_bag_given_1_lockers_with_2_free_space`
|
||||
|
||||
如果我们不用这个插件,而是手动去一个一个改的话,工作量想必会很大,而且正确率也会因为手工的原因降低。
|
||||
|
@ -1,11 +0,0 @@
|
||||
---
|
||||
title: CodeGlance:代码微型地图
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
CodeGlance提供一个代码的微型地图,当你的类比较多的时候可以帮忙你快速定位到要去的位置。这个插件在我们日常做普通开发的时候用处不大,不过,在你阅读源码的时候还是很有用的,如下图所示:
|
||||
|
||||

|
@ -1,39 +0,0 @@
|
||||
---
|
||||
title: Statistic:项目代码统计
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
编程是一个很奇妙的事情,大部分的我们把大部分时间实际都花在了复制粘贴,而后修改代码上面。
|
||||
|
||||
很多时候,我们并不关注代码质量,只要功能能实现,我才不管一个类的代码有多长、一个方法的代码有多长。
|
||||
|
||||
因此,我们经常会碰到让自己想要骂街的项目,不过,说真的,你自己写的代码也有极大可能被后者 DISS。
|
||||
|
||||
为了快速分析项目情况,判断这个项目是不是一个“垃圾”项目,有一个方法挺简单的。
|
||||
|
||||
那就是**对代码的总行数、单个文件的代码行数、注释行数等信息进行统计。**
|
||||
|
||||
**怎么统计呢?**
|
||||
|
||||
首先想到的是 Excel 。不过,显然太麻烦了。
|
||||
|
||||
**有没有专门用于代码统计的工具呢?**
|
||||
|
||||
基于Perl语言开发的cloc(count lines of code)或许可以满足你的要求。
|
||||
|
||||
**有没有什么更简单的办法呢?**
|
||||
|
||||
如果你使用的是 IDEA 进行开发的话,推荐你可以使用一下 **Statistic** 这个插件。
|
||||
|
||||
有了这个插件之后你可以非常直观地看到你的项目中所有类型的文件的信息比如数量、大小等等,可以帮助你更好地了解你们的项目。
|
||||
|
||||

|
||||
|
||||
你还可以使用它看所有类的总行数、有效代码行数、注释行数、以及有效代码比重等等这些东西。
|
||||
|
||||

|
||||
|
||||
如果,你担心插件过多影响IDEA速度的话,可以只在有代码统计需求的时候开启这个插件,其他时间禁用它就完事了!
|
@ -1,19 +0,0 @@
|
||||
---
|
||||
title: Git Commit Template:提交代码格式规范
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
没有安装这个插件之前,我们使用IDEA提供的Commit功能提交代码是下面这样的:
|
||||
|
||||

|
||||
|
||||
使用了这个插件之后是下面这样的,提供了一个commit信息模板的输入框:
|
||||
|
||||

|
||||
|
||||
完成之后的效果是这样的:
|
||||
|
||||

|
@ -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)调出操作窗口(**必须在类中使用快捷键才有效**),如下图所示。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这个插件是一个国人几年前写的,不过已经很久没有更新了,可能会因为IDEA的版本问题有一些小Bug。而且,这个插件无法将JSON转换为Kotlin(这个其实无关痛痒,IDEA自带的就有Java转Kotlin的功能)。
|
||||
|
||||

|
||||
|
||||
另外一个与之相似的插件是 **:RoboPOJOGenerator** ,这个插件的更新频率比较快。
|
||||
|
||||
`File-> new -> Generate POJO from JSON`
|
||||
|
||||

|
||||
|
||||
然后将JSON格式的数据粘贴进去之后,配置相关属性之后选择“*Generate*”
|
||||
|
||||

|
||||
|
||||
|
||||
|
@ -1,17 +0,0 @@
|
||||
---
|
||||
title: IDE Features Trainer:IDEA 交互式教程
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
**有了这个插件之后,你可以在 IDE 中以交互方式学习IDEA最常用的快捷方式和最基本功能。** 非常非常非常方便!强烈建议大家安装一个,尤其是刚开始使用IDEA的朋友。
|
||||
|
||||
当我们安装了这个插件之后,你会发现我们的IDEA 编辑器的右边多了一个“**Learn**”的选项,我们点击这个选项就可以看到如下界面。
|
||||
|
||||

|
||||
|
||||
我们选择“Editor Basics”进行,然后就可以看到如下界面,这样你就可以按照指示来练习了!非常不错!
|
||||
|
||||

|
@ -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 中使用人数最多的一款主题。
|
||||
|
||||
当你安装完这个插件之后,你会发现这个主题本身又提供了多种相关的主题供你选择。
|
||||
|
||||

|
||||
|
||||
**Material Deep Ocean** 这款的效果图如下。默认的字体是真的小,小伙伴们需要自行调整一下。
|
||||
|
||||

|
||||
|
||||
## [One Dark theme](https://plugins.jetbrains.com/plugin/11938-one-dark-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
我比较喜欢的一款(*黄色比较多?*)。 没有花里花哨,简单大气,看起来比较舒服。颜色搭配也很棒,适合编码!
|
||||
|
||||
这款主题的效果图如下。
|
||||
|
||||

|
||||
|
||||
## [Gradianto](https://plugins.jetbrains.com/plugin/12334-gradianto)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
Gradianto这个主题的目标是在保持页面色彩比较层次分明的情况下,让我们因为代码而疲惫的双眼更加轻松。
|
||||
|
||||
Gradianto附带了自然界的渐变色,看着挺舒服的。另外,这个主题本身也提供了多种相关的主题供你选择。
|
||||
|
||||

|
||||
|
||||
**Gradianto Nature Green** 的效果图如下。
|
||||
|
||||

|
||||
|
||||
## [Dark Purple Theme](https://plugins.jetbrains.com/plugin/12100-dark-purple-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
这是一款紫色色调的深色主题,喜欢紫色的小伙伴不要错过。
|
||||
|
||||
这个主题的效果图如下。个人觉得整体颜色搭配的是比较不错的,适合编码!
|
||||
|
||||

|
||||
|
||||
## [Hiberbee Theme](https://plugins.jetbrains.com/plugin/12118-hiberbee-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
一款受到了 Monokai Pro 和 MacOS Mojave启发的主题,是一款色彩层次分明的深色主题。
|
||||
|
||||
这个主题的效果图如下。看着也是非常赞!适合编码!
|
||||
|
||||

|
||||
|
||||
上面推荐的都是偏暗色系的主题,这里我再推荐两款浅色系的主题。
|
||||
|
||||
## [Gray Theme](https://plugins.jetbrains.com/plugin/12103-gray-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐
|
||||
|
||||
这是一款对比度比较低的一款浅色主题,不太适合代码阅读,毕竟这款主题是专门为在IntelliJ IDE中使用Markdown而设计的。
|
||||
|
||||
这个主题的效果图如下。
|
||||
|
||||

|
||||
|
||||
## [Roboticket Light Theme](https://plugins.jetbrains.com/plugin/12191-roboticket-light-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐
|
||||
|
||||
这是一款对比度比较低的浅色主题,不太适合代码阅读。
|
||||
|
||||
这个主题的效果图如下。
|
||||
|
||||

|
||||
|
||||
## 后记
|
||||
|
||||
我个人还是比较偏爱深色系的主题。
|
||||
|
||||
小伙伴们比较喜欢哪款主题呢?可以在评论区简单聊聊不?如果你还有其他比较喜欢的主题也可以在评论区说出来供大家参考哦!
|
@ -1,140 +0,0 @@
|
||||
---
|
||||
title: IDEA 代码优化插件推荐
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
- 代码优化
|
||||
---
|
||||
|
||||
## Lombok:帮你简化代码
|
||||
|
||||
之前没有推荐这个插件的原因是觉得已经是人手必备的了。如果你要使用 Lombok 的话,不光是要安装这个插件,你的项目也要引入相关的依赖。
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
使用 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 还支持代码智能搜索,直接选中对应的类或者方法即可搜索相关的代码示例。
|
||||
|
||||

|
||||
|
||||
如果你觉得 IDEA 插件安装的太多比较卡顿的话,不用担心!Codota 插件还有一个对应的在线网站([https://www.codota.com/code](https://www.codota.com/code)),在这个网站上你可以根据代码关键字搜索相关代码示例,非常不错!
|
||||
|
||||
我在工作中经常会用到,说实话确实给我带来了很大便利,比如我们搜索 `Files.readAllLines`相关的代码,搜索出来的结果如下图所示:
|
||||
|
||||

|
||||
|
||||
另外,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) 。非常推荐安装!
|
||||
|
||||
安装完成之后建议将与语言替换成中文,提示更加友好一点。
|
||||
|
||||

|
||||
|
||||
根据官方描述:
|
||||
|
||||
> 目前这个插件实现了开发手册中的的 53 条规则,大部分基于 PMD 实现,其中有 4 条规则基于 IDEA 实现,并且基于 IDEA [Inspection](https://www.jetbrains.com/help/idea/code-inspection.html)实现了实时检测功能。部分规则实现了 Quick Fix 功能,对于可以提供 Quick Fix 但没有提供的,我们会尽快实现,也欢迎有兴趣的同学加入进来一起努力。 目前插件检测有两种模式:实时检测、手动触发。
|
||||
|
||||
上述提到的开发手册也就是在 Java 开发领域赫赫有名的《阿里巴巴 Java 开发手册》。
|
||||
|
||||
### 手动配置检测规则
|
||||
|
||||
你还可以手动配置相关 inspection 规则:
|
||||
|
||||

|
||||
|
||||
### 使用效果
|
||||
|
||||
这个插件会实时检测出我们的代码不匹配它的规则的地方,并且会给出修改建议。比如我们按照下面的方式去创建线程池的话,这个插件就会帮我们检测出来,如下图所示。
|
||||
|
||||

|
||||
|
||||
这个可以对应上 《阿里巴巴 Java 开发手册》 这本书关于创建线程池的方式说明。
|
||||
|
||||

|
||||
|
||||
## 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 插件的话可以非常直观的将项目中存在格式问题的地方显示出来。
|
||||
|
||||

|
||||
|
||||
如果你只是自己在本地使用,并不想在项目中集成 Checksytle 的话也可以,只需要下载一个 Checksytle 插件就足够了。
|
||||
|
||||
### 如何安装?
|
||||
|
||||
我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。
|
||||
|
||||

|
||||
|
||||
安装插件之后重启 IDEA,你会发现就可以在底部菜单栏找到 CheckStyle 了。
|
||||
|
||||

|
||||
|
||||
### 如何自定义检测规则?
|
||||
|
||||
如果你需要自定义代码格式检测规则的话,可以按照如下方式进行配置(你可以导入用于自定义检测规则的`CheckStyle.xml`文件)。
|
||||
|
||||

|
||||
|
||||
### 使用效果
|
||||
|
||||
配置完成之后,按照如下方式使用这个插件!
|
||||
|
||||

|
||||
|
||||
可以非常清晰的看到:CheckStyle 插件已经根据我们自定义的规则将项目中的代码存在格式问题的地方都检测了出来。
|
||||
|
||||
## SonarLint:帮你优化代码
|
||||
|
||||
SonarLint 帮助你发现代码的错误和漏洞,就像是代码拼写检查器一样,SonarLint 可以实时显示出代码的问题,并提供清晰的修复指导,以便你提交代码之前就可以解决它们。
|
||||
|
||||

|
||||
|
||||
并且,很多项目都集成了 SonarQube,SonarLint 可以很方便地与 SonarQube 集成。
|
@ -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。
|
||||
|
||||

|
||||
|
||||
通过这个插件,你可以将 IDEA 背景设置为指定的图片,支持随机背景。
|
||||
|
||||
效果图如下:
|
||||
|
||||

|
||||
|
||||
如果你想要设置随机背景的话,可以通过 IDEA 设置页 **Settings** -> **Appearance & Behaviour** -> **Background Image Plus** 自定义设置项,随机显示目录下的图片为背景图。
|
||||
|
||||
## Power Mode II : 代码特效
|
||||
|
||||
使用了这个插件之后,写代码会自带特效,适用于 2021.x 版本的 IDEA。 2021.x 版本之前,可以使用 **activate-power-mode** 。
|
||||
|
||||

|
||||
|
||||
你可以通过 IDEA 设置页 **Settings** -> **Appearance & Behaviour** -> **Power Mode II** 自定义设置项。
|
||||
|
||||

|
||||
|
||||
## Nyan Progress Bar : 进度条美化
|
||||
|
||||
可以让你拥有更加漂亮的进度条。
|
||||
|
||||

|
||||
|
||||
## Grep Console:控制台输出处理
|
||||
|
||||
可以说是必备的一个 IDEA 插件,非常实用!
|
||||
|
||||
这个插件主要的功能有两个:
|
||||
|
||||
**1. 自定义设置控制台输出颜色**
|
||||
|
||||
我们可以在设置中进行相关的配置:
|
||||
|
||||

|
||||
|
||||
配置完成之后的 log warn 的效果对比图如下:
|
||||
|
||||

|
||||
|
||||
**2. 过滤控制台输出**
|
||||
|
||||

|
||||
|
||||
## Rainbow Brackets : 彩虹括号
|
||||
|
||||
使用各种鲜明的颜色来展示你的括号,效果图如下。可以看出代码层级变得更加清晰了,可以说非常实用友好了!
|
||||
|
||||

|
@ -1,93 +0,0 @@
|
||||
---
|
||||
title: jclasslib :一款IDEA字节码查看神器
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
- 字节码
|
||||
---
|
||||
|
||||
由于后面要分享的一篇文章中用到了这篇文章要推荐的一个插件,所以这里分享一下。非常实用!你会爱上它的!
|
||||
|
||||

|
||||
|
||||
**开始推荐 IDEA 字节码查看神器之前,先来回顾一下 Java 字节码是啥。**
|
||||
|
||||
## 何为 Java 字节码?
|
||||
|
||||
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
|
||||
|
||||
**什么是字节码?采用字节码的好处是什么?**
|
||||
|
||||
> 在 Java 中,JVM 可以理解的代码就叫做`字节码`(即扩展名为 `.class` 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
|
||||
|
||||
**Java 程序从源代码到运行一般有下面 3 步:**
|
||||
|
||||

|
||||
|
||||
## 为什么要查看 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 查看某个类对应的字节码文件。
|
||||
|
||||
> 需要注意的是:**查看某个类对应的字节码文件之前确保它已经被编译过。**
|
||||
|
||||

|
||||
|
||||
稍等几秒钟之后,你就可以直观到看到对应的类的字节码内容了。
|
||||
|
||||

|
||||
|
||||
从字节码中可以看出,我圈出来的位置发生了 **拆箱操作** 。
|
||||
|
||||
> - **装箱**:将基本类型用它们对应的引用类型包装起来;
|
||||
> - **拆箱**:将包装类型转换为基本数据类型;
|
||||
|
||||
详细解释下就是:`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` 不光可以直观地查看某个类对应的字节码文件,还可以查看类的基本信息、常量池、接口、属性、函数等信息。**
|
||||
|
||||

|
||||
|
||||
我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。
|
||||
|
||||

|
||||
|
||||
安装完成之后,重启 IDEA。点击`View -> Show Bytecode With jclasslib` 即可通过`jclasslib` 查看某个类对应的字节码文件。
|
||||
|
||||

|
@ -1,19 +0,0 @@
|
||||
---
|
||||
title: Maven Helper:解决 Maven 依赖冲突问题
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
- Maven
|
||||
---
|
||||
|
||||
|
||||
**Maven Helper** 主要用来分析 Maven 项目的相关依赖,可以帮助我们解决 Maven 依赖冲突问题。
|
||||
|
||||

|
||||
|
||||
**何为依赖冲突?**
|
||||
|
||||
说白了就是你的项目使用的 2 个 jar 包引用了同一个依赖 h,并且 h 的版本还不一样,这个时候你的项目就存在两个不同版本的 h。这时 Maven 会依据依赖路径最短优先原则,来决定使用哪个版本的 Jar 包,而另一个无用的 Jar 包则未被使用,这就是所谓的依赖冲突。
|
||||
|
||||
大部分情况下,依赖冲突可能并不会对系统造成什么异常,因为 Maven 始终选择了一个 Jar 包来使用。但是,不排除在某些特定条件下,会出现类似找不到类的异常,所以,只要存在依赖冲突,在我看来,最好还是解决掉,不要给系统留下隐患。
|
@ -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. ......
|
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 309 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 886 KiB |
Before Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 4.1 MiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 546 KiB |
Before Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 84 KiB |
@ -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)手动下载安装。
|
||||
|
||||

|
||||
|
||||
### 简单使用
|
||||
|
||||
#### URL 跳转到对应方法
|
||||
|
||||
根据 URL 直接跳转到对应的方法定义 (Windows: `ctrl+\` or `ctrl+alt+n` Mac:`command+\` or `command+alt+n` )并且提供了一个服务的树形可视化显示窗口。 如下图所示。
|
||||
|
||||

|
||||
|
||||
#### 作为 HTTP 请求工具
|
||||
|
||||
这个插件还可以作为一个简单的 http 请求工具来使用。如下图所示。
|
||||
|
||||

|
||||
|
||||
#### 复制生成 URL、复制方法参数...
|
||||
|
||||
这个插件还提供了生成 URL、查询参数、请求体(RequestBody)等功能。
|
||||
|
||||
举个例子。我们选中 `Controller` 中的某个请求对应的方法右击,你会发现多了几个可选项。当你选择`Generate & Copy Full URL`的话,就可以把整个请求的路径直接复制下来。eg:`http://localhost:9333/api/users?pageNum=1&pageSize=1` 。
|
||||
|
||||

|
||||
|
||||
#### 将 Java 类转换为对应的 JSON 格式
|
||||
|
||||
这个插件还为 Java 类上添加了 **Convert to JSON** 功能 。
|
||||
|
||||
我们选中的某个类对应的方法然后右击,你会发现多了几个可选项。
|
||||
|
||||

|
||||
|
||||
当我们选择`Convert to JSON`的话,你会得到如下 json 类型的数据:
|
||||
|
||||
```json
|
||||
{
|
||||
"username": "demoData",
|
||||
"password": "demoData",
|
||||
"rememberMe": true
|
||||
}
|
||||
```
|
||||
|
||||
## 后记
|
||||
|
||||
RESTFulToolkit 原作者不更新了,IDEA.201 及以上版本不再适配。
|
||||
|
||||
因此,国内就有一个大佬参考 RESTFulToolkit 开发了一款类似的插件——RestfulTool(功能较少一些,不过够用了)。
|
||||
|
||||

|
@ -1,23 +0,0 @@
|
||||
---
|
||||
title: Save Actions:优化文件保存
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
真必备插件!可以帮助我们在保存文件的时候:
|
||||
|
||||
1. 优化导入;
|
||||
2. 格式化代码;
|
||||
3. 执行一些quick fix
|
||||
4. ......
|
||||
|
||||
这个插件是支持可配置的,我的配置如下:
|
||||
|
||||

|
||||
|
||||
实际使用效果如下:
|
||||
|
||||

|
@ -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 调用关系之说。
|
||||
|
||||
再举两个例子来说一下!
|
||||
|
||||
下图是微信支付的业务流程时序图。这个图描述了微信支付相关角色(顾客,商家...)在微信支付场景下,基础支付和支付的的顺序调用关系。
|
||||
|
||||

|
||||
|
||||
下图是我写的一个 HTTP 框架中的执行某个方法的序列图。这个图描述了我们在调用 `InterceptorFactory`类的 `loadInterceptors()` 方法的时候,所涉及到的类之间的调用关系。
|
||||
|
||||

|
||||
|
||||
另外,国内一般更喜欢称呼序列图为"时序图"。
|
||||
|
||||
- 如果你按照纯翻译的角度来说, sequence 这个单词并无"时间"的意思,只有序列,顺序等意思,因此也有人说“时序图”的说法是不准确的。
|
||||
- 如果从定义角度来说,时序图这个描述是没问题的。因为 Sequence Diagram 中每条消息的触发时机确实是按照时间顺序执行的。
|
||||
|
||||
我觉得称呼 Sequence Diagram 为时序图或者序列图都是没问题的,不用太纠结。
|
||||
|
||||
## 哪些场景下需要查看类的时序图?
|
||||
|
||||
我们在很多场景下都需要时序图,比如说:
|
||||
|
||||
1. **阅读源码** :阅读源码的时候,你可能需要查看调用目标方法涉及的相关类的调用关系。特别是在代码的调用层级比较多的时候,对于我们理解源码非常有用。(_题外话:实际工作中,大部分时间实际我们都花在了阅读理解已有代码上。_)
|
||||
2. **技术文档编写** :我们在写项目介绍文档的时候,为了让别人更容易理解你的代码,你需要根据核心方法为相关的类生成时序图来展示他们之间的调用关系。
|
||||
3. **梳理业务流程** :当我们的系统业务流程比较复杂的时候,我们可以通过序列图将系统中涉及的重要的角色和对象的之间关系可视化出来。
|
||||
4. ......
|
||||
|
||||
## 如何使用 IDEA 根据类中方法生成时序图?
|
||||
|
||||
**通过 SequenceDiagram 这个插件,我们一键可以生成时序图。**
|
||||
|
||||
并且,你还可以:
|
||||
|
||||
1. 点击时序图中的类/方法即可跳转到对应的地方。
|
||||
2. 从时序图中删除对应的类或者方法。
|
||||
3. 将生成的时序图导出为 PNG 图片格式。
|
||||
|
||||
### 安装
|
||||
|
||||
我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。
|
||||
|
||||
> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过[IDEA 插件市场的官网](https://plugins.jetbrains.com/idea)手动下载安装。
|
||||
|
||||

|
||||
|
||||
### 简单使用
|
||||
|
||||
1. 选中方法名(注意不要选类名),然后点击鼠标右键,选择 **Sequence Diagram** 选项即可!
|
||||
|
||||

|
||||
|
||||
2. 配置生成的序列图的一些基本的参数比如调用深度之后,我们点击 ok 即可!
|
||||
|
||||

|
||||
|
||||
你还可以通过生成的时序图来定位到相关的代码,这对于我们阅读源码的时候尤其有帮助!
|
||||
|
||||

|
||||
|
||||
时序图生成完成之后,你还可以选择将其导出为图片。
|
||||
|
||||

|
@ -1,56 +0,0 @@
|
||||
---
|
||||
title: IDEA 快捷键相关插件
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
相信我!下面这两个一定是IDEA必备的插件。
|
||||
|
||||
## Key Promoter X:快捷键提示
|
||||
|
||||
这个插件的功能主要是**在你本可以使用快捷键操作的地方提醒你用快捷键操作。**
|
||||
|
||||
举个例子。我直接点击tab栏下的菜单打开 Version Control(版本控制) 的话,这个插件就会提示你可以用快捷键 `command+9`或者`shift+command+9`打开。如下图所示。
|
||||
|
||||

|
||||
|
||||
除了这个很棒的功能之外,这个插件还有一个功能我觉得非常棒。
|
||||
|
||||
它可以展示出哪些快捷键你忘记使用的次数最多!这样的话,你可以给予你忘记次数最多的那些快捷键更多的关注。
|
||||
|
||||
我忘记最多的快捷键是debug的时候经常使用的 F8(Step Over)。如下图所示。
|
||||
|
||||

|
||||
|
||||
关于快捷键,很多人不愿意去记,觉得单纯靠鼠标就完全够了。
|
||||
|
||||
让我来说的话!我觉得如果你偶尔使用一两次 IDEA 的话,你完全没有必要纠结快捷键。
|
||||
|
||||
但是,如果 IDEA 是你开发的主力,你经常需要使用的话,相信我,掌握常用的一些快捷键真的很重要!
|
||||
|
||||
不说多的,**熟练掌握IDEA的一些最常见的快捷键,你的工作效率至少提升 30 %。**
|
||||
|
||||
**除了工作效率的提升之外,使用快捷键会让我们显得更加专业。**
|
||||
|
||||
你在使用快捷键进行操作的时候,是很帅,很酷啊!但是,当你用 IDEA 给别人演示一些操作的时候,你使用了快捷键的话,别人可能根本不知道你进行了什么快捷键操作。
|
||||
|
||||
**怎么解决这个问题呢?**
|
||||
|
||||
很简单!这个时候就轮到 **Presentation Assistant** 这个插件上场了!
|
||||
|
||||
## Presentation Assistant:快捷键展示
|
||||
|
||||
安装这个插件之后,你使用的快捷键操作都会被可视化地展示出来,非常适合自己在录制视频或者给别人展示代码的时候使用。
|
||||
|
||||
举个例子。我使用快捷键 `command+9`打开 Version Control ,使用了这个插件之后的效果如下图所示。
|
||||
|
||||

|
||||
|
||||
从上图可以很清晰地看到,IDEA 的底部中间的位置将我刚刚所使用的快捷键给展示了出来。
|
||||
|
||||
并且,**这个插件会展示出 Mac 和 Win/Linux 两种不同的版本的快捷键。**
|
||||
|
||||
因此,不论你的操作系统是 Mac 还是 Win/Linux ,这款插件都能满足你的需求。
|
@ -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)`** (如果你忘记了快捷的话,鼠标右键操作即可!)
|
||||
|
||||

|
||||
|
||||
**如果需要快速打开翻译框,使用快捷键`command+ctrl+i(mac)`/`ctrl + shift + o(win/linux)`**
|
||||
|
||||

|
||||
|
||||
如果你需要将某个重要的单词添加到生词本的话,只需要点击单词旁边的收藏按钮即可!
|
@ -1,299 +0,0 @@
|
||||
# IDEA 插件开发入门
|
||||
|
||||
我这个人没事就喜欢推荐一些好用的 [IDEA 插件](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1319419426898329600&__biz=Mzg2OTA0Njk0OA==#wechat_redirect)给大家。这些插件极大程度上提高了我们的生产效率以及编码舒适度。
|
||||
|
||||
**不知道大家有没有想过自己开发一款 IDEA 插件呢?**
|
||||
|
||||
我自己想过,但是没去尝试过。刚好有一位读者想让我写一篇入门 IDEA 开发的文章,所以,我在周末就花了一会时间简单了解一下。
|
||||
|
||||

|
||||
|
||||
不过,**这篇文章只是简单带各位小伙伴入门一下 IDEA 插件开发**,个人精力有限,暂时不会深入探讨太多。如果你已经有 IDEA 插件开发的相关经验的话,这篇文章就可以不用看了,因为会浪费你 3 分钟的时间。
|
||||
|
||||
好的废话不多说!咱们直接开始!
|
||||
|
||||
## 01 新建一个基于 Gradle 的插件项目
|
||||
|
||||
这里我们基于 Gradle 进行插件开发,这也是 IntelliJ 官方的推荐的插件开发解决方案。
|
||||
|
||||
**第一步,选择 Gradle 项目类型并勾选上相应的依赖。**
|
||||
|
||||

|
||||
|
||||
**第二步,填写项目相关的属性比如 GroupId、ArtifactId。**
|
||||
|
||||

|
||||
|
||||
**第三步,静静等待项目下载相关依赖。**
|
||||
|
||||
第一次创建 IDEA 插件项目的话,这一步会比较慢。因为要下载 IDEA 插件开发所需的 SDK 。
|
||||
|
||||
## 02 插件项目结构概览
|
||||
|
||||
新建完成的项目结构如下图所示。
|
||||
|
||||

|
||||
|
||||
这里需要额外注意的是下面这两个配置文件。
|
||||
|
||||
**`plugin.xml` :插件的核心配置文件。通过它可以配置插件名称、插件介绍、插件作者信息、Action 等信息。**
|
||||
|
||||
```xml
|
||||
<idea-plugin>
|
||||
<id>github.javaguide.my-first-idea-plugin</id>
|
||||
<!--插件的名称-->
|
||||
<name>Beauty</name>
|
||||
<!--插件的作者相关信息-->
|
||||
<vendor email="koushuangbwcx@163.com" url="https://github.com/Snailclimb">JavaGuide</vendor>
|
||||
<!--插件的介绍-->
|
||||
<description><![CDATA[
|
||||
Guide哥代码开发的第一款IDEA插件<br>
|
||||
<em>这尼玛是什么垃圾插件!!!</em>
|
||||
]]></description>
|
||||
|
||||
<!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
|
||||
on how to target different products -->
|
||||
<depends>com.intellij.modules.platform</depends>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<!-- Add your extensions here -->
|
||||
</extensions>
|
||||
|
||||
<actions>
|
||||
<!-- Add your actions here -->
|
||||
</actions>
|
||||
</idea-plugin>
|
||||
```
|
||||
|
||||
**`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.<br>
|
||||
<em>most HTML tags may be used</em>"""
|
||||
}
|
||||
```
|
||||
|
||||
没有开发过 IDEA 插件的小伙伴直接看这两个配置文件内容可能会有点蒙。所以,我专门找了一个 IDEA 插件市场提供的现成插件来说明一下。小伙伴们对照下面这张图来看下面的配置文件内容就非常非常清晰了。
|
||||
|
||||

|
||||
|
||||
这就非常贴心了!如果这都不能让你点赞,我要这文章有何用!
|
||||
|
||||

|
||||
|
||||
## 03 手动创建 Action
|
||||
|
||||
我们可以把 Action 看作是 IDEA 提供的事件响应处理器,通过 Action 我们可以自定义一些事件处理逻辑/动作。比如说你点击某个菜单的时候,我们进行一个展示对话框的操作。
|
||||
|
||||
**第一步,右键`java`目录并选择 new 一个 Action**
|
||||
|
||||
.png>)
|
||||
|
||||
**第二步,配置 Action 相关信息比如展示名称。**
|
||||
|
||||
.png>)
|
||||
|
||||
创建完成之后,我们的 `plugin.xml` 的 `<actions>`节点下会自动生成我们刚刚创建的 Action 信息:
|
||||
|
||||
```xml
|
||||
<actions>
|
||||
<!-- Add your actions here -->
|
||||
<action id="test.hello" class="HelloAction" text="Hello" description="IDEA插件入门">
|
||||
<add-to-group group-id="ToolsMenu" anchor="first"/>
|
||||
</action>
|
||||
</actions>
|
||||
```
|
||||
|
||||
并且 `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 这个菜单下。
|
||||
|
||||

|
||||
|
||||
再举个例子。加入我上面创建的 Action 所属的 Group 是**MainMenu** (IDEA 最上方的主菜单栏)下的 **FileMenu(File)** 的话。
|
||||
|
||||
```xml
|
||||
<actions>
|
||||
<!-- Add your actions here -->
|
||||
<action id="test.hello" class="HelloAction" text="Hello" description="IDEA插件入门">
|
||||
<add-to-group group-id="FileMenu" anchor="first"/>
|
||||
</action>
|
||||
</actions>
|
||||
```
|
||||
|
||||
我们创建的 Action 所在的位置就在 File 这个菜单下。
|
||||
|
||||

|
||||
|
||||
## 04 验收成果
|
||||
|
||||
点击 `Gradle -> Tasks -> intellij -> runIde` 就会启动一个默认了这个插件的 IDEA。然后,你可以在这个 IDEA 上实际使用这个插件了。
|
||||
|
||||

|
||||
|
||||
效果如下:
|
||||
|
||||

|
||||
|
||||
我们点击自定义的 Hello Action 的话就会弹出一个对话框并展示出我们自定义的信息。
|
||||
|
||||

|
||||
|
||||
## 05 完善一下
|
||||
|
||||
想要弄点界面花里胡哨一下, 我们还可以通过 Swing 来写一个界面。
|
||||
|
||||
这里我们简单实现一个聊天机器人。代码的话,我是直接参考的我大二刚学 Java 那会写的一个小项目(_当时写的代码实在太烂了!就很菜!_)。
|
||||
|
||||

|
||||
|
||||
首先,你需要在[图灵机器人官网](http://www.tuling123.com/ "图灵机器人官网")申请一个机器人。(_其他机器人也一样,感觉这个图灵机器人没有原来好用了,并且免费调用次数也不多_)
|
||||
|
||||

|
||||
|
||||
然后,简单写一个方法来请求调用机器人。由于代码比较简单,我这里就不放出来了,大家简单看一下效果就好。
|
||||
|
||||

|
||||
|
||||
## 06 打包分发
|
||||
|
||||
插件写好之后,如果我们想把插件分享给小伙伴使用的话要怎么做呢。
|
||||
|
||||
### 首先,我们要打包插件
|
||||
|
||||
执行 Gradle -> Tasks -> intellij -> buildPlugin
|
||||
|
||||
执行完成后,项目中会生成一个 build 文件夹,点击进入后找到 distributions 文件夹,里面会出现一个 .zip 结尾的压缩包,里面打包了插件所需要的依赖、配置文件等。
|
||||
|
||||
### 其次,分发插件
|
||||
|
||||
打开 IDEA,在 Settings -> Plugins -> 点击小齿轮后选择 Install Plugin From Disk
|
||||

|
||||
|
||||
### 最后,提交至官网
|
||||
|
||||
这步并不是必须的,如果你想把你的插件发布到官网上,别人直接可以在 [应用市场](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 就可以了
|
@ -1,75 +0,0 @@
|
||||
# IDEA 重构入门
|
||||
|
||||
我们在使用 IDEA 进行重构之前,先介绍一个方便我们进行重构的快捷键:`ctrl+t(mac)/ctrl+shift+alt+t`(如果忘记快捷键的话,鼠标右键也能找到重构选项),使用这个快捷键可以快速调出常用重构的选项,如下图所示:
|
||||
|
||||

|
||||
|
||||
### 重命名(rename)
|
||||
|
||||
快捷键:**Shift + F6(mac) / Shift + F6(windows/Linux):** 对类、变量或者方法名重命名。
|
||||
|
||||

|
||||
|
||||
### 提取相关重构手段
|
||||
|
||||
这部分的快捷键实际很好记忆,我是这样记忆的:
|
||||
|
||||
前面两个键位是 `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)`
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取参数(exact parameter)
|
||||
|
||||
1. **使用场景** :提取参数到方法中。
|
||||
2. **快捷键:** `command + option+ p(mac)/ ctrl + alt + p(Windows/Linux)`
|
||||
|
||||

|
||||
|
||||
#### 提取变量(exact variable)
|
||||
|
||||
1. **使用场景** :提取多次出现的表达式。
|
||||
2. **快捷键:** `command + option+ v(mac) / ctrl + alt + v(Windows/Linux) `
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取属性(exact field)
|
||||
|
||||
1. **使用场景** :把当前表达式提取成为类的一个属性。
|
||||
2. **快捷键:** `command + option+ f(mac) / ctrl + alt + f(Windows/Linux) `
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取方法(exact method)
|
||||
|
||||
1. **使用场景** :1个或者多个表达式可以提取为一个方法。 提取方法也能使得你的编码更易读,更加语义化。
|
||||
2. **快捷键:** `command + option+ m(mac)/ ctrl + alt + m(Windows/Linux)`
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取接口(exact interface)
|
||||
|
||||
1. **使用场景** :想要把一个类中的1个或多个方法提取到一个接口中的时候。
|
||||
2. **快捷键:** `command + option+ m(mac)/ ctrl + alt + m(Windows/Linux)`
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
@ -1,189 +0,0 @@
|
||||
# IDEA源码阅读技巧
|
||||
|
||||
项目有个新来了一个小伙伴,他看我查看项目源代码的时候,各种骚操作“花里胡哨”的。于是他向我请教,想让我分享一下我平时使用 IDEA 看源码的小技巧。
|
||||
|
||||
## 基本操作
|
||||
|
||||
这一部分的内容主要是一些我平时看源码的时候常用的快捷键/小技巧!非常好用!
|
||||
|
||||
掌握这些快捷键/小技巧,看源码的效率提升一个等级!
|
||||
|
||||
### 查看当前类的层次结构
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------- |
|
||||
| ⭐⭐⭐⭐⭐ | `Ctrl + H` |
|
||||
|
||||
平时,我们阅读源码的时候,经常需要查看类的层次结构。就比如我们遇到抽象类或者接口的时候,经常需要查看其被哪些类实现。
|
||||
|
||||
拿 Spring 源码为例,`BeanDefinition` 是一个关于 Bean 属性/定义的接口。
|
||||
|
||||
```java
|
||||
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
|
||||
......
|
||||
}
|
||||
```
|
||||
|
||||
如果我们需要查看 `BeanDefinition` 被哪些类实现的话,只需要把鼠标移动到 `BeanDefinition` 类名上,然后使用快捷键 `Ctrl + H` 即可。
|
||||
|
||||

|
||||
|
||||
同理,如果你想查看接口 `BeanDefinition` 继承的接口 `AttributeAccessor` 被哪些类实现的话,只需要把鼠标移动到 `AttributeAccessor` 类名上,然后使用快捷键 `Ctrl + H` 即可。
|
||||
|
||||
### 查看类结构
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ------------------------------------- |
|
||||
| ⭐⭐⭐⭐ | `Alt + 7`(Win) / `Command +7` (Mac) |
|
||||
|
||||
类结构可以让我们快速了解到当前类的方法、变量/常量,非常使用!
|
||||
|
||||
我们在对应的类的任意位置使用快捷键 `Alt + 7`(Win) / `Command +7` (Mac)即可。
|
||||
|
||||

|
||||
|
||||
### 快速检索类
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------------------------------------- |
|
||||
| ⭐⭐⭐⭐⭐ | `Ctrl + N` (Win) / `Command + O` (Mac) |
|
||||
|
||||
使用快捷键 `Ctrl + N` (Win) / `Command + O` (Mac)可以快速检索类/文件。
|
||||
|
||||

|
||||
|
||||
### 关键字检索
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------- |
|
||||
| ⭐⭐⭐⭐⭐ | 见下文 |
|
||||
|
||||
- 当前文件下检索 : `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()` 方法就有多个不同的实现。
|
||||
|
||||

|
||||
|
||||
### 查看方法被使用的情况
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------- |
|
||||
| ⭐⭐⭐⭐ | `Alt + F7` |
|
||||
|
||||
我们可以通过直接在方法名上使用快捷键 `Alt + F7` 来查看这个方法在哪些地方被调用过。
|
||||
|
||||

|
||||
|
||||
### 查看最近使用的文件
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | -------------------------------------- |
|
||||
| ⭐⭐⭐⭐⭐ | `Ctrl + E`(Win) / `Command +E` (Mac) |
|
||||
|
||||
你可以通过快捷键 `Ctrl + E`(Win) / `Command +E` (Mac)来显示 IDEA 最近使用的一些文件。
|
||||
|
||||

|
||||
|
||||
### 查看图表形式的类继承链
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ------------------------ |
|
||||
| ⭐⭐⭐⭐ | 相关快捷键较多,不建议记 |
|
||||
|
||||
点击类名 **右键** ,选择 **Shw Diagrams** 即可查看图表形式的类继承链。
|
||||
|
||||

|
||||
|
||||
你还可以对图表进行一些操作。比如,你可以点击图表中具体的类 **右键**,然后选择显示它的实现类或者父类。
|
||||
|
||||

|
||||
|
||||
再比如你还可以选择是否显示类中的属性、方法、内部类等等信息。
|
||||
|
||||

|
||||
|
||||
如果你想跳转到对应类的源码的话,直接点击图表中具体的类 **右键** ,然后选择 **Jump to Source** 。
|
||||
|
||||

|
||||
|
||||
## 插件推荐
|
||||
|
||||
### 一键生成方法的序列图
|
||||
|
||||
**序列图**(Sequence Diagram),亦称为**循序图**,是一种 UML 行为图。表示系统执行某个方法/操作(如登录操作)时,对象之间的顺序调用关系。
|
||||
|
||||
这个顺序调用关系可以这样理解:你需要执行系统中某个对象 a 提供的方法/操作 login(登录),但是这个对象又依赖了对象 b 提供的方法 getUser(获取用户)。因此,这里就有了 a -> b 调用关系之说。
|
||||
|
||||
我们可以通过 **SequenceDiagram** 这个插件一键生成方法的序列图。
|
||||
|
||||
> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过 IDEA 插件市场的官网手动下载安装。
|
||||
|
||||

|
||||
|
||||
**如何使用呢?**
|
||||
|
||||
1、选中方法名(注意不要选类名),然后点击鼠标右键,选择 **Sequence Diagram** 选项即可!
|
||||
|
||||

|
||||
|
||||
2、配置生成的序列图的一些基本的参数比如调用深度之后,我们点击 ok 即可!
|
||||
|
||||

|
||||
|
||||
3、你还可以通过生成的时序图来定位到相关的代码,这对于我们阅读源码的时候尤其有帮助!
|
||||
|
||||

|
||||
|
||||
4、时序图生成完成之后,你还可以选择将其导出为图片。
|
||||
|
||||

|
||||
|
||||
相关阅读:[《安利一个 IDEA 骚操作:一键生成方法的序列图》](https://mp.weixin.qq.com/s/SG1twZczqdup_EQAOmNERg) 。
|
||||
|
||||
### 项目代码统计
|
||||
|
||||
为了快速分析项目情况,我们可以对项目的 **代码的总行数、单个文件的代码行数、注释行数等信息进行统计。**
|
||||
|
||||
**Statistic** 这个插件来帮助我们实现这一需求。
|
||||
|
||||

|
||||
|
||||
有了这个插件之后你可以非常直观地看到你的项目中所有类型的文件的信息比如数量、大小等等,可以帮助你更好地了解你们的项目。
|
||||
|
||||

|
||||
|
||||
你还可以使用它看所有类的总行数、有效代码行数、注释行数、以及有效代码比重等等这些东西。
|
||||
|
||||

|
||||
|
||||
如果,你担心插件过多影响 IDEA 速度的话,可以只在有代码统计需求的时候开启这个插件,其他时间禁用它就完事了!
|
||||
|
||||
相关阅读:[快速识别烂项目!试试这款项目代码统计 IDEA 插件](https://mp.weixin.qq.com/s/fVEeMW6elhu79I-rTZB40A)
|
||||
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 276 KiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 509 KiB |
Before Width: | Height: | Size: 324 KiB |
Before Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 218 KiB |
Before Width: | Height: | Size: 127 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 311 KiB |
@ -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)
|
||||
|
14
docs/interview-preparation/interview-experience.md
Normal file
@ -0,0 +1,14 @@
|
||||
---
|
||||
title: 优质面经
|
||||
category: 知识星球
|
||||
---
|
||||
|
||||
古人云:“**他山之石,可以攻玉**” 。善于学习借鉴别人的面试的成功经验或者失败的教训,可以让自己少走许多弯路。
|
||||
|
||||
在 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的 **「面经篇」** ,我分享了 10+ 篇高质量的面经:
|
||||
|
||||

|
||||
|
||||
并且,[知识星球](../about-the-author/zhishixingqiu-two-years.md)还有专门分享面经和面试题的专题,里面会分享很多优质的面经和面试题。
|
||||
|
||||

|
@ -0,0 +1,16 @@
|
||||
---
|
||||
title: 手把手教你如何准备面试
|
||||
category: 知识星球
|
||||
---
|
||||
|
||||
在 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的 **「面试准备篇」** ,我写了 10+ 篇文章手把手教你如何准备面试:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这个系列涵盖项目经验、简历编写、源码学习、算法准备、面试资源等内容。
|
||||
|
||||
另外,考虑到很多小伙伴缺少项目经历,除了星球内部的 [《手写 RPC 框架》](../zhuanlan/handwritten-rpc-framework.md)之外,我还推荐了很多小众但优质的实战项目,有视频也有开源项目。
|
||||
|
||||

|
@ -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/#/) 的补充完善,两者可以配合使用。
|
||||
|
||||

|
||||
|
||||
我已经在星球更新了 **7** 个高质量的小册: **《Java 面试进阶指北》**(持续完善中)、 **《从零开始写一个 RPC 框架》**(已更新完) 、**《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**(持续完善)、**《分布式、高并发、Devops 知识扫盲》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)(持续完善中)。
|
||||
|
||||

|
||||
|
||||
如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。
|
||||
|
||||
星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”!
|
||||
|
||||

|
||||
|
||||
**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!**
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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.
|
||||
|
||||
先执行一部分的,先把返回的结果存到一段内存中;
|
||||
|
||||
示例:
|
||||
|
||||
|
@ -107,7 +107,7 @@ public interface RandomAccess {
|
||||
|
||||
查看源码我们发现实际上 `RandomAccess` 接口中什么都没有定义。所以,在我看来 `RandomAccess` 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。
|
||||
|
||||
在 `binarySearch()` 方法中,它要判断传入的 list 是否 `RamdomAccess` 的实例,如果是,调用`indexedBinarySearch()`方法,如果不是,那么调用`iteratorBinarySearch()`方法
|
||||
在 `binarySearch()` 方法中,它要判断传入的 list 是否 `RandomAccess` 的实例,如果是,调用`indexedBinarySearch()`方法,如果不是,那么调用`iteratorBinarySearch()`方法
|
||||
|
||||
```java
|
||||
public static <T>
|
||||
|
@ -228,7 +228,7 @@ Thread[线程 2,5,main]waiting get resource1
|
||||
|
||||
避免死锁就是在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。
|
||||
|
||||
**安全状态** 指的是系统能够按照某种进程推进顺序(P1、P2、P3.....Pn)来为每个进程分配所需资源,直到满足每个进程对资源的最大需求,使每个进程都可顺利完成。称<P1、P2、P3.....Pn>序列为安全序列。
|
||||
> **安全状态** 指的是系统能够按照某种线程推进顺序(P1、P2、P3.....Pn)来为每个线程分配所需资源,直到满足每个线程对资源的最大需求,使每个线程都可顺利完成。称<P1、P2、P3.....Pn>序列为安全序列。
|
||||
|
||||
我们对线程 2 的代码修改成下面这样就不会产生死锁了。
|
||||
|
||||
|
@ -184,7 +184,7 @@ JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、
|
||||
|
||||
#### 1.5.1. 两者都是可重入锁
|
||||
|
||||
**“可重入锁”** 指的是自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增 1,所以要等到锁的计数器下降为 0 时才能释放锁。
|
||||
**“可重入锁”** 指的是自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果是不可重入锁的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增 1,所以要等到锁的计数器下降为 0 时才能释放锁。
|
||||
|
||||
#### 1.5.2.synchronized 依赖于 JVM 而 ReentrantLock 依赖于 API
|
||||
|
||||
|
@ -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/) 生成的。
|
||||
|
||||
|
11
docs/open-source-project/big-data.md
Normal file
@ -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/)** : 一个分布式,高容错的实时计算系统。
|
||||
|
10
docs/open-source-project/machine-learning.md
Normal file
@ -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)
|
||||
|
63
docs/open-source-project/practical-project.md
Normal file
@ -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 数据库)。
|