下面特别的 emoji 标识
⛔:可以直接忽略
:特别重要
⭐、:重要
:待完善
:重要的子知识点
、、、:有趣的知识点
:踩坑
注:下面每个知识点都是可以点进去查看全文的,这里只是为了方便快速预览,所以把重要的知识点总结了出来~
Java 包装类相关的问题
主要知识点:
new String
的区别(建议去看下 JVM 那里的 String 常量部分) Java 反射学习
主要就是介绍了一下反射的常用方法,如何在运行时取得对象的信息(为代理模式打好了基础)
Java 时间处理相关学习
主要知识点:
Java 枚举的使用 ⭐
主要知识点:
Java 泛型
主要知识点:
Java JVM学习-JVM基本概念 ⭐
主要知识点:
Java JVM学习-类加载器 ⭐
主要就是理解 双亲委派机制 的工作原理,为下面类加载机制奠定了基础
Java JVM学习-类加载机制
主要知识点:
和
执行时机不同,主要就是理解静态方法\变量和普通方法\变量的区别) Java JVM学习-创建一个对象
讲述了一个 Java 对象是如何被创建出来的,以及 Java 对象头的内容,最后还补充了如何访问一个 Java 对象
Java JVM学习-虚拟机栈
Java 虚拟机栈是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。
Java JVM学习-堆的结构
一个 JVM 实例只存在一个堆内存,堆也是 Java内存管理的核心区域。“几乎” 所有的对象实例都在这里分配内存(JIT 编译器可能会把它丢到栈里面分配)
Java JVM学习-本地方法 ⛔
在学习方法区前先快速过一下本地方法区
Java JVM学习-方法区
方法区用于存储已被虚拟机加载的类型信息(构造方法 / 接口定义)、常量、静态变量、即时编译器编译后的代码缓存等。
Java JVM学习-String 字符串 ⭐
1.7 版本之后,字符串常量池已经转移到堆区,之前是永久代中,这里补充了一些常见面试题中 String 创建对象坑的理解
char[]
用于存储字符串数据。jdk9 时改为 byte[]
,且 String 声明为 final
)intern()
方法(把字符串丢到字符常量池中)new String()
创建了几个对象? intern()
使用JVM 垃圾回收部分
Java JVM学习-垃圾回收相关概念
这篇博客是一些零散的知识点,具体看下面的各小结:
Java JVM学习-堆的 GC 与调试工具 ⭐
这篇笔记主要记录了如何查看 GC,以及各种调试工具
Java JVM学习-垃圾回收相关算法
主要介绍了 GC 标记阶段 和 清除阶段 这两个阶段使用的算法:
Java JVM学习-垃圾回收器
这篇主要介绍了各种垃圾收集器的优缺点,以及如何选择
Java IO学习-字节流 和 Java IO学习-字符流 ⭐
这个没啥好说,BIO 的基础,主要知识点:
Java IO学习-打印流 ⛔
这个主要了解一下就行了,如果想要实现一个自己的日志框架之类的可以看一下里面的 “改变打印流向”
Java IO学习-File、Files、Path工具类
主要的文件操作工具类(例如递归删除之类的)
主要知识点:
下面开始 NIO 的部分了
Java IO学习-NIO 与 BIO 各种概念及区别
这篇主要介绍 NIO 和 BIO 的区别(Stream 与 Channel 的区别)
主要知识点:
Java IO学习-NIO 文件编程
这篇没啥重要的,主要介绍了一下 NIO 的零拷贝 API,以及文件传输咋用
主要知识点:
Java IO学习-NIO 核心组件及基本概念
这篇主要介绍了一下 NIO 的三大组件(Channel、Buffer、Selector)的关系
主要知识点:
Java IO学习-NIO 粘包与半包 ⛔
这篇了解就好,主要介绍了传输时会遇到的粘包与半包问题,以及如何解决它
Java IO学习-NIO 网络编程
这篇主要介绍了一下原生的 NIO 如何进行网络编程,以及 Selector 是如何处理事件的
主要知识点:
Java IO学习-NIO 网络编程(多线程优化)
看名字也知道,与上面那篇是姐妹篇,主要使用多线程进行优化,主线程配一个选择器(Boss),专门处理 accept 事件,以及创建工作线程(Worker),每个线程配一个选择器,轮流处理 read 事件
⚽ Java HTTP编程 ⛔
主要介绍了一下 Java 的原生的 HTTP 请求工具
Java Servlet 学习之环境配置 ⛔
简单的介绍了下如何配置 Servlet 环境
⚾ Java Servlet 学习之工作流程
一个 Servlet 生命周期的各个部分
Java TCP 编程
Java UDP编程
Netty 部分(因为使用不多,所以这部分待完善)
Java Netty 各组件的作用
Netty 的纵览,搞懂各个组件的作用是后面使用 Netty 的关键
Java Netty 的基本使用
如何使用 Netty
Java Netty 事件循环对象 EventLoop
Java Netty 通道 Channel
Java Netty 传输工具 ByteBuf
Java Netty 提供的几种传输包
Java Netty 使用 WebSocket
Java 集合类学习 通用接口
主要就是两个对象的比较接口的区别,继承 Comparable 这个接口后无需使用定制排序,直接默认调用排序接口就行了(自然排序),而 Comparator 接口主要用于定制排序
主要知识点:
Java 集合类学习 常用工具类
介绍了两个主要的操作集合和数组的工具类,经常使用
主要知识点:
Java 集合类学习 List 集合
主要介绍了一下 List 接口,以及 ArrayList 和 LinkedList 的结构
主要知识点:
Java 集合类学习 Deque 双端队列 ⛔
上接上面的 LinkedList,双端队列。Deque 既可以用作后进先出的栈,也可以用作先进先出的队列。主要看看如何使用
Java 集合类学习 Queue 队列 ⭐
主要介绍了一下阻塞队列的使用,然后拓展非阻塞队列(注意,队列实现类除了 PriorityQueue 都是线程安全的)
Java 集合类学习 PriorityQueue ⛔
PriorityQueue 就是堆这种数据结构在 Java 的实现类,一般用在一些算法问题上(例如:最小的 K 个数),补充:堆在 Java 中扩容是直接 原数组长度 * 2,所以插入 n 条元素就需要扩容 O ( l o g n ) O(logn) O(logn) 次
搭配以下文章食用:
Java 集合类学习 Set 集合
Set 集合与 List 集合的区别就是,Set 集合的元素不能重复,而且无法保证顺序(有顺序的叫做 SortedSet),Set 实际上相当于只存储 key、不存储 value 的 Map。
主要知识点:
Java 集合类学习 Map 集合
这篇主要介绍了一下常用的 Map 实现类,常用的 Map 有哪些,哪些场景应该使用哪种实现类
主要知识点:
Java HashMap 和 HashTable
HashMap 的原理几乎是面试必问的,所以这篇挺重要的。文章主要介绍了一下 HashMap 的实现原理,以及 JDK7 和 JDK8 它发生的变化。
主要知识点:
&
代替 %
操作,提高性能) Java 集合类学习 ConcurrentHashMap
这个和上面是一起考的,主要考察JDK7 和 JDK8 的区别。
Java 并发编程-啥是线程
主要介绍了线程的几种状态和如何切换的
Java 并发编程-核心理论
主要介绍了并发编程中的常见理论,重点看 “有序性”、“原子性”、“可见性” 这三个并发编程的重要特性
Java 并发编程-JMM 概念
理解 Java 内存模型(Java Memory Model,JMM)是后面学习各种锁的关键,例如内存不可见问题引申出了 volatile 关键词,运行时内存的划分知道了 JVM 哪些部分是私有的,哪些部分是公有的。
Java 并发编程-缓存一致性问题 ⛔
与上面是姐妹篇,但是这篇很多知识点并不完善,而且也太过底层,我自己也不确定讲述的是否正确,所以这篇笔记暂时先这样,以后学习到更多的知识再更新
Java 并发编程-多线程基础使用
主要介绍了一下基本的多线程接口
Java 并发编程-各种锁的概念
这篇笔记主要是下面学习的各种锁的基础,理解什么场景应该使用什么锁的关键
Java Unsafe类
这个算是 Java 中各种乐观锁以及原子操作的基石
Java 并发编程 CAS 乐观锁
主要介绍一下 CAS 乐观锁的原理
Java 并发编程-通信
一般经常考察的多线程使用都涉及到线程之间的通信,那有多少种方法呢?这篇就对这些操作进行了一次汇总
Java 并发编程-并发包下的工具类
这里介绍一下常用的并发编程工具,其实部分内容和上面 通信 那里讲的有点重合了,但是这里主要是汇总使用
Java 并发编程-synchronized关键字
这个 synchronized 关键字可以说是 Java 并发编程的第一颗了,使用它是很简单,但是要理解原理还是有很多知识点的
Java 并发编程-Lock 接口及其相关工具类
主要介绍一下 Lock 接口下的实现类,其实这里没有完全写完,关于 ReentrantLock 的部分太简陋了,以后再更新…
Java 并发编程-volatile关键字
这个关键字的学习应该联系上面的 JMM 一起食用,主要是为了解决指令重排和内存可见性的问题
Java 多线程-Atomic 原子操作类
保证原子操作的类型,即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。
Java 并发编程 AQS 同步队列
AQS 是 AbstractQueuedSynchronizer 的简称,即抽象队列同步器,它是 Lock 各个实现类的关键,用它可以配置多个线程竞争资源时是以何种策略取得资源的。
Java 多线程-ThreadLocal 的使用及原理
ThreadLocal 类可以给每个线程维护一个独立的变量副本,使多线程的场景使用共有的 ThreadLocal 变量,同时每个线程在 ThreadLocal 对象中保存的变量副本是相互隔离的。
线程池
Java 并发编程-线程池 ThreadPoolExecutor
ThreadPoolExecutor 是线程池的主要工具类
Java 多线程-线程池 submit 和 execute 方法
主要介绍了一下线程池如何取得返回值
Java 多线程-线程池 Executors 工具类
因为 ThreadPoolExecutor 参数太多,Executors 就是提供的默认的策略(用静态工厂模式)
Java 多线程-线程池 任务调度机制 ⛔
线程池的任务调度机制,对上面 ThreadPoolExecutor 这块的补充
Java 多线程-线程池之异步任务 ⛔
利用线程池实现一个简单 事件管理器
JDK8 之后的新特性记录
Collection#removeIf()
方法删除满足特定条件的元素Lambda 函数式接口
Java Stream 流式编程 ⭐
这个就是入门 Lambda 编程的第一步,因为经常用来操作集合,所以还是研究下
重点关注:
Java Optional 使用
主要用于非空判断
Hutool 工具库
Hutool 是一个 Java工具类库,通过静态方法封装一些常用的方法
Java 的 JSON 解析库 Jackson 学习
用来序列化和反序列化 JSON 的 Java开源框架
日志大礼包:
Lombok 常用方法
JUnit 编写单元测试
MySQL 的基本使用
MySQL 基本增删改
基本的增删改查如何写
delete
的方式清空表数据有个缺点,就是索引不是从零开始,所以这时就需要使用这个 truncate
关键字来清空表了MySQL 的查询语句~
having
关键字是对 group by
之后的结果进行筛选)MySQL 索引的使用~
MySQL 约束和级联操作 细节看: MySQL 学习(12)约束与触发器
常用约束
MySQL 学习(13)视图和分区表
MySQL 的原理
MySQL 学习(1)体系结构
对 MySQL 的整体有个认识
MySQL 学习(2) InnoDB 体系结构
对 InnoDB 的结构有个认识
MySQL 学习(3) CheckPoint 技术 ⛔
Checkpoint(检查点)用于将缓冲池中的脏页刷回到磁盘,Checkpoint 技术的目的是解决以下几个问题:缩短数据库的恢复时间;缓冲池不够用时,将脏页刷新到磁盘;重做日志不可用时,刷新脏页。但是如何挑选一个合适的时机执行 Checkpoint 呢?
MySQL 学习(4) Master Thread 的工作 ⛔
Master thread 是核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、undo 页的回收等。因为暂时没有学到这方面的知识,所以这篇博客待更新…
MySQL 学习(5)InnoDB Insert Buffer(插入缓冲) ⛔
Insert Buffer 就是用于 提升非聚集索引页 的插入性能的(因为通过聚集索引查找到的非聚集索引不是顺序存储的,这样会导致随机访问的出现,从而导致插入操作性能下降),对于非聚簇索引的插入或者更新操作,不是每一次都直接插入到索引页中,而是先判断插入的非聚集索引是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个 Insert Buffer 中。
MySQL 学习(6)Innodb Double Write ⛔
在应用重做日志前,用户需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是 doublewrite。
MySQL 学习(7)自适应哈希索引和异步 IO
InnoDB 存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index, AHI)。(无法自己创建,InnoDB 自己维护的)
MySQL 学习(8)MySQL 中的文件
主要介绍了一下 MySQL 中各种文件的作用
MySQL 学习(9)表空间、区、页 ⛔
MySQL 学习(10)数据行结构和行溢出机制 ⛔
MySQL 的数据页 详细看:MySQL 学习(11)数据页结构 ⛔
在 InnoDB 存储引擎中,数据页是 InnoDB 磁盘管理的最小的数据单位,数据页的默认大小为 16KB,这里介绍一下这个数据页的结构
(Next-Key Lock):是记录锁与间隙锁的组合
MySQL 学习(14)索引的结构和联合索引的原理
MySQL 学习(15)是否使用索引判断、回表、索引覆盖
索引即数据,数据即索引
MySQL 学习(16)联合索引的原理和最左前缀匹配原则
索引的具体使用说明
MySQL 学习(17)意向锁(表锁)、MVCC、Next-Key Lock
补充上面 MySQL 中的锁
主要介绍了一下 MySQL 的各种锁
补充上面 MySQL 学习(17-1)什么时候需要手动加锁
其实这篇说了这么多主要讨论:RR 是否解决了幻读?(使用 lock in share mode
让 RR 加上间隙锁,从而解决幻读)
MySQL 学习(18)锁的问题:脏读、不可重复读、丢失更新、死锁
这篇讨论了一下并发带来的问题
MySQL 学习(19)事务的分类与实现
MySQL 笔记杂项
MySQL 常用函数学习
常用的工具函数
case
语句) MySQL 常见的数据类型
各种数据类型的选择(在阿里的开发手册里面是如何选择的)
MySQL 用户管理
操作用户一般是 DBA 的职责,可以通过角色系统来管理权限
MySQL 使用 Explain 分析优化实例
查询优化工具 explain 命令
具体的使用示例:MySQL 学习(0)优化的核心 explain 执行计划
MySQL 数据库备份与恢复
为了避免误操作,定期备份和恢复数据还是有必要学习的
MySQL 常见场景题
就是 SQL 题的记录,也没有啥特别难的,复习一下 “困难题” 就好了
MySQL 学习(20)分布式事务
MySQL 学习(21)数据库优化
Redis 配置环境和操作数据常用命令
这篇笔记主要就是记录常用的数据结构以及在控制台如何使用它们
Redis 的单线程和多线程
Redis 各种数据结构的使用场景 ⭐
Redis 缓存读写策略设计及常见问题
这篇笔记主要记录 Redis 当 MySQL 缓存层的常见问题
Redis 各种数据结构的内部原理
Redis 实战:根据投票排序功能
Redis 实战:Web 应用
Redis 事务的基本使用
Redis 的基本事务(basic transaction)需要用到 MULTI 命令和 EXEC 命令,这种事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令(原理是乐观锁 CAS)。
Redis 实战:使用事务构建一个游戏商城
Redis 实战:构建分布式锁
Redis 持久化数据 ~
Redis 客户端 Jedis 学习
没啥好说的,就是这个 Jedis 常用方法介绍
MyBatis 配置文件 以及 Mapper 的写法 ⛔
简单介绍了一下 Mapper 的写法(有点过时了)
MyBatis 动态 SQL
如题:MyBatis 如何实现动态 SQL
( )
)MyBatis 关系映射及多表查询 ⭐
MyBatis 分页
主要介绍的是 MyBatis Plus 的分页,原理其实就是通过 AOP 自动在 SQL 加上 limit
关键字
MyBatis 结果集映射 ⭐
MyBatisPlus 的配置文件
简单介绍了下 MyBatisPlus 的配置
MyBatisPlus 常用的增删改查
如题,简单介绍了下 MyBatisPlus 怎么用
MyBatisPlus 常用的插件工具
介绍了 MyBatis 如何定义插件,MyBatis 可以在 已映射语句 执行过程中的某一点进行拦截调用
MyBatisPlus 的 ORM 操作
搭配 Java 提供的 JPA 规范一起食用:
ORM 的概念学习~
Java JPA 规范
操作系统之内存
这篇主要是介绍一下内存在操作系统里面是怎么工作的
Linux IO 基本概念学习(IO 多路复用) ⭐
在 Redis 和 NIO 都使用到了这个 IO 多路复用,所以它是原理部分重头戏
主要知识点:
用户态与内核态是啥?
这个是理解下面零拷贝技术的知识铺垫
主要知识点:
零拷贝技术是什么? ⭐
Kafka ,Netty,Nginx 都使用这个零拷贝技术,其实零拷贝就是想方设法地 优化减少或者去掉用户态和内核态之间以及内核态和内核态之间的数据拷贝
主要知识点:
ARP 协议
地址解析协议,即 ARP(Address Resolution Protocol),是根据 IP 地址获取物理地址的一个 TCP/IP 协议。
链路层协议 ⛔
链路层在各层协议中要直接打交道的就是 IP、ARP 和 RARP 3个协议
DNS 学习 ⛔
HTTP 协议学习
TCP 的连接管理
TCP 的可靠传输 ⛔
详细的介绍了下 TCP
TCP 的报文基本结构
TCP 的流量控制
WebSocket 学习
WebSocket 使用案例:WebSocket 心跳机制和重连实现
跨源资源共享 CORS
CORS 全称是 Cross-Origin Resource Sharing,直译过来就是跨域资源共享。这个是经常遇到的坑,学习一下方便排查错误
数据结构 Heap 堆
堆这个数据结构主要是对完全二叉树的拓展,这篇主要是为堆排序做铺垫,堆是一种特殊的完全树,它每个结点都有一个值,堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。就类似一堆东西一样,按照由大到小(或由小到大)“堆” 起来。
主要知识点:
简单排序算法
简单排序和时间复杂度
高级排序算法 归并排序
利用归并的思想实现的排序方法,分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案 “修补” 在一起,即分而治之。归并排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
高级排序算法 快速排序
快速排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),它的空间复杂度是 O ( l o g n ) O(logn) O(logn) 最坏情况是 O ( n 2 ) O(n^2) O(n2)
高级排序算法 堆排序
堆排序其实就是利用堆的性质进行排序(算是第一个利用),堆排序时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) 且堆排序对原始记录的排序状态并不敏感
高级排序算法 桶排序
桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。
高级排序算法 基数排序
算法的时间复杂度是 O ( n ) O(n) O(n),但是因为基数排序不是基于比较的排序,所以适用面比较低一点,基数排序也算一种桶排序。
Bitmap 位图排序
使用 bitmap 主要是可以减少存储空间的使用,用一个 bit 来存储一个元素的状态(就是利用了二进制位数,例如第二位为 1 ,那就表示存在 2 这个数)。例如当我们需要在一亿个数中判断某个数是否存在时,我们不需要将这一亿个数同时放入内存。这个排序是一种特殊的排序,使用起来有诸多限制
高级排序算法 希尔排序 ⛔
希尔排序是插入排序的一种改进版本,避免了插入排序那种每次只能将数据移动一位,采用 跳跃分割的策略:将相距某个 “增量” 的记录组成一个子序列,令整体相对有序,然后依次缩减增量再进行排序(希尔排序之所以那么快,是因为一次可以排多个,使之基本有序)
设计模式基本概念
主要介绍了一些设计模式的概念
什么是好的软件架构 ⭐
评价架构设计的好坏就是评价它应对改动有多么轻松
游戏开发中的 MVC 模式 ⭐
MVC 这个模式是由 策略模式、观察者模式 和 组合模式 这三个基本的设计模式组成的
单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
创建型模式-单例模式
这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象,饿汉式是类加载时就初始化,一般懒汉式才需要考虑线程安全的问题。(注意,它和静态工具类还是有区别的,工具类是无需实例化的)
synchronized
防止多线程同时进入造成 instance 被多次实例化)volatile
关键字修饰来避免指令重排) ⭐ 创建型模式-原型模式
这个原型模式在 Java 主要就是考察 浅表复制与深层复制,但是在 JavaScript 中却很不一般(Self 语言)
主要知识点:
创建型模式-工厂模式
在工厂模式中,我们在 创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。JDK 中也是挺常用的,例如线程池的 Executors 工具类就是使用的工厂模式。
创建型模式-建造者模式
建造模式适用于一个具有较多零件的复杂产品的创建过程,由于需求会经常变更,组成这个复杂产品的各个零件经常变化,但是它们的 组合方式却相对稳定
模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
行为型模式-命令模式
命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。
行为型模式-拦截器模式
拦截过滤器模式当我们想对应用程序的请求或响应进行一些预处理/后处理时,将使用拦截过滤器设计模式。(注意与过滤器模式的区别:过滤模式允许开发人员使用各种标准过滤 一组对象)
行为型模式-模板方法模式
模板方法模式就是定义一个算法的骨架,将算法分解为一系列步骤, 然后将这些步骤改写为方法, 最后在 “模板方法” 中依次调用这些方法。
行为型模式-状态模式
用来去除代码里面大量的 if else,状态模式通过把各种状态逻辑转移分布到 state 的子类之间来减少相互之间的依赖(就像 Unity 的 Animator Controllers 那样的状态机的概念)
行为型模式-策略模式
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
行为型模式-职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止(就像异常处理那样,层层上抛,直到有个能处理它的为止)。
行为型模式-观察者模式和发布订阅模式
主要就是观察者模式和发布订阅模式的区别:发布订阅模式是最常用的一种观察者模式的实现,并且从解耦和重用角度来看,更优于典型的观察者模式(观察者无需直接耦合主题,而是委托事件中心这个第三方)
行为型模式-解释器模式
给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。(MyBatis 的那个就是解释器模式)
行为型模式-访问者模式
适用于 数据元素相对稳定 的场景,它能将算法与其所作用的对象隔离开来(例如男人女人执行不同的策略)
行为型模式-迭代器模式
大部分语言使用的 foreach 实际就是使用的迭代器,在日常开发中,几乎不会自己写迭代器。除非需要定制一个自己实现的数据结构对应的迭代器,否则,开源框架提供的 API 完全够用。
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
☕ Java 代理模式
这篇博客需要先了解前面 Java 反射,主要考察的是动态代理,因为代理模式是后面学习 AOP、IoC 的基础
结构型模式-享元模式
它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。其实就是 对象池 的概念
结构模式-外观模式
给屎山擦屁股的专用设计模式,外观模式就是用来隐藏子系统的复杂性,并向客户端提供一个可访问的接口
结构模式-桥接模式
将抽象与实现分离,使它们可以独立变化。它是 用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。(例如手机品牌和手机软件独立变化)
结构模式-类型对象模式
这个是补充的设计模式,对于一些需要大量不同 “类型” 对象的场景可以使用(其实就是上面 桥接模式的一种具体的应用)
结构模式-组合模式
将对象组合成树形结构表示:“部分-整体” 的层次结构(组合模式使得用户对单个对象和组合对象的使用具有一致性),例如 Unity 的各个组件和对象就是这种思路
☕ 结构模式-装饰器模式
装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。例如 Java8 中 Stream 的惰性计算就是这个原理。
结构模式-过滤器模式
这种模式允许开发人员使用不同的标准来过滤 一组对象(数组、List),通过逻辑运算以解耦的方式把它们连接起来。注意,它和拦截器模式的区别(过滤模式允许开发人员使用各种标准过滤 一组对象,而当有人需要对应用程序的请求或反应进行一些预先准备/后处理时,就使用拦截模式)
结构模式-适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,不过一般实际应用中,这个适配器用起来更像模板方法模式(例如 SpringSecurity 的那个 WebSecurityConfigurerAdapter)
Spring 由哪些模块组成?
主要介绍了下 Spring 由哪些模块构成
Spring基础知识:IoC DI 补充:IoC 容器的简单实现之配置文件的读取
@Autowired
和 @Resource
的区别(前者 byType 后者 byName 再 byType)Spring基础知识 AOP
这篇其实没啥好说的,搭配下面的一起食用:
Spring 循环依赖问题(三级缓存)
补充一点,使用构造函数注入和 @Autowired
有点小区别,前者出现循环依赖有更好看的报错显示(笑)
Spring Bean 生命周期常见的拓展点
这篇笔记比较复杂,主要配合着第一张图进行理解
Spring Bean 的杂项知识
@Component
和 @Bean
的区别(第三方库中的组件一般用 @Bean
,这样更灵活)Spring 中 BeanFactory 与 FactoryBean 的区别 ⛔
Spring 的 ApplicationContext 应用上下文学习 ⛔
Spring 中用到的设计模式
Spring 中的事件机制
Spring 事务的使用~
搭配 Spring 事务属性详解~、Spring 事务的核心概念~ 一起食用
SpringMVC 基本执行流程
其实没啥好说,就是一些请求响应之类配置,配合下面的一起看:
SpringBoot 自动装配原理
这篇说是原理,其实就是介绍了一下如何自己编写一个 starter,它的核心原理就是按照 META-INF/spring.factories
文件自动导入写好的 Bean
补充一些 SpringBoot 提供的工具
SpringBoot 定时任务
Spring Scheduled 是一个 Spring 自带的定时器工具,不需要手写线程池相关代码,只需要两个注解即可。
SpringBoot 数据校验
每次在 Request 请求携带过来的参数校验很麻烦,这种情况就可以使用 Spring validation 校验数据
SpringBoot 的 “开机启动”
很多时候,我们都需要在 SpringBoot 项目启动后初始化化一些自己的数据,这时可以使用这两个注解做 “开机启动”
在 SpringBoot 中使用 Redis Cache 主要看下面这几篇
Spring Security 虽然强大,但是也是真的难用,这里暂时先放这里,等以后有时候了再来整理这块
SpringSecurity 使用自带的 formLogin (快速使用表单登陆)
SpringSecurity 配置项
SpringSecurity 原理篇 快速上手教程 (理解各个组件的作用)
SpringSecurity 原理篇 认证流程源码解析
SpringSecurity 原理篇 鉴权流程源码解析
SpringSecurity 整合 JWT 快速使用
SpringSecurity 使用 RSA 非对称加密 (JWT 如何使用 RSA)
SpringSecurity 工具类 BCryptPasswordEncoder 是如何加密解密的
SpringSecurity RBAC设计(入门)
SpringSecurity 认证的编写流程
SpringSecurity 编写一个简单鉴权Demo
SpringSecurity 访问控制的方式
SpringSecurity授权服务器、资源服务器
SpringSecurity 单点登陆 SSO(只是介绍了概念)
SpringSecurity OAuth2 的各种概念 (如何选择 OAuth 的各种模式)
OAuth2.0 数据库字段说明
Spring Cloud Security OAuth2 学习(如何配置授权服务器)
SpringSecurity OAuth GitHub 登陆案例 (快速上手资源服务器如何对接外部的认证服务器)
OAuth2.0 分布式系统环境搭建(快速上手认证服务器和资源服务器的交互)
SpringSecurity OAuth2 自定义用户密码登陆返回 Token
补充 Shiro
安全框架 Shiro 授权
安全框架 Shiro 身份认证
分布式自增 ID 算法 Snowflake(雪花算法)
为了防止 ID冲突可以使用 36位的 UUID,但是 UUID有一些缺点,首先他相对比较长,另外 UUID一般是无序的。所以这时可以采用雪花算法