├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── algorithms
├── README.MD
├── algorithm-common
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── leetcode
│ │ └── common
│ │ ├── array
│ │ └── ArrayUtils.java
│ │ ├── linkedlist
│ │ ├── LinkedListUtils.java
│ │ └── ListNode.java
│ │ ├── print
│ │ └── PrintUtils.java
│ │ └── tree
│ │ ├── TreeNode.java
│ │ └── TreeUtils.java
├── algorithm
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ ├── bloomfilter
│ │ └── BloomFilter.java
│ │ ├── consistenthash
│ │ └── ConsistentHash.java
│ │ ├── gcdlcm
│ │ ├── Gcd1.java
│ │ ├── Gcd2.java
│ │ └── Gcd3.java
│ │ ├── sort
│ │ └── QuickSort.java
│ │ └── util
│ │ └── ArrayUtil.java
├── datastructure
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ ├── atguigu
│ │ ├── graph
│ │ │ └── Graph.java
│ │ ├── hashtab
│ │ │ └── HashTabDemo.java
│ │ ├── linkedlist
│ │ │ ├── DoubleLinkedListDemo.java
│ │ │ ├── Josepfu.java
│ │ │ ├── SingleLinkedListDemo.java
│ │ │ └── skiplist
│ │ │ │ ├── v1
│ │ │ │ └── SkipSet.java
│ │ │ │ ├── v2
│ │ │ │ └── SkipList.java
│ │ │ │ └── v3
│ │ │ │ └── SkipList2.java
│ │ ├── queue
│ │ │ ├── ArrayQueueDemo.java
│ │ │ └── CircleArrayQueueDemo.java
│ │ ├── recursion
│ │ │ ├── Maze.java
│ │ │ ├── Queue8.java
│ │ │ └── Recursion.java
│ │ ├── search
│ │ │ ├── BinarySearch.java
│ │ │ ├── FibonacciSearch.java
│ │ │ ├── InsertValueSearch.java
│ │ │ └── SeqSearch.java
│ │ ├── sort
│ │ │ ├── DubbleSort.java
│ │ │ ├── HeapSort.java
│ │ │ ├── InsertSort.java
│ │ │ ├── MergeSort.java
│ │ │ ├── QuickSort.java
│ │ │ ├── QuickSort2.java
│ │ │ ├── RadixSort.java
│ │ │ ├── SelectSort.java
│ │ │ ├── ShellSort.java
│ │ │ ├── TimeComplexity.java
│ │ │ └── heap
│ │ │ │ ├── Heap.java
│ │ │ │ ├── Heap2.java
│ │ │ │ └── HeapOperator.java
│ │ ├── sparsematrix
│ │ │ ├── BestSpmatrix.java
│ │ │ └── SparseMatrix.java
│ │ ├── stack
│ │ │ ├── ArrayStackDemo.java
│ │ │ ├── InCalculator.java
│ │ │ └── SuCalculator.java
│ │ └── tree
│ │ │ ├── ArrBinaryTreeDemo.java
│ │ │ ├── BinaryTreeDemo.java
│ │ │ ├── ThreadingBinaryTreeDemo.java
│ │ │ ├── avl
│ │ │ └── AVLTreeDemo.java
│ │ │ ├── binarysorttree
│ │ │ └── BinarySortTreeDemo.java
│ │ │ ├── huffmancode
│ │ │ └── HuffmanCode.java
│ │ │ └── huffmantree
│ │ │ └── HuffmanTree.java
│ │ └── util
│ │ └── ArrayUtil.java
├── go
│ └── algorithm
│ │ └── leetcode
│ │ ├── array
│ │ ├── 两数之和_II_输入有序数组_167_简单
│ │ │ ├── Solution1.go
│ │ │ ├── Solution2.go
│ │ │ └── Solution3.go
│ │ ├── 反转字符串_344_简单
│ │ │ └── Solution1.go
│ │ ├── 反转字符串中的元音字母_345_简单
│ │ │ └── Solution1.go
│ │ ├── 合并两个有序数组_88_简单
│ │ │ ├── Solution1.go
│ │ │ └── Solution2.go
│ │ ├── 数组中的第K个最大元素_215_中等
│ │ │ └── Solution1.go
│ │ ├── 无重复字符的最长子串_3_中等
│ │ │ └── Solution1.go
│ │ ├── 盛最多水的容器_11_中等
│ │ │ └── Solution1.go
│ │ ├── 长度最小的子数组_209_中等
│ │ │ ├── Solution1.go
│ │ │ └── Solution2.go
│ │ ├── 颜色分类_75_中等
│ │ │ ├── Solution1.go
│ │ │ └── Solution2.go
│ │ └── 验证回文串_125_Easy
│ │ │ ├── Solution1.go
│ │ │ └── Solution2.go
│ │ └── lc69.go
├── interview
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── Main.java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── interview
│ │ ├── lejian
│ │ └── Test1.java
│ │ ├── other
│ │ └── Main.java
│ │ ├── scanner
│ │ └── Main.java
│ │ └── 美团点评
│ │ └── 合并金币
│ │ └── Test01.java
├── leetcode
│ ├── array
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── array
│ │ │ ├── 两数之和_II_输入有序数组_167_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 使数组唯一的最小增量_945_中等
│ │ │ └── Solution1.java
│ │ │ ├── 删除排序数组中的重复项_26_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 删除排序数组中的重复项_II_80_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 区间合并
│ │ │ └── 矩形重叠_836_简单
│ │ │ │ ├── Solution1.java
│ │ │ │ └── Solution2.java
│ │ │ ├── 卡牌分组_914_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 反转字符串_344_简单
│ │ │ └── Solution1.java
│ │ │ ├── 反转字符串中的元音字母_345_简单
│ │ │ └── Solution1.java
│ │ │ ├── 合并两个有序数组_88_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 多数元素_169_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 将数组分成和相等的三个部_1013_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 找到字符串中所有字母异位词_438_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── backup.md
│ │ │ ├── 排序数组_912_中等
│ │ │ ├── README.md
│ │ │ ├── 交换
│ │ │ │ ├── BubbleSort.java
│ │ │ │ ├── Quick2Sort.java
│ │ │ │ └── QuickSort.java
│ │ │ ├── 分配
│ │ │ │ ├── CountSort.java
│ │ │ │ └── RadixSort.java
│ │ │ ├── 归并
│ │ │ │ └── MergeSort.java
│ │ │ ├── 插入
│ │ │ │ ├── InsertSort.java
│ │ │ │ └── ShellSort.java
│ │ │ └── 选择
│ │ │ │ ├── HeapSort.java
│ │ │ │ └── SelectSort.java
│ │ │ ├── 数组中的第K个最大元素_215_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 无重复字符的最长子串_3_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 最小覆盖子串_76_hard
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── Solution4.java
│ │ │ ├── 有效的字母异位词_242_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 盛最多水的容器_11_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 移动零_283_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 移除元素_27_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 缺失的第一个正数_41_困难
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── YourVersion1.java
│ │ │ ├── 螺旋矩阵_54_中等
│ │ │ └── Solution1.java
│ │ │ ├── 错误的集合_645_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── Solution4.java
│ │ │ ├── 长度最小的子数组_209_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ ├── Solution5.java
│ │ │ └── Solution6.java
│ │ │ ├── 颜色分类_75_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ └── 验证回文串_125_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ ├── binarysearch
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── binarysearch
│ │ │ ├── pow_50_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 二分查找_704_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 寻找旋转排序数组中的最小值II_154_困难
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 寻找旋转排序数组中的最小值_153_中等
│ │ │ └── Solution1.java
│ │ │ └── 搜索插入位置_35_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ ├── binarytree
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── binarytree
│ │ │ ├── 二叉搜索树的最近公共祖先_235_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 二叉搜索树结点最小距离_783_简单
│ │ │ └── Solution1.java
│ │ │ ├── 二叉树的所有路径_257_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 二叉树的最大深度_104_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 二叉树的最小深度_111_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 二叉树的直径_543_简单
│ │ │ └── Solution1.java
│ │ │ ├── 单词的压缩编码_820_中等
│ │ │ └── Solution1.java
│ │ │ ├── 完全二叉树的节点个数_222_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 实现Trie前缀树_208_中等
│ │ │ └── Trie.java
│ │ │ ├── 对称二叉树_101_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── Solution6.java
│ │ │ ├── 左叶子之和_404_简单
│ │ │ ├── Solution.java
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 平衡二叉树_110_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 求根到叶子节点数字之和_129_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 相同的树_100_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ ├── Solution5.java
│ │ │ └── Solution6.java
│ │ │ ├── 翻转二叉树_226_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ └── Solution5.java
│ │ │ ├── 路径总和_112_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution4.java
│ │ │ └── Solution5.java
│ │ │ ├── 路径总和_III_437_简单
│ │ │ └── Solution1.java
│ │ │ ├── 路径总和_II_113_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ └── 验证二叉搜索树_98_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ ├── bitoperation
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── bitoperation
│ │ │ └── 位1的个数_191_简单
│ │ │ └── Solution.java
│ ├── dfsbfs
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── dfsbfs
│ │ │ ├── 地图分析_1162_中等
│ │ │ └── Solution1.java
│ │ │ ├── 岛屿的最大面积_695_中等
│ │ │ └── Solution1.java
│ │ │ └── 腐烂的橘子_994_简单
│ │ │ └── Solution1.java
│ ├── divide
│ │ └── pom.xml
│ ├── dynamic
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── dynamic
│ │ │ ├── knapsack01
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ ├── Solution5.java
│ │ │ └── knapsack01.md
│ │ │ ├── 三角形最小路径和_120_中等
│ │ │ ├── README.md
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── Solution4.java
│ │ │ ├── 不同路径II_63_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 不同路径_62_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 买卖股票的最佳时机_121_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 分割等和子集_416_中等
│ │ │ ├── 416.md
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── Solution4.java
│ │ │ ├── 完全平方数_279_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 戳气球_312_困难
│ │ │ └── Solution1.java
│ │ │ ├── 打家劫舍_198_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── recursion
│ │ │ │ ├── Solution1.java
│ │ │ │ └── Solution2.java
│ │ │ ├── 整数拆分_343_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── Solution4.java
│ │ │ ├── 斐波那契数_509_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ └── Solution5.java
│ │ │ ├── 最大子序和_53_简单
│ │ │ ├── README.md
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 最小路径和_64_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ └── recursion
│ │ │ │ ├── Solution1.java
│ │ │ │ ├── Solution2.java
│ │ │ │ ├── Solution3.java
│ │ │ │ └── Solution4.java
│ │ │ ├── 最长上升子序列_300_中等
│ │ │ └── Solution1.java
│ │ │ ├── 最长公共子序列_1143_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 爬楼梯_70_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ └── Solution5.java
│ │ │ ├── 解码方法_91_中等
│ │ │ └── Solution1.java
│ │ │ └── 零钱兑换_322_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ ├── greedy
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── greedy
│ │ │ ├── 买卖股票的最佳时机II_122_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── Solution4.java
│ │ │ ├── 分发饼干_455_简单
│ │ │ └── Solution1.java
│ │ │ ├── 判断子序列_392_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ └── 无重叠区间_435_中等
│ │ │ └── Solution1.java
│ ├── hashtable
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── hashtable
│ │ │ ├── 三数之和_15_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 两个数组的交集_349_Esay
│ │ │ └── Solution1.java
│ │ │ ├── 两个数组的交集_II_350_Esay
│ │ │ └── Solution1.java
│ │ │ ├── 两数之和_1_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 单词规律_290_Easy
│ │ │ └── Solution1.java
│ │ │ ├── 同构字符串_205_Esay
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 四数之和_18_Middle
│ │ │ ├── Example.java
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 四数相加_II_454_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 回旋镖的数量_447_简单
│ │ │ └── Solution1.java
│ │ │ ├── 字母异位词分组_49_中等
│ │ │ └── Solution1.java
│ │ │ ├── 存在重复元素_III_220_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 存在重复元素_II_219_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 快乐数_202_Easy
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Test.java
│ │ │ ├── Test2.java
│ │ │ └── data
│ │ │ ├── 找出第k小的距离对_719_困难
│ │ │ └── Solution1.java
│ │ │ ├── 拼写单词_1160_简单
│ │ │ └── Solution1.java
│ │ │ ├── 最接近的三数之和_16_Middle
│ │ │ └── Solution1.java
│ │ │ ├── 有效的字母异位词_242_Easy
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 根据字符出现频率排序_451_Middle
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 直线上最多的点数_149_困难
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ └── 长回文串_409_简单
│ │ │ └── Solution1.java
│ ├── leetcode-common
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── common
│ │ │ ├── array
│ │ │ └── ArrayUtil.java
│ │ │ ├── linkedlist
│ │ │ ├── LinkedListUtil.java
│ │ │ └── ListNode.java
│ │ │ ├── print
│ │ │ └── PrintUtil.java
│ │ │ └── tree
│ │ │ ├── TreeNode.java
│ │ │ ├── TreeUtil.java
│ │ │ └── TrieNode.java
│ ├── leetcode大纲.md
│ ├── linkedlist
│ │ ├── README.MD
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── common
│ │ │ └── linkedlist
│ │ │ ├── 两两交换链表中的节点_24_中等
│ │ │ └── Solution1.java
│ │ │ ├── 两数相加_2_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 两数相加_II_445_中等
│ │ │ └── Solution1.java
│ │ │ ├── 分隔链表_86_中等
│ │ │ └── Solution1.java
│ │ │ ├── 删除排序链表中的重复元素_83_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 删除排序链表中的重复元素_II_82_中等
│ │ │ └── Solution1.java
│ │ │ ├── 删除链表中的节点_237_简单
│ │ │ └── Solution1.java
│ │ │ ├── 删除链表的倒数第N个节点_19_中等
│ │ │ └── Solution1.java
│ │ │ ├── 反转链表_206_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 反转链表_II_92_中等
│ │ │ └── Solution1.java
│ │ │ ├── 合并两个有序链表_21_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 回文链表_234_简单
│ │ │ └── Solution1.java
│ │ │ ├── 奇偶链表_328_中等
│ │ │ └── Solution1.java
│ │ │ ├── 环形链表_141_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 相交链表_160_简单
│ │ │ ├── Solution1.java
│ │ │ └── 参考
│ │ │ ├── 移除链表元素_203_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 设计跳表_1206_困难
│ │ │ └── Skiplist.java
│ │ │ ├── 重排链表_143_中等
│ │ │ └── Solution1.java
│ │ │ └── 链表的中间结点_876_简单
│ │ │ └── Solution.java
│ ├── other
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── other
│ │ │ ├── LRU缓存机制_146_中等
│ │ │ ├── LRUCache.java
│ │ │ └── MyLRUCache.java
│ │ │ ├── 二进制求和_67_简单
│ │ │ └── Solution1.java
│ │ │ ├── 分糖果II_1103_简单
│ │ │ └── Solution.java
│ │ │ ├── 四的幂_342_简单
│ │ │ └── Solution1.java
│ │ │ └── 重复叠加字符串匹配_686_简单
│ │ │ └── Solution1.java
│ ├── pom.xml
│ ├── readme.md
│ ├── recursion-backtracking
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── recurionbacktracking
│ │ │ ├── N皇后II_52_困难
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── N皇后_51_困难
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 二进制手表_401_简单
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 全排列_46_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 全排列_II_47_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 单词搜索_79_中等
│ │ │ └── Solution1.java
│ │ │ ├── 复原IP地址_93_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 岛屿数量_200_中等
│ │ │ └── Solution1.java
│ │ │ ├── 正则表达式匹配_10_困难
│ │ │ └── Solution1.java
│ │ │ ├── 电话号码的字母组合_17_中等
│ │ │ └── Solution1.java
│ │ │ ├── 组合_77_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── 剪枝.png
│ │ │ └── 组合.png
│ │ │ ├── 组合总和_39_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ └── 组合总和_II_40_中等
│ │ │ └── Solution1.java
│ ├── stackqueue
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── stackqueue
│ │ │ ├── 二叉树的中序遍历_94_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ └── SolutionCommand.java
│ │ │ ├── 二叉树的前序遍历_144_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ └── SolutionCommand.java
│ │ │ ├── 二叉树的右视图_199_中等
│ │ │ └── Solution1.java
│ │ │ ├── 二叉树的后序遍历_145_困难
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ ├── Solution3.java
│ │ │ ├── Solution4.java
│ │ │ ├── SolutionCommand.java
│ │ │ └── 参考.txt
│ │ │ ├── 二叉树的层次遍历_102_中等
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 二叉树的层次遍历_II_107_简单
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 二叉树的锯齿形层次遍历_103_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 前K个高频元素_347_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 合并K个排序链表_23_困难
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ ├── 完全平方数_279_中等
│ │ │ └── Solution1.java
│ │ │ ├── 扁平化嵌套列表迭代器_341_中等
│ │ │ ├── NestedInteger.java
│ │ │ ├── NestedIterator.java
│ │ │ ├── NestedIterator1.java
│ │ │ └── 参考
│ │ │ ├── 数据流移动平均值_346_简单
│ │ │ └── MovingAverage.java
│ │ │ ├── 最小栈_155_简单
│ │ │ └── MinStack.java
│ │ │ ├── 有效的括号_20_简单
│ │ │ └── Solution1.java
│ │ │ ├── 用队列实现栈_225_简单
│ │ │ ├── MyStack.java
│ │ │ └── MyStack1.java
│ │ │ ├── 简化路径_71_中等
│ │ │ └── Solution1.java
│ │ │ ├── 逆波兰表达式求值_150_中等
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ └── 验证栈序列_946_中等
│ │ │ └── Solution1.java
│ ├── string
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── leetcode
│ │ │ └── string
│ │ │ ├── 字符串的最大公因子_1071_简单
│ │ │ └── Solution1.java
│ │ │ ├── 翻转字符串里的单词_151_中等
│ │ │ └── Solution1.java
│ │ │ └── 面试题01_06_字符串压缩_简单
│ │ │ └── Solution1.java
│ ├── union-find
│ │ └── pom.xml
│ └── week
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── leetcode
│ │ └── week
│ │ ├── one175
│ │ ├── 制造字母异位词的最小步骤数_5333_中等
│ │ │ └── Solution.java
│ │ ├── 参加考试的最大学生数_5335_困难
│ │ │ └── Solution.java
│ │ ├── 推文计数_5334_中等
│ │ │ └── TweetCounts.java
│ │ └── 检查整数及其两倍数是否存在_简单_5332
│ │ │ └── Solution.java
│ │ ├── one176
│ │ ├── 最后K个数的乘积_5341
│ │ │ └── ProductOfNumbers.java
│ │ ├── 最多可以参加的会议数目_5342
│ │ │ └── Solution.java
│ │ └── 统计有序矩阵中的负数_5340
│ │ │ └── Solution.java
│ │ ├── one177
│ │ ├── 形成三的最大倍数_5172_困难
│ │ │ └── Solution.java
│ │ ├── 日期之间隔几天_5169_简单
│ │ │ └── Solution.java
│ │ ├── 最接近的因数_5171_中等
│ │ │ └── Solution.java
│ │ └── 验证二叉树_5170_中等
│ │ │ └── Solution.java
│ │ ├── one178
│ │ ├── 有多少小于当前数字的数字_5344
│ │ │ └── Solution.java
│ │ └── 通过投票对团队排名_5345
│ │ │ └── Solution.java
│ │ ├── one180
│ │ ├── 矩阵中的幸运数_5356_简单
│ │ │ ├── Solution.java
│ │ │ └── Solution1.java
│ │ └── 设计一个支持增量操作的栈_5357_中等
│ │ │ └── CustomStack.java
│ │ ├── one183
│ │ ├── 将二进制表示减到1的步骤数_5377_中等
│ │ │ └── Solution.java
│ │ └── 非递增顺序的最小子序列_5376_简单
│ │ │ └── Solution.java
│ │ └── tow20
│ │ └── 根据数字二进制下1的数目排序_5323_简单
│ │ └── Solution.java
├── leetcode2
│ ├── README.md
│ ├── backtracking
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── N皇后_51_困难
│ │ │ └── Solution.java
│ │ │ ├── 全排列II_47_中等
│ │ │ └── Solution.java
│ │ │ ├── 全排列_46_中等
│ │ │ ├── Solution.java
│ │ │ └── Solution2.java
│ │ │ ├── 划分为k个相等的子集_698_中等
│ │ │ └── Solution.java
│ │ │ ├── 子集II_90_中等
│ │ │ └── Solution.java
│ │ │ ├── 子集_78_中等
│ │ │ └── Solution.java
│ │ │ └── 组合_77_中等
│ │ │ └── Solution.java
│ ├── binarysearch
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── 二分查找_704_简单
│ │ │ └── Solution.java
│ │ │ ├── 在排序数组中查找元素的第一个和最后一个位置_34_中等
│ │ │ ├── Solution.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ │ │ ├── 搜索旋转排序数组_33_中等
│ │ │ └── Solution.java
│ │ │ └── 搜索旋转排序数组_II_81_中等
│ │ │ └── Solution.java
│ ├── dfsbfs
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── 太平洋大西洋流水问题_417_中等
│ │ │ ├── Solution.java
│ │ │ └── Solution_my.java
│ │ │ ├── 岛屿的最大面积_695_中等
│ │ │ ├── Solution.java
│ │ │ └── Solution2.java
│ │ │ └── 省份数量_547_中等
│ │ │ └── Solution.java
│ ├── dynamic2
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── knapsack01
│ │ │ └── knapsack01.md
│ │ │ ├── 打家劫舍_198_中等
│ │ │ ├── Solution.java
│ │ │ └── Solution2.java
│ │ │ ├── 爬楼梯_70_简单
│ │ │ └── Solution.java
│ │ │ └── 零钱兑换_322_中等
│ │ │ ├── Solution.java
│ │ │ └── Solution2.java
│ ├── greedy
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── 买卖股票的最佳时机II_122_简单
│ │ │ └── Solution.java
│ │ │ ├── 分发糖果_135_困难
│ │ │ └── Solution1.java
│ │ │ ├── 分发饼干_455_简单
│ │ │ └── Solution1.java
│ │ │ └── 无重叠区间_435_中等
│ │ │ └── Solution.java
│ ├── leetcode2-common
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── array
│ │ │ └── ArrayUtil.java
│ │ │ ├── linkedlist
│ │ │ ├── LinkedListUtil.java
│ │ │ └── ListNode.java
│ │ │ ├── print
│ │ │ └── PrintUtil.java
│ │ │ └── tree
│ │ │ ├── TreeNode.java
│ │ │ ├── TreeUtil.java
│ │ │ └── TrieNode.java
│ ├── linkedlist
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── K个一组翻转链表_25_困难
│ │ │ └── Solution.java
│ │ │ ├── 两两交接链表中的节点_24_中等
│ │ │ └── Solution.java
│ │ │ ├── 反转链表_206_简单
│ │ │ ├── Solution.java
│ │ │ └── Solution2.java
│ │ │ ├── 合并两个有序链表_21_中等
│ │ │ └── Solution.java
│ │ │ ├── 回文链表_234_简单
│ │ │ └── Solution.java
│ │ │ ├── 排序链表_148_中等
│ │ │ └── Solution.java
│ │ │ └── 相交链表_160_简单
│ │ │ └── Solution.java
│ ├── other-algo
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ └── LRU缓存_146_中等
│ │ │ ├── LRUCache.java
│ │ │ └── LRUCache2.java
│ ├── point
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── 两数之和_II_输入有序数组_167_简单
│ │ │ └── Solution.java
│ │ │ ├── 合并两个有序数组_88_简单
│ │ │ └── Solution.java
│ │ │ ├── 最小覆盖子串_76_困难
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ │ └── 环形链表_II_142_中等
│ │ │ └── Solution1.java
│ ├── pom.xml
│ ├── sort
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── sort
│ │ │ ├── BucketSort.java
│ │ │ ├── Heap1.java
│ │ │ ├── Heap2.java
│ │ │ ├── QuickSort1.java
│ │ │ ├── QuickSort2.java
│ │ │ ├── QuickSort3.java
│ │ │ └── README.md
│ │ │ ├── 前K个高频元素_347_中等
│ │ │ └── Solution.java
│ │ │ ├── 数组中的第K个最大元素_215_中等
│ │ │ ├── Solution.java
│ │ │ └── Solution2.java
│ │ │ ├── 根据字符出现频率排序_451_中等
│ │ │ └── Solution.java
│ │ │ └── 颜色分类_75_中等
│ │ │ └── Solution.java
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ └── 接雨水_42_困难
│ │ │ ├── README.md
│ │ │ ├── Solution1.java
│ │ │ ├── Solution2.java
│ │ │ └── Solution3.java
│ └── tree
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── 二叉树展开为链表_114_中等
│ │ └── Solution.java
│ │ ├── 二叉树的前序遍历_144_简单
│ │ └── Solution.java
│ │ ├── 二叉树的层平均值_637_简单
│ │ └── Solution.java
│ │ ├── 二叉树的最大深度_104_简单
│ │ ├── Solution.java
│ │ └── Solution2.java
│ │ ├── 二叉树的直径_543_简单
│ │ └── Solution.java
│ │ ├── 从中序与后序遍历序列构造二叉树_106_中等
│ │ ├── Solution.java
│ │ └── Solution2.java
│ │ ├── 从前序与中序遍历序列构造二叉树_105_中等
│ │ └── Solution.java
│ │ ├── 删点成林_1110_简单
│ │ └── Solution.java
│ │ ├── 填充每个节点的下一个右侧节点指针_116_中等
│ │ └── Solution.java
│ │ ├── 对称二叉树_101_简单
│ │ └── Solution.java
│ │ ├── 平衡二叉树_110_简单
│ │ └── Solution.java
│ │ ├── 最大二叉树_654_中等
│ │ └── Solution.java
│ │ ├── 根据前序和后序遍历构造二叉树_889_中等
│ │ └── Solution.java
│ │ ├── 翻转二叉树_226_简单
│ │ ├── Solution.java
│ │ └── Solution2.java
│ │ └── 路径总和_III_437_中等
│ │ └── Solution.java
├── niuke
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── od
│ │ ├── DemoMain1.java
│ │ ├── DemoMain2.java
│ │ ├── Main1.java
│ │ ├── Main2.java
│ │ └── Main3.java
│ │ ├── scanner
│ │ └── Main.java
│ │ └── 没有重复项数字的全排列_BM55
│ │ └── Solution.java
├── offer
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── offer
│ │ ├── 单例
│ │ ├── Singleton1.java
│ │ ├── Singleton2.java
│ │ ├── Singleton3.java
│ │ ├── Singleton4.java
│ │ ├── Singleton5.java
│ │ └── Singleton6.java
│ │ ├── 面试题03_数组中重复的数字_简单
│ │ ├── Solution1.java
│ │ ├── Solution2.java
│ │ └── Solution_3_2.java
│ │ ├── 面试题04_二维数组中的查找_简单
│ │ └── Solution1.java
│ │ ├── 面试题05_替换空格_简单
│ │ ├── Solution.java
│ │ └── Solution1.java
│ │ ├── 面试题06_从尾到头打印链表_简单
│ │ └── Solution1.java
│ │ ├── 面试题07_重建二叉树_中等
│ │ └── Solution1.java
│ │ ├── 面试题08_二叉树的下一个节点
│ │ └── Solution_8.java
│ │ ├── 面试题09_用两个栈实现队列_简单
│ │ ├── CQueue1.java
│ │ └── CQueue2.java
│ │ ├── 面试题10_II_青蛙跳台阶问题_简单
│ │ └── Solution.java
│ │ ├── 面试题10_I_斐波那契数列_简单
│ │ └── Solution.java
│ │ ├── 面试题11_旋转数组的最小数字_简单
│ │ └── Solution1.java
│ │ ├── 面试题12_矩阵中的路径_中等
│ │ └── Solution1.java
│ │ ├── 面试题13_机器人的运动范围_中等
│ │ ├── Solution1.java
│ │ └── o
│ │ │ ├── Solution1.java
│ │ │ └── Solution2.java
│ │ ├── 面试题14_II_剪绳子_中等
│ │ └── Solution1.java
│ │ ├── 面试题14_I_剪绳子_中等
│ │ ├── Solution1.java
│ │ └── Solution2.java
│ │ ├── 面试题15_二进制中1的个数_简单
│ │ └── Solution.java
│ │ ├── 面试题16_数值的整数次方_中等
│ │ ├── Solution1.java
│ │ ├── Solution2.java
│ │ └── Solution3.java
│ │ ├── 面试题17_打印从1到最大的n位数_简单
│ │ └── Solution1.java
│ │ ├── 面试题18_删除链表的节点_简单
│ │ └── Solution1.java
│ │ ├── 面试题19_正则表达式匹配
│ │ └── Solution1.java
│ │ ├── 面试题20_表示数值的字符串
│ │ └── Solution1.java
│ │ ├── 面试题21_调整数组顺序使奇数位于偶数前面
│ │ ├── Solution1.java
│ │ └── Solution2.java
│ │ ├── 面试题22_链表中倒数第k个节点
│ │ └── Solution1.java
│ │ ├── 面试题24_反转链表
│ │ ├── Solution1.java
│ │ └── Solution2.java
│ │ ├── 面试题25_合并两个排序的链表
│ │ └── Solution1.java
│ │ ├── 面试题26_树的子结构
│ │ └── Solution1.java
│ │ ├── 面试题27_二叉树的镜像
│ │ └── Solution1.java
│ │ ├── 面试题28_对称的二叉树
│ │ └── Solution1.java
│ │ ├── 面试题29_顺时针打印矩阵
│ │ └── Solution1.java
│ │ ├── 面试题30_包含min函数的栈
│ │ └── MinStack.java
│ │ ├── 面试题31_栈的压入弹出序列
│ │ └── Solution1.java
│ │ ├── 面试题32_III_从上到下打印二叉树III
│ │ └── Solution1.java
│ │ ├── 面试题32_II_从上到下打印二叉树II
│ │ └── Solution1.java
│ │ ├── 面试题32_I_从上到下打印二叉树
│ │ └── Solution1.java
│ │ ├── 面试题33_二叉搜索树的后序遍历序列
│ │ └── Solution1.java
│ │ ├── 面试题34_二叉树中和为某一值的路径
│ │ └── Solution1.java
│ │ ├── 面试题39_数组中出现次数超过一半的数字
│ │ └── Solution1.java
│ │ ├── 面试题40_最小的k个数
│ │ └── Solution1.java
│ │ ├── 面试题57_II_和为s的连续正数序列_简单
│ │ └── Solution1.java
│ │ ├── 面试题59_II_队列的最大值
│ │ └── MaxQueue.java
│ │ ├── 面试题59_I_滑动窗口的最大值
│ │ ├── Solution.java
│ │ └── Solution1.java
│ │ └── 面试题62_圆圈中最后剩下的数字
│ │ ├── Solution1.java
│ │ └── Solution2.java
├── pom.xml
└── test
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── cn
│ └── cunchang
│ ├── Main.java
│ └── Main2.java
├── bigdata
├── flink-cdc
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── FlinkCDC.java
│ │ ├── FlinkCDC2.java
│ │ ├── FlinkSQLCDC.java
│ │ └── func
│ │ └── CustomerDeserializationSchema.java
├── flink
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── README.txt
│ │ │ ├── batch
│ │ │ ├── BatchWordCountJava.java
│ │ │ └── transformation
│ │ │ │ ├── BatchCrossJava.java
│ │ │ │ ├── BatchFirstNJava.java
│ │ │ │ ├── BatchJoinJava.java
│ │ │ │ ├── BatchMapPartitionJava.java
│ │ │ │ └── BatchOuterJoinJava.java
│ │ │ ├── kafkaconnector
│ │ │ ├── StreamKafkaSinkJava.java
│ │ │ └── StreamKafkaSourceJava.java
│ │ │ ├── stream
│ │ │ ├── SocketWindowWordCountJava.java
│ │ │ ├── sink
│ │ │ │ └── StreamRedisSinkJava.java
│ │ │ ├── source
│ │ │ │ └── StreamCollectionSourceJava.java
│ │ │ └── transformation
│ │ │ │ ├── MyPartitionerJava.java
│ │ │ │ ├── StreamConnectJava.java
│ │ │ │ ├── StreamPartitionOpJava.java
│ │ │ │ ├── StreamSideOutputJava.java
│ │ │ │ ├── StreamSplitJava.java
│ │ │ │ └── StreamUnionJava.java
│ │ │ ├── tablesql
│ │ │ ├── CreateTableEnvironmentJava.java
│ │ │ ├── DataSetToTableJava.java
│ │ │ ├── DataStreamToTableJava.java
│ │ │ ├── TableAPIAndSQLOpJava.java
│ │ │ ├── TableToDataSetJava.java
│ │ │ └── TableToDataStreamJava.java
│ │ │ └── window
│ │ │ ├── CountWindowOpJava.java
│ │ │ ├── MyTimeWindowJava.java
│ │ │ ├── TimeWindowOpJava.java
│ │ │ └── WatermarkOpJava.java
│ │ ├── resources
│ │ └── log4j.properties
│ │ └── scala
│ │ └── com
│ │ └── imooc
│ │ └── scala
│ │ ├── batch
│ │ ├── BatchWordCountScala.scala
│ │ └── transformation
│ │ │ ├── BatchCrossScala.scala
│ │ │ ├── BatchFirstNScala.scala
│ │ │ ├── BatchJoinScala.scala
│ │ │ ├── BatchMapPartitionScala.scala
│ │ │ └── BatchOuterJoinScala.scala
│ │ ├── kafkaconnector
│ │ ├── StreamKafkaSinkScala.scala
│ │ └── StreamKafkaSourceScala.scala
│ │ ├── stream
│ │ ├── SocketWindowWordCountScala.scala
│ │ ├── sink
│ │ │ └── StreamRedisSinkScala.scala
│ │ ├── source
│ │ │ └── StreamCollectionSourceScala.scala
│ │ └── transformation
│ │ │ ├── MyPartitionerScala.scala
│ │ │ ├── StreamConnectScala.scala
│ │ │ ├── StreamPartitionOpScala.scala
│ │ │ ├── StreamSideOutputScala.scala
│ │ │ ├── StreamSplitScala.scala
│ │ │ └── StreamUnionScala.scala
│ │ ├── tablesql
│ │ ├── CreateTableEnvironmentScala.scala
│ │ ├── DataSetToTableScala.scala
│ │ ├── DataStreamToTableScala.scala
│ │ ├── TableAPIAndSQLOpScala.scala
│ │ ├── TableToDataSetScala.scala
│ │ └── TableToDataStreamScala.scala
│ │ └── window
│ │ ├── CountWindowOpScala.scala
│ │ ├── MyTimeWindowScala.scala
│ │ ├── TimeWindowOpScala.scala
│ │ ├── WatermarkOpForAllowedLatenessScala.scala
│ │ ├── WatermarkOpForSideOutputLateDataScala.scala
│ │ ├── WatermarkOpMoreParallelismScala.scala
│ │ └── WatermarkOpScala.scala
├── hadoop
│ ├── hdfs
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ └── HdfsOp.java
│ │ │ └── resources
│ │ │ └── log4j.properties
│ ├── mapreduce
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ └── mr
│ │ │ │ ├── GenerateDat.java
│ │ │ │ ├── HadoopSerialize.java
│ │ │ │ ├── JavaSerialize.java
│ │ │ │ ├── README.md
│ │ │ │ ├── SmallFileMap.java
│ │ │ │ ├── SmallFileSeq.java
│ │ │ │ ├── WordCountJob.java
│ │ │ │ ├── WordCountJobNoReduce.java
│ │ │ │ ├── WordCountJobQueue.java
│ │ │ │ ├── WordCountJobSeq.java
│ │ │ │ ├── WordCountJobSkew.java
│ │ │ │ └── WordCountJobSkewRandKey.java
│ │ │ └── resources
│ │ │ └── log4j.properties
│ └── pom.xml
└── imooc-flink
│ ├── data
│ ├── access.json
│ ├── access.log
│ ├── nest
│ │ ├── 1
│ │ │ ├── a.txt
│ │ │ └── b.txt
│ │ ├── 2
│ │ │ ├── c.txt
│ │ │ └── d.txt
│ │ └── wc.txt
│ ├── people.csv
│ ├── wc.data
│ └── wc.txt
│ ├── imooc-clickhouse
│ └── pom.xml
│ ├── imooc-flink-basic
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── imooc
│ │ └── flink
│ │ └── basic
│ │ ├── BatchWCApp.java
│ │ └── StreamingWCApp.java
│ ├── imooc-flink-dataset
│ └── pom.xml
│ ├── imooc-flink-datastream
│ ├── README.md
│ ├── pom.xml
│ ├── src
│ │ └── main
│ │ │ ├── java
│ │ │ └── com
│ │ │ │ └── imooc
│ │ │ │ └── flink
│ │ │ │ ├── partitioner
│ │ │ │ ├── PKPartitioner.java
│ │ │ │ └── PartitionerApp.java
│ │ │ │ ├── sink
│ │ │ │ ├── PKMySQLSink.java
│ │ │ │ ├── PKRedisSink.java
│ │ │ │ └── SinkApp.java
│ │ │ │ ├── source
│ │ │ │ ├── AccessSource.java
│ │ │ │ ├── AccessSourceV2.java
│ │ │ │ ├── SourceApp.java
│ │ │ │ ├── Student.java
│ │ │ │ └── StudentSource.java
│ │ │ │ ├── state
│ │ │ │ ├── CheckpointApp.java
│ │ │ │ └── StateApp.java
│ │ │ │ ├── transformation
│ │ │ │ ├── Access.java
│ │ │ │ ├── PKMapFunction.java
│ │ │ │ └── TransformationApp.java
│ │ │ │ ├── utils
│ │ │ │ └── MySQLUtils.java
│ │ │ │ ├── window
│ │ │ │ ├── PKProcessWindowFunction.java
│ │ │ │ └── WindowApp.java
│ │ │ │ └── wm
│ │ │ │ └── EventTimeWMApp.java
│ │ │ └── resources
│ │ │ └── log4j.properties
│ └── test.sql
│ ├── imooc-flink-project
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── imooc
│ │ └── flink
│ │ ├── app
│ │ ├── GaodeApp.java
│ │ ├── OsUserCntAppV1.java
│ │ ├── OsUserCntAppV2.java
│ │ ├── OsUserCntAppV3.java
│ │ ├── OsUserCntAppV4.java
│ │ ├── ProvinceUserCntAppV1.java
│ │ ├── TopNAppV1.java
│ │ └── TopNTest.java
│ │ ├── domain
│ │ ├── Access.java
│ │ ├── EventCatagoryProductCount.java
│ │ └── Product.java
│ │ ├── udf
│ │ ├── GaodeLocationMapFunction.java
│ │ ├── TopNAggregateFunction.java
│ │ └── TopNWindowFunction.java
│ │ └── utils
│ │ └── StringUtils.java
│ ├── imooc-flink-sql
│ └── pom.xml
│ ├── imooc-flink-upgrade
│ └── pom.xml
│ └── pom.xml
├── distributed
├── READEME.MD
├── gateway
│ ├── README.md
│ ├── service-order-load1
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── service
│ │ │ │ │ └── ServiceB1Application.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── servicea
│ │ │ └── ServiceAApplicationTests.java
│ ├── service-order-load2
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── service
│ │ │ │ │ └── ServiceB2Application.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── servicea
│ │ │ └── ServiceAApplicationTests.java
│ ├── service-product
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── service
│ │ │ │ │ └── ServiceAApplication.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── service
│ │ │ └── ServiceAApplicationTests.java
│ └── zuul-gateway
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── zuul
│ │ │ │ └── ZuulGatewayApplication.java
│ │ └── resources
│ │ │ ├── META-INF
│ │ │ └── additional-spring-configuration-metadata.json
│ │ │ └── application.yml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── zuul
│ │ └── ZuulGatewayApplicationTests.java
├── gray
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── Application.java
│ │ │ ├── v1
│ │ │ ├── Constant.java
│ │ │ ├── GrayHelper.java
│ │ │ ├── InterfaceWeightGroup.java
│ │ │ ├── WeightCategory.java
│ │ │ ├── WeightRandom.java
│ │ │ └── WeightTest.java
│ │ │ └── v2
│ │ │ ├── Constant.java
│ │ │ ├── GrayHelper.java
│ │ │ ├── InterfaceWeightGroup.java
│ │ │ ├── UrlListEnum.java
│ │ │ ├── WeightCategory.java
│ │ │ ├── WeightTest.java
│ │ │ └── web
│ │ │ ├── GrayConfigController.java
│ │ │ └── req
│ │ │ ├── RequestConfig.java
│ │ │ └── RequestConfigParam.java
│ │ └── resources
│ │ └── application.yml
├── hystrix
│ ├── README.MD
│ ├── eshop-cache-ha
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── cache
│ │ │ │ │ └── ha
│ │ │ │ │ ├── CacheApplication.java
│ │ │ │ │ ├── controller
│ │ │ │ │ ├── CacheController.java
│ │ │ │ │ └── HelloController.java
│ │ │ │ │ ├── filter
│ │ │ │ │ └── HystrixRequestContextFilter.java
│ │ │ │ │ ├── http
│ │ │ │ │ └── HttpClientUtils.java
│ │ │ │ │ ├── hystrix
│ │ │ │ │ └── command
│ │ │ │ │ │ ├── GetBrandNameCommand.java
│ │ │ │ │ │ ├── GetCityNameCommand.java
│ │ │ │ │ │ ├── GetProductInfoCommand.java
│ │ │ │ │ │ ├── GetProductInfosCommand.java
│ │ │ │ │ │ └── UpdateProductInfoCommand.java
│ │ │ │ │ ├── local
│ │ │ │ │ ├── BrandCache.java
│ │ │ │ │ └── LocationCache.java
│ │ │ │ │ ├── mapper
│ │ │ │ │ └── UserMapper.java
│ │ │ │ │ └── model
│ │ │ │ │ └── ProductInfo.java
│ │ │ └── resources
│ │ │ │ ├── application.properties
│ │ │ │ ├── mybatis
│ │ │ │ └── UserMapper.xml
│ │ │ │ └── templates
│ │ │ │ └── hello.html
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── cache
│ │ │ └── ha
│ │ │ ├── CircuitBreakerTest.java
│ │ │ └── RejectTest.java
│ ├── eshop-product-ha
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── product
│ │ │ │ │ └── ha
│ │ │ │ │ ├── ProductApplication.java
│ │ │ │ │ ├── controller
│ │ │ │ │ ├── HelloController.java
│ │ │ │ │ └── ProductController.java
│ │ │ │ │ └── mapper
│ │ │ │ │ └── UserMapper.java
│ │ │ └── resources
│ │ │ │ ├── application.properties
│ │ │ │ ├── mybatis
│ │ │ │ └── UserMapper.xml
│ │ │ │ └── templates
│ │ │ │ └── hello.html
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── product
│ │ │ └── ha
│ │ │ └── ProductHaApplicationTests.java
│ └── pom.xml
├── lock
│ ├── flow1
│ │ ├── Thread Group100.jmx
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── cunchang
│ │ │ │ │ ├── Application1.java
│ │ │ │ │ ├── config
│ │ │ │ │ └── RedisConfig.java
│ │ │ │ │ └── controller
│ │ │ │ │ ├── GoodController1.java
│ │ │ │ │ ├── GoodController2.java
│ │ │ │ │ ├── GoodController3.java
│ │ │ │ │ ├── GoodController4.java
│ │ │ │ │ ├── GoodController5.java
│ │ │ │ │ ├── GoodController6.java
│ │ │ │ │ ├── GoodController7_1.java
│ │ │ │ │ ├── GoodController7_2.java
│ │ │ │ │ └── GoodController8.java
│ │ │ └── resources
│ │ │ │ ├── application.properties
│ │ │ │ └── lua
│ │ │ │ └── DelLockScript.lua
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ └── Application1Tests.java
│ ├── flow2
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── cunchang
│ │ │ │ │ ├── Application2.java
│ │ │ │ │ ├── config
│ │ │ │ │ └── RedisConfig.java
│ │ │ │ │ └── controller
│ │ │ │ │ ├── GoodController.java
│ │ │ │ │ └── GoodController8.java
│ │ │ └── resources
│ │ │ │ └── application.properties
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ └── Application2Tests.java
│ ├── jedis
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── JedisUtil.java
│ │ │ │ ├── asynqueue
│ │ │ │ └── RedisDelayingQueue.java
│ │ │ │ ├── basic
│ │ │ │ ├── BasicOperation.java
│ │ │ │ └── StringOper.java
│ │ │ │ ├── bloomfilter
│ │ │ │ ├── BloomTest.java
│ │ │ │ ├── BloomTest2.java
│ │ │ │ ├── BloomTest3.java
│ │ │ │ └── GuavaBloom.java
│ │ │ │ ├── cluster
│ │ │ │ ├── ClusterTest.java
│ │ │ │ └── JedisClusterFactory.java
│ │ │ │ ├── common
│ │ │ │ └── Const.java
│ │ │ │ ├── hyperloglog
│ │ │ │ └── PfTest.java
│ │ │ │ ├── lock
│ │ │ │ ├── LockDome.java
│ │ │ │ ├── RedisWithReentrantLock.java
│ │ │ │ └── real
│ │ │ │ │ ├── Client.java
│ │ │ │ │ ├── CodeBlock.java
│ │ │ │ │ └── LockUtil.java
│ │ │ │ ├── partition
│ │ │ │ └── PartitionTest.java
│ │ │ │ ├── pipeline
│ │ │ │ └── PipelineTest.java
│ │ │ │ ├── publishersubscriber
│ │ │ │ ├── PublisherTest.java
│ │ │ │ └── SubscriberTest.java
│ │ │ │ ├── sentinel
│ │ │ │ └── SentinelTest.java
│ │ │ │ └── transaction
│ │ │ │ └── TransactionTest.java
│ │ │ └── resources
│ │ │ └── Setnx_Expire_Srcipt.lua
│ └── redisson
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── RedissonUtil.java
│ │ └── lock
│ │ ├── DemoMain.java
│ │ ├── LockDemo.java
│ │ ├── MultiLockDemo.java
│ │ ├── RedLockDemo.java
│ │ ├── TryLockDemo.java
│ │ └── test
│ │ └── ThreadGcTest.java
├── mq
│ ├── activemq
│ │ ├── README.MD
│ │ ├── activemq-api
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── latwhisper
│ │ │ │ │ └── activemq
│ │ │ │ │ ├── Constant.java
│ │ │ │ │ ├── queue
│ │ │ │ │ ├── QueueConsumer.java
│ │ │ │ │ └── QueueProducer.java
│ │ │ │ │ └── topic
│ │ │ │ │ ├── TopicConsumer.java
│ │ │ │ │ └── TopicProducer.java
│ │ │ │ └── resources
│ │ │ │ └── jms规范接口.jpg
│ │ ├── activemq-spring
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── activemq
│ │ │ │ │ ├── amq
│ │ │ │ │ ├── consumer
│ │ │ │ │ │ ├── queue
│ │ │ │ │ │ │ ├── QueueReceiver1.java
│ │ │ │ │ │ │ └── QueueReceiver2.java
│ │ │ │ │ │ └── topic
│ │ │ │ │ │ │ ├── TopicReceiver1.java
│ │ │ │ │ │ │ └── TopicReceiver2.java
│ │ │ │ │ └── producer
│ │ │ │ │ │ ├── QueueSender.java
│ │ │ │ │ │ └── TopicSender.java
│ │ │ │ │ └── ctrl
│ │ │ │ │ └── DemoController.java
│ │ │ │ ├── resources
│ │ │ │ ├── spring-amq.xml
│ │ │ │ ├── spring-main.xml
│ │ │ │ └── spring-mvc.xml
│ │ │ │ └── webapp
│ │ │ │ ├── WEB-INF
│ │ │ │ └── web.xml
│ │ │ │ └── index.jsp
│ │ └── pom.xml
│ ├── rabbitmq
│ │ ├── README.md
│ │ ├── RabbitMQ安装文档.txt
│ │ ├── pom.xml
│ │ ├── rabbitmq-api
│ │ │ ├── README.md
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── rabbitmq
│ │ │ │ ├── api
│ │ │ │ ├── ack
│ │ │ │ │ ├── Consumer.java
│ │ │ │ │ ├── MyConsumer.java
│ │ │ │ │ └── Producer.java
│ │ │ │ ├── confirm
│ │ │ │ │ ├── Consumer.java
│ │ │ │ │ └── Producer.java
│ │ │ │ ├── consumer
│ │ │ │ │ ├── Consumer.java
│ │ │ │ │ ├── MyConsumer.java
│ │ │ │ │ └── Producer.java
│ │ │ │ ├── dlx
│ │ │ │ │ ├── Consumer.java
│ │ │ │ │ ├── MyConsumer.java
│ │ │ │ │ └── Producer.java
│ │ │ │ ├── exchange
│ │ │ │ │ ├── direct
│ │ │ │ │ │ ├── Consumer4DirectExchange.java
│ │ │ │ │ │ └── Producer4DirectExchange.java
│ │ │ │ │ ├── fanout
│ │ │ │ │ │ ├── Consumer4FanoutExchange.java
│ │ │ │ │ │ └── Producer4FanoutExchange.java
│ │ │ │ │ └── topic
│ │ │ │ │ │ ├── Consumer4TopicExchange.java
│ │ │ │ │ │ └── Producer4TopicExchange.java
│ │ │ │ ├── limit
│ │ │ │ │ ├── Consumer.java
│ │ │ │ │ ├── MyConsumer.java
│ │ │ │ │ └── Producer.java
│ │ │ │ ├── message
│ │ │ │ │ ├── Consumer.java
│ │ │ │ │ └── Producer.java
│ │ │ │ └── returnlistener
│ │ │ │ │ ├── Consumer.java
│ │ │ │ │ └── Producer.java
│ │ │ │ ├── common
│ │ │ │ └── Constant.java
│ │ │ │ └── quickstart
│ │ │ │ ├── Consumer.java
│ │ │ │ └── Producer.java
│ │ ├── rabbitmq-spring
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ ├── main
│ │ │ │ ├── java
│ │ │ │ │ └── cn
│ │ │ │ │ │ └── lastwhisper
│ │ │ │ │ │ └── rabbitmq
│ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ ├── adapter
│ │ │ │ │ │ └── MessageDelegate.java
│ │ │ │ │ │ ├── config
│ │ │ │ │ │ └── RabbitMQConfig.java
│ │ │ │ │ │ ├── convert
│ │ │ │ │ │ ├── ConverterBody.java
│ │ │ │ │ │ ├── ImageMessageConverter.java
│ │ │ │ │ │ ├── PDFMessageConverter.java
│ │ │ │ │ │ └── TextMessageConverter.java
│ │ │ │ │ │ └── entity
│ │ │ │ │ │ ├── Order.java
│ │ │ │ │ │ └── Packaged.java
│ │ │ │ └── resources
│ │ │ │ │ └── application.properties
│ │ │ │ └── test
│ │ │ │ └── java
│ │ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── rabbitmq
│ │ │ │ └── ApplicationTests.java
│ │ ├── rabbitmq-springboot-consumer
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ ├── main
│ │ │ │ ├── java
│ │ │ │ │ └── com
│ │ │ │ │ │ └── bfxy
│ │ │ │ │ │ └── springboot
│ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ ├── MainConfig.java
│ │ │ │ │ │ ├── conusmer
│ │ │ │ │ │ └── RabbitReceiver.java
│ │ │ │ │ │ └── entity
│ │ │ │ │ │ └── Order.java
│ │ │ │ └── resources
│ │ │ │ │ └── application.properties
│ │ │ │ └── test
│ │ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── bfxy
│ │ │ │ └── springboot
│ │ │ │ └── ApplicationTests.java
│ │ ├── rabbitmq-springboot-producer-reliable
│ │ │ ├── docs
│ │ │ │ └── test.sql
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ ├── main
│ │ │ │ ├── java
│ │ │ │ │ └── com
│ │ │ │ │ │ └── bfxy
│ │ │ │ │ │ └── springboot
│ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ ├── MainConfig.java
│ │ │ │ │ │ ├── config
│ │ │ │ │ │ ├── database
│ │ │ │ │ │ │ ├── BaseMapper.java
│ │ │ │ │ │ │ ├── DruidDataSourceConfig.java
│ │ │ │ │ │ │ ├── DruidDataSourceSettings.java
│ │ │ │ │ │ │ ├── MybatisDataSourceConfig.java
│ │ │ │ │ │ │ └── MybatisMapperScanerConfig.java
│ │ │ │ │ │ └── task
│ │ │ │ │ │ │ └── TaskSchedulerConfig.java
│ │ │ │ │ │ ├── constant
│ │ │ │ │ │ └── Constants.java
│ │ │ │ │ │ ├── entity
│ │ │ │ │ │ ├── BrokerMessageLog.java
│ │ │ │ │ │ └── Order.java
│ │ │ │ │ │ ├── mapper
│ │ │ │ │ │ ├── BrokerMessageLogMapper.java
│ │ │ │ │ │ └── OrderMapper.java
│ │ │ │ │ │ ├── mapping
│ │ │ │ │ │ ├── BrokerMessageLogMapper.xml
│ │ │ │ │ │ └── OrderMapper.xml
│ │ │ │ │ │ ├── producer
│ │ │ │ │ │ ├── RabbitOrderSender.java
│ │ │ │ │ │ └── RabbitSender.java
│ │ │ │ │ │ ├── service
│ │ │ │ │ │ └── OrderService.java
│ │ │ │ │ │ ├── task
│ │ │ │ │ │ └── RetryMessageTasker.java
│ │ │ │ │ │ └── utils
│ │ │ │ │ │ └── FastJsonConvertUtil.java
│ │ │ │ └── resources
│ │ │ │ │ ├── application.properties
│ │ │ │ │ └── druid.properties
│ │ │ │ └── test
│ │ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── bfxy
│ │ │ │ └── springboot
│ │ │ │ └── ApplicationTests.java
│ │ ├── rabbitmq-springboot-producer
│ │ │ ├── .gitignore
│ │ │ ├── mvnw
│ │ │ ├── mvnw.cmd
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ ├── main
│ │ │ │ ├── java
│ │ │ │ │ └── com
│ │ │ │ │ │ └── bfxy
│ │ │ │ │ │ └── springboot
│ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ ├── MainConfig.java
│ │ │ │ │ │ ├── entity
│ │ │ │ │ │ └── Order.java
│ │ │ │ │ │ └── producer
│ │ │ │ │ │ └── RabbitSender.java
│ │ │ │ └── resources
│ │ │ │ │ └── application.properties
│ │ │ │ └── test
│ │ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── bfxy
│ │ │ │ └── springboot
│ │ │ │ └── ApplicationTests.java
│ │ ├── rabbitmq-springcloudstream-consumer
│ │ │ ├── .gitignore
│ │ │ ├── mvnw
│ │ │ ├── mvnw.cmd
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ ├── main
│ │ │ │ ├── java
│ │ │ │ │ └── com
│ │ │ │ │ │ └── bfxy
│ │ │ │ │ │ └── rabbitmq
│ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ └── stream
│ │ │ │ │ │ ├── Barista.java
│ │ │ │ │ │ └── RabbitmqReceiver.java
│ │ │ │ └── resources
│ │ │ │ │ └── application.properties
│ │ │ │ └── test
│ │ │ │ └── java
│ │ │ │ └── com
│ │ │ │ └── bfxy
│ │ │ │ └── rabbitmq
│ │ │ │ └── ApplicationTests.java
│ │ └── rabbitmq-springcloudstream-producer
│ │ │ ├── .gitignore
│ │ │ ├── mvnw
│ │ │ ├── mvnw.cmd
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── bfxy
│ │ │ │ │ └── rabbitmq
│ │ │ │ │ ├── Application.java
│ │ │ │ │ └── stream
│ │ │ │ │ ├── Barista.java
│ │ │ │ │ └── RabbitmqSender.java
│ │ │ └── resources
│ │ │ │ └── application.properties
│ │ │ └── test
│ │ │ └── java
│ │ │ └── com
│ │ │ └── bfxy
│ │ │ └── rabbitmq
│ │ │ └── ApplicationTests.java
│ └── rocketmq
│ │ ├── pom.xml
│ │ ├── rocketmq-api
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── batch
│ │ │ ├── Consumer.java
│ │ │ ├── ListSplitter.java
│ │ │ ├── SimpleBatchProducer.java
│ │ │ └── SplitBatchProducer.java
│ │ │ ├── consumer
│ │ │ ├── broadcast
│ │ │ │ └── BroadCastConsumer.java
│ │ │ ├── pull
│ │ │ │ ├── PullConsumer.java
│ │ │ │ └── PullScheduleConsumer.java
│ │ │ ├── push
│ │ │ │ └── PushConsumer.java
│ │ │ └── retry
│ │ │ │ ├── Consumer.java
│ │ │ │ └── Producer.java
│ │ │ ├── contants
│ │ │ └── Const.java
│ │ │ ├── filter
│ │ │ ├── Consumer.java
│ │ │ ├── Producer.java
│ │ │ ├── SqlConsumer.java
│ │ │ └── SqlProducer.java
│ │ │ ├── ordermsg
│ │ │ ├── ConsumerInOrder.java
│ │ │ └── Producer.java
│ │ │ ├── producer
│ │ │ ├── PushConsumer.java
│ │ │ ├── async
│ │ │ │ └── AsyncProducer.java
│ │ │ ├── oneway
│ │ │ │ └── OnewayProducer.java
│ │ │ └── sync
│ │ │ │ └── SyncProducer.java
│ │ │ ├── quickstart
│ │ │ ├── Consumer.java
│ │ │ └── Producer.java
│ │ │ ├── schedulemsg
│ │ │ ├── ScheduledMessageConsumer.java
│ │ │ └── ScheduledMessageProducer.java
│ │ │ └── transaction
│ │ │ ├── Consumer.java
│ │ │ ├── TransactionListenerImpl.java
│ │ │ └── TransactionProducer.java
│ │ ├── springboot-rocketmq
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── roy
│ │ │ │ │ └── rocketmq
│ │ │ │ │ ├── RocketMQSBApplication.java
│ │ │ │ │ ├── basic
│ │ │ │ │ ├── SpringConsumer.java
│ │ │ │ │ └── SpringProducer.java
│ │ │ │ │ ├── config
│ │ │ │ │ ├── ExtRocketMQTemplate.java
│ │ │ │ │ ├── MyTransactionImpl.java
│ │ │ │ │ └── Swagger2.java
│ │ │ │ │ ├── controller
│ │ │ │ │ └── MQTestController.java
│ │ │ │ │ └── domain
│ │ │ │ │ ├── OrderPaidEvent.java
│ │ │ │ │ ├── ProductWithPayload.java
│ │ │ │ │ └── User.java
│ │ │ └── resources
│ │ │ │ └── application.properties
│ │ │ └── test
│ │ │ └── java
│ │ │ └── com
│ │ │ └── roy
│ │ │ └── rocketmq
│ │ │ └── SpringRocketTest.java
│ │ └── springcloud-alibaba-rocketmq
│ │ ├── README.md
│ │ ├── pom.xml
│ │ ├── rocketmq-consumer
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── RocketmqConsumerApplication.java
│ │ │ │ ├── listener
│ │ │ │ ├── MessageChannel.java
│ │ │ │ └── PayNoticeConsumer.java
│ │ │ │ └── message
│ │ │ │ └── PayResultMsg.java
│ │ │ └── resources
│ │ │ └── application.yml
│ │ └── rocketmq-producer
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── RocketmqProducerApplication.java
│ │ │ ├── message
│ │ │ ├── MessageChannel.java
│ │ │ └── PayResultMsg.java
│ │ │ └── producer
│ │ │ └── ProducerController.java
│ │ └── resources
│ │ └── application.yml
├── session
│ ├── jwt-session
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── cunchang
│ │ │ │ │ ├── Application.java
│ │ │ │ │ ├── config
│ │ │ │ │ ├── LoginIntercepter.java
│ │ │ │ │ └── WebMvcConfig.java
│ │ │ │ │ └── controller
│ │ │ │ │ └── UserController.java
│ │ │ └── resources
│ │ │ │ └── application.properties
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ └── ApplicationTests.java
│ ├── redis-session
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── cunchang
│ │ │ │ │ ├── Application.java
│ │ │ │ │ └── controller
│ │ │ │ │ └── UserController.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ └── ApplicationTests.java
│ ├── spring-session
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── cuchang
│ │ │ │ │ ├── Application.java
│ │ │ │ │ └── controller
│ │ │ │ │ └── UserController.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cuchang
│ │ │ └── ApplicationTests.java
│ └── tomcat-session
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cuchang
│ │ │ │ ├── Application.java
│ │ │ │ └── controller
│ │ │ │ └── UserController.java
│ │ └── resources
│ │ │ └── application.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── cuchang
│ │ └── ApplicationTests.java
├── sharding-sphere
│ └── ShardingSphereDemo
│ │ ├── README.md
│ │ ├── pom.xml
│ │ ├── sql
│ │ ├── course.sql
│ │ ├── t_dict.sql
│ │ └── t_user.sql
│ │ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── roy
│ │ │ │ └── shardingDemo
│ │ │ │ ├── ShardingJDBCApplication.java
│ │ │ │ ├── algorithem
│ │ │ │ ├── MyComplexDSShardingAlgorithm.java
│ │ │ │ ├── MyComplexTableShardingAlgorithm.java
│ │ │ │ ├── MyHintTableShardingAlgorithm.java
│ │ │ │ ├── MyPreciseDSShardingAlgorithm.java
│ │ │ │ ├── MyPreciseTableShardingAlgorithm.java
│ │ │ │ ├── MyRangeDSShardingAlgorithm.java
│ │ │ │ └── MyRangeTableShardingAlgorithm.java
│ │ │ │ ├── entity
│ │ │ │ ├── Course.java
│ │ │ │ ├── Dict.java
│ │ │ │ └── User.java
│ │ │ │ └── mapper
│ │ │ │ ├── CourseMapper.java
│ │ │ │ ├── DictMapper.java
│ │ │ │ └── UserMapper.java
│ │ └── resources
│ │ │ ├── application.properties
│ │ │ ├── application01.properties
│ │ │ ├── application02.properties
│ │ │ ├── application03.properties
│ │ │ ├── application04.properties
│ │ │ └── application05.properties
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── roy
│ │ └── shardingDemo
│ │ └── ShardingJDBCTest.java
├── springcloud-debug
│ ├── consumer
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── HelloFeignClient.java
│ │ │ └── resources
│ │ │ └── application.yml
│ ├── pom.xml
│ └── producer
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── HelloController.java
│ │ │ └── ProducerApplication.java
│ │ └── resources
│ │ └── application.yml
├── springcloud-netflix
│ ├── api-gateway
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── apigateway
│ │ │ │ │ ├── ApiGatewayApplication.java
│ │ │ │ │ ├── config
│ │ │ │ │ ├── CorsConfig.java
│ │ │ │ │ └── ZuulConfig.java
│ │ │ │ │ ├── constant
│ │ │ │ │ ├── CookieConstant.java
│ │ │ │ │ └── RedisConstant.java
│ │ │ │ │ ├── exception
│ │ │ │ │ └── RateLimitException.java
│ │ │ │ │ ├── filter
│ │ │ │ │ ├── AuthBuyerFilter.java
│ │ │ │ │ ├── AuthFilter.java
│ │ │ │ │ ├── AuthSellerFilter.java
│ │ │ │ │ ├── PostResponseHeaderFilter.java
│ │ │ │ │ ├── PreTokenFilter.java
│ │ │ │ │ └── RateLimiterFilter.java
│ │ │ │ │ └── utils
│ │ │ │ │ └── CookieUtil.java
│ │ │ └── resources
│ │ │ │ └── bootstrap.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── apigateway
│ │ │ └── ApiGatewayApplicationTests.java
│ ├── client
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── client
│ │ │ │ │ └── ClientApplication.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── client
│ │ │ └── ClientApplicationTests.java
│ ├── config
│ │ ├── Dockerfile
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── config
│ │ │ │ │ └── ConfigApplication.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── config
│ │ │ └── ConfigApplicationTests.java
│ ├── doc
│ │ ├── API.md
│ │ ├── README.md
│ │ ├── springcloud.sql
│ │ └── 思考与收获.txt
│ ├── eureka
│ │ ├── Dockerfile
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── eureka
│ │ │ │ │ └── EurekaApplication.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── eureka
│ │ │ └── EurekaApplicationTests.java
│ ├── order-old
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── order
│ │ │ │ │ ├── OrderApplication.java
│ │ │ │ │ ├── client
│ │ │ │ │ └── ProductClient.java
│ │ │ │ │ ├── conf
│ │ │ │ │ └── RestTemplateConfig.java
│ │ │ │ │ ├── controller
│ │ │ │ │ ├── FeignClientController.java
│ │ │ │ │ ├── OrderController.java
│ │ │ │ │ └── RestTemplateClientController.java
│ │ │ │ │ ├── convert
│ │ │ │ │ └── OrderForm2OrderDTOConvert.java
│ │ │ │ │ ├── domain
│ │ │ │ │ ├── OrderDetail.java
│ │ │ │ │ ├── OrderMaster.java
│ │ │ │ │ └── ProductInfo.java
│ │ │ │ │ ├── dto
│ │ │ │ │ ├── CartDTO.java
│ │ │ │ │ └── OrderDTO.java
│ │ │ │ │ ├── enums
│ │ │ │ │ ├── OrderStatusEnum.java
│ │ │ │ │ ├── PayStatusEnum.java
│ │ │ │ │ └── ResultEnum.java
│ │ │ │ │ ├── exception
│ │ │ │ │ └── OrderException.java
│ │ │ │ │ ├── form
│ │ │ │ │ └── OrderForm.java
│ │ │ │ │ ├── repository
│ │ │ │ │ ├── OrderDetailRepository.java
│ │ │ │ │ └── OrderMasterRepository.java
│ │ │ │ │ ├── service
│ │ │ │ │ ├── OrderService.java
│ │ │ │ │ └── impl
│ │ │ │ │ │ └── OrderServiceImpl.java
│ │ │ │ │ ├── utils
│ │ │ │ │ ├── KeyUtil.java
│ │ │ │ │ └── ResultVOUtil.java
│ │ │ │ │ └── vo
│ │ │ │ │ └── ResultVO.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── order
│ │ │ ├── OrderApplicationTests.java
│ │ │ └── repository
│ │ │ ├── OrderDetailRepositoryTest.java
│ │ │ └── OrderMasterRepositoryTest.java
│ ├── order
│ │ ├── order-client
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── order
│ │ │ │ └── client
│ │ │ │ └── OrderClient.java
│ │ ├── order-common
│ │ │ └── pom.xml
│ │ ├── order-server
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ ├── main
│ │ │ │ ├── java
│ │ │ │ │ └── cn
│ │ │ │ │ │ └── lastwhisper
│ │ │ │ │ │ └── order
│ │ │ │ │ │ ├── OrderApplication.java
│ │ │ │ │ │ ├── conf
│ │ │ │ │ │ └── RestTemplateConfig.java
│ │ │ │ │ │ ├── controller
│ │ │ │ │ │ ├── EnvController.java
│ │ │ │ │ │ ├── FeignClientController.java
│ │ │ │ │ │ ├── HystrixController.java
│ │ │ │ │ │ ├── OrderController.java
│ │ │ │ │ │ ├── RestTemplateClientController.java
│ │ │ │ │ │ └── SendMessageController.java
│ │ │ │ │ │ ├── convert
│ │ │ │ │ │ └── OrderForm2OrderDTOConvert.java
│ │ │ │ │ │ ├── domain
│ │ │ │ │ │ ├── OrderDetail.java
│ │ │ │ │ │ ├── OrderMaster.java
│ │ │ │ │ │ └── ProductInfo.java
│ │ │ │ │ │ ├── dto
│ │ │ │ │ │ ├── CartDTO.java
│ │ │ │ │ │ └── OrderDTO.java
│ │ │ │ │ │ ├── enums
│ │ │ │ │ │ ├── OrderStatusEnum.java
│ │ │ │ │ │ ├── PayStatusEnum.java
│ │ │ │ │ │ └── ResultEnum.java
│ │ │ │ │ │ ├── exception
│ │ │ │ │ │ └── OrderException.java
│ │ │ │ │ │ ├── form
│ │ │ │ │ │ └── OrderForm.java
│ │ │ │ │ │ ├── message
│ │ │ │ │ │ ├── AmqpReceiver.java
│ │ │ │ │ │ ├── ProductInfoReceiver.java
│ │ │ │ │ │ ├── StreamClient.java
│ │ │ │ │ │ └── StreamReceiver.java
│ │ │ │ │ │ ├── repository
│ │ │ │ │ │ ├── OrderDetailRepository.java
│ │ │ │ │ │ └── OrderMasterRepository.java
│ │ │ │ │ │ ├── service
│ │ │ │ │ │ ├── OrderService.java
│ │ │ │ │ │ └── impl
│ │ │ │ │ │ │ └── OrderServiceImpl.java
│ │ │ │ │ │ ├── utils
│ │ │ │ │ │ ├── JsonUtil.java
│ │ │ │ │ │ ├── KeyUtil.java
│ │ │ │ │ │ └── ResultVOUtil.java
│ │ │ │ │ │ └── vo
│ │ │ │ │ │ └── ResultVO.java
│ │ │ │ └── resources
│ │ │ │ │ ├── META-INF
│ │ │ │ │ └── additional-spring-configuration-metadata.json
│ │ │ │ │ ├── application.txt
│ │ │ │ │ └── bootstrap.yml
│ │ │ │ └── test
│ │ │ │ └── java
│ │ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── order
│ │ │ │ ├── MqSenderTest.java
│ │ │ │ ├── OrderApplicationTests.java
│ │ │ │ └── repository
│ │ │ │ ├── OrderDetailRepositoryTest.java
│ │ │ │ └── OrderMasterRepositoryTest.java
│ │ └── pom.xml
│ ├── pom.xml
│ ├── product-old
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── product
│ │ │ │ │ ├── ProductApplication.java
│ │ │ │ │ ├── controller
│ │ │ │ │ ├── ProductController.java
│ │ │ │ │ └── ServerController.java
│ │ │ │ │ ├── domain
│ │ │ │ │ ├── ProductCategory.java
│ │ │ │ │ └── ProductInfo.java
│ │ │ │ │ ├── dto
│ │ │ │ │ └── CartDTO.java
│ │ │ │ │ ├── enums
│ │ │ │ │ ├── ProductStatusEnum.java
│ │ │ │ │ └── ResultEnum.java
│ │ │ │ │ ├── exception
│ │ │ │ │ └── ProductExecption.java
│ │ │ │ │ ├── repository
│ │ │ │ │ ├── ProductCategoryRepository.java
│ │ │ │ │ └── ProductInfoRepository.java
│ │ │ │ │ ├── service
│ │ │ │ │ ├── CategoryService.java
│ │ │ │ │ ├── ProductService.java
│ │ │ │ │ └── impl
│ │ │ │ │ │ ├── CategoryServiceImpl.java
│ │ │ │ │ │ └── ProductServiceImpl.java
│ │ │ │ │ ├── utils
│ │ │ │ │ └── ResultVOUtil.java
│ │ │ │ │ └── vo
│ │ │ │ │ ├── ProductInfoVO.java
│ │ │ │ │ ├── ProductVO.java
│ │ │ │ │ └── ResultVO.java
│ │ │ └── resources
│ │ │ │ └── application.yml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── product
│ │ │ ├── ProductApplicationTests.java
│ │ │ ├── repository
│ │ │ ├── ProductCategoryRepositoryTest.java
│ │ │ └── ProductInfoRepositoryTest.java
│ │ │ └── service
│ │ │ ├── CategoryServiceTest.java
│ │ │ └── ProductServiceTest.java
│ ├── product
│ │ ├── pom.xml
│ │ ├── product-client
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── product
│ │ │ │ └── client
│ │ │ │ └── ProductClient.java
│ │ ├── product-common
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── product
│ │ │ │ └── common
│ │ │ │ ├── DecreaseStockInput.java
│ │ │ │ └── ProductInfoOutput.java
│ │ └── product-server
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── product
│ │ │ │ ├── ProductApplication.java
│ │ │ │ ├── controller
│ │ │ │ ├── ProductController.java
│ │ │ │ └── ServerController.java
│ │ │ │ ├── domain
│ │ │ │ ├── ProductCategory.java
│ │ │ │ └── ProductInfo.java
│ │ │ │ ├── dto
│ │ │ │ └── CartDTO.java
│ │ │ │ ├── enums
│ │ │ │ ├── ProductStatusEnum.java
│ │ │ │ └── ResultEnum.java
│ │ │ │ ├── exception
│ │ │ │ └── ProductExecption.java
│ │ │ │ ├── repository
│ │ │ │ ├── ProductCategoryRepository.java
│ │ │ │ └── ProductInfoRepository.java
│ │ │ │ ├── service
│ │ │ │ ├── CategoryService.java
│ │ │ │ ├── ProductService.java
│ │ │ │ └── impl
│ │ │ │ │ ├── CategoryServiceImpl.java
│ │ │ │ │ └── ProductServiceImpl.java
│ │ │ │ ├── utils
│ │ │ │ ├── JsonUtil.java
│ │ │ │ └── ResultVOUtil.java
│ │ │ │ └── vo
│ │ │ │ ├── ProductInfoVO.java
│ │ │ │ ├── ProductVO.java
│ │ │ │ └── ResultVO.java
│ │ │ └── resources
│ │ │ ├── application.txt
│ │ │ └── bootstrap.yml
│ └── user
│ │ ├── pom.xml
│ │ └── user-server
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── user
│ │ │ │ ├── UserApplication.java
│ │ │ │ ├── constant
│ │ │ │ ├── CookieConstant.java
│ │ │ │ └── RedisConstant.java
│ │ │ │ ├── controller
│ │ │ │ └── LoginController.java
│ │ │ │ ├── domain
│ │ │ │ └── UserInfo.java
│ │ │ │ ├── enums
│ │ │ │ ├── ResultEnum.java
│ │ │ │ └── RoleEnum.java
│ │ │ │ ├── repository
│ │ │ │ └── UserRepository.java
│ │ │ │ ├── service
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl
│ │ │ │ │ └── UserServiceImpl.java
│ │ │ │ ├── utils
│ │ │ │ ├── CookieUtil.java
│ │ │ │ ├── JsonUtil.java
│ │ │ │ └── ResultVOUtil.java
│ │ │ │ └── vo
│ │ │ │ └── ResultVO.java
│ │ └── resources
│ │ │ └── bootstrap.yml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── UserApplicationTests.java
└── transaction
│ ├── README.md
│ ├── demo
│ ├── account-service
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── itcast
│ │ │ │ └── account
│ │ │ │ ├── AccountApplication.java
│ │ │ │ ├── entity
│ │ │ │ └── Account.java
│ │ │ │ ├── mapper
│ │ │ │ └── AccountMapper.java
│ │ │ │ ├── service
│ │ │ │ ├── AccountService.java
│ │ │ │ └── impl
│ │ │ │ │ └── AccountServiceImpl.java
│ │ │ │ └── web
│ │ │ │ └── AccountController.java
│ │ │ └── resources
│ │ │ └── application.yml
│ ├── eureka-server
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── itcast
│ │ │ │ └── eureka
│ │ │ │ └── EurekaApplication.java
│ │ │ └── resources
│ │ │ └── application.yml
│ ├── order-service
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── itcast
│ │ │ │ └── order
│ │ │ │ ├── OrderApplication.java
│ │ │ │ ├── client
│ │ │ │ ├── AccountClient.java
│ │ │ │ └── StorageClient.java
│ │ │ │ ├── entity
│ │ │ │ └── Order.java
│ │ │ │ ├── mapper
│ │ │ │ └── OrderMapper.java
│ │ │ │ ├── service
│ │ │ │ ├── OrderService.java
│ │ │ │ └── impl
│ │ │ │ │ └── OrderServiceImpl.java
│ │ │ │ └── web
│ │ │ │ └── OrderController.java
│ │ │ └── resources
│ │ │ └── application.yml
│ ├── pom.xml
│ └── storage-service
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── itcast
│ │ │ └── storage
│ │ │ ├── StorageApplication.java
│ │ │ ├── entity
│ │ │ └── Storage.java
│ │ │ ├── mapper
│ │ │ └── StorageMapper.java
│ │ │ ├── service
│ │ │ ├── StorageService.java
│ │ │ └── impl
│ │ │ │ └── StorageServiceImpl.java
│ │ │ └── web
│ │ │ └── StorageController.java
│ │ └── resources
│ │ └── application.yml
│ ├── seata-AT-demo
│ ├── account-service
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── itcast
│ │ │ │ └── account
│ │ │ │ ├── AccountApplication.java
│ │ │ │ ├── config
│ │ │ │ └── DataSourceProxyConfig.java
│ │ │ │ ├── entity
│ │ │ │ └── Account.java
│ │ │ │ ├── mapper
│ │ │ │ └── AccountMapper.java
│ │ │ │ ├── service
│ │ │ │ ├── AccountService.java
│ │ │ │ └── impl
│ │ │ │ │ └── AccountServiceImpl.java
│ │ │ │ └── web
│ │ │ │ └── AccountController.java
│ │ │ └── resources
│ │ │ ├── application.yml
│ │ │ ├── file.conf
│ │ │ └── registry.conf
│ ├── eureka-server
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── itcast
│ │ │ │ └── eureka
│ │ │ │ └── EurekaApplication.java
│ │ │ └── resources
│ │ │ └── application.yml
│ ├── order-service
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── itcast
│ │ │ │ └── order
│ │ │ │ ├── OrderApplication.java
│ │ │ │ ├── client
│ │ │ │ ├── AccountClient.java
│ │ │ │ └── StorageClient.java
│ │ │ │ ├── config
│ │ │ │ └── DataSourceProxyConfig.java
│ │ │ │ ├── entity
│ │ │ │ └── Order.java
│ │ │ │ ├── mapper
│ │ │ │ └── OrderMapper.java
│ │ │ │ ├── service
│ │ │ │ ├── OrderService.java
│ │ │ │ └── impl
│ │ │ │ │ └── OrderServiceImpl.java
│ │ │ │ └── web
│ │ │ │ └── OrderController.java
│ │ │ └── resources
│ │ │ ├── application.yml
│ │ │ ├── file.conf
│ │ │ └── registry.conf
│ ├── pom.xml
│ └── storage-service
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── itcast
│ │ │ └── storage
│ │ │ ├── StorageApplication.java
│ │ │ ├── config
│ │ │ └── DataSourceProxyConfig.java
│ │ │ ├── entity
│ │ │ └── Storage.java
│ │ │ ├── mapper
│ │ │ └── StorageMapper.java
│ │ │ ├── service
│ │ │ ├── StorageService.java
│ │ │ └── impl
│ │ │ │ └── StorageServiceImpl.java
│ │ │ └── web
│ │ │ └── StorageController.java
│ │ └── resources
│ │ ├── application.yml
│ │ ├── file.conf
│ │ └── registry.conf
│ ├── seata_demo.sql
│ └── 分布式事务.zip
├── framework
├── flyway
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── flyway
│ │ │ └── App.java
│ │ └── resources
│ │ └── db
│ │ └── migration
│ │ ├── V1__Create_person_table.sql
│ │ └── V2__Add_people.sql
├── guava
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ ├── bloomfilter
│ │ └── TestBloomFilter.java
│ │ ├── cache
│ │ └── TestCache.java
│ │ ├── collection
│ │ └── MapTest.java
│ │ └── limit
│ │ ├── TestRateLimiter.java
│ │ └── TokenBucket.java
├── hutool
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── IDUtilTest.java
│ │ └── ZipUtilTest.java
├── pinyin4j
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ ├── DeCode.java
│ │ └── PinYinUtil.java
└── tika
│ ├── pom.xml
│ └── src
│ ├── main
│ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── TikaApplication.java
│ └── resources
│ │ └── application.properties
│ └── test
│ ├── java
│ └── cn
│ │ └── lastwhisper
│ │ ├── TikaApplicationTests.java
│ │ └── TikaTest.java
│ └── resources
│ ├── TikaApplication.java
│ ├── application.properties
│ ├── mapreduce-osdi04.pdf
│ ├── office.xlsx
│ ├── template.xls
│ ├── timg
│ ├── timg.gif
│ ├── timg.jpg
│ ├── timg.jpg.zip
│ ├── transportation.png
│ ├── 测试.docx
│ └── 测试.xlsx
├── java-advance
├── README.md
├── annotation
│ ├── PluggableAnnotationProcessingAPI
│ │ ├── mylombok-test
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ └── java
│ │ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ └── Person.java
│ │ └── mylombok
│ │ │ ├── pom.xml
│ │ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── MyGetter.java
│ │ │ │ └── MyGetterProcessor.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── javax.annotation.processing.Processor
│ ├── README.md
│ └── annatation
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── AnnotationTest.java
│ │ ├── corejava
│ │ ├── buttons3
│ │ │ ├── ButtonFrame.java
│ │ │ └── ButtonTest.java
│ │ └── runtimeAnnotations
│ │ │ ├── ActionListenerFor.java
│ │ │ └── ActionListenerInstaller.java
│ │ ├── dynamicvalue
│ │ ├── JsonProperty.java
│ │ └── StudentRsp.java
│ │ └── syntax
│ │ ├── Level.java
│ │ ├── MetaAnnotation.java
│ │ ├── MyAnnotation.java
│ │ └── UseAnnotation.java
├── groovy
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── Client.java
│ │ │ ├── Constants.java
│ │ │ └── PaymentRequestOrderBO.java
│ │ └── resources
│ │ ├── Demo.groovy
│ │ └── rsp.json
├── javaagent
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ ├── Agent.java
│ │ └── AgentTest.java
├── javassist
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── javassist
│ │ ├── DispatcherServletCollect.java
│ │ ├── Error1.java
│ │ ├── Error2.java
│ │ ├── JavassistDynamicProxyClass.java
│ │ ├── JavassistDynamicProxyInterface.java
│ │ ├── JavassistMonitorMethod.java
│ │ ├── JavassistMonitorServlet.java
│ │ └── StringUtil.java
├── network
│ └── socketproxy
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── CreateSecretKey.java
│ │ ├── LineBuffer.java
│ │ ├── ProxyHandleThread.java
│ │ ├── ProxyServer.java
│ │ ├── SocketHandle.java
│ │ └── SocketProxy.java
├── proxy
│ ├── README.md
│ ├── com
│ │ └── sun
│ │ │ └── proxy
│ │ │ └── $Proxy0.class
│ ├── jdk-proxy
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── v1
│ │ │ ├── ProxyInvocationHandler.java
│ │ │ ├── ProxyTest.java
│ │ │ ├── Subject.java
│ │ │ ├── SubjectImpl.java
│ │ │ └── equal
│ │ │ │ ├── $Proxy0.java
│ │ │ │ ├── ProxyInvocationHandler.java
│ │ │ │ ├── ProxyTest.java
│ │ │ │ ├── Subject.java
│ │ │ │ └── SubjectImpl.java
│ │ │ ├── v2
│ │ │ ├── ProxyInvocationHandler.java
│ │ │ ├── ProxyTest.java
│ │ │ └── Subject.java
│ │ │ └── v3
│ │ │ ├── AbstractProxy.java
│ │ │ ├── ProxyInvocationHandler.java
│ │ │ └── ProxyTest.java
│ ├── mybatis-mapper
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── Main.java
│ │ │ ├── MyMapperProxy.java
│ │ │ ├── SqlSession.java
│ │ │ ├── SysUser.java
│ │ │ └── UserMapper.java
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── Client.java
│ │ ├── Moveable.java
│ │ ├── Tank.java
│ │ ├── cglib
│ │ └── RunMethodIntercepot.java
│ │ ├── jdkdynamic
│ │ └── JdkTimeHandler.java
│ │ ├── myjdkdynamic
│ │ ├── InvocationHandler.java
│ │ ├── MyClassLoader.java
│ │ ├── Proxy1.java
│ │ ├── Proxy2.java
│ │ ├── Proxy3.java
│ │ └── TimeHandler.java
│ │ └── staticproxy
│ │ ├── combination
│ │ ├── TankLogProxy1.java
│ │ └── TankTimeProxy1.java
│ │ └── inherit
│ │ ├── TankLogTimeProxy.java
│ │ └── TankTimeProxy.java
└── spi
│ ├── README.md
│ ├── pom.xml
│ ├── spi-jdbc-interface
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── jdbc
│ │ ├── Driver.java
│ │ └── DriverManager.java
│ ├── spi-mysql
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── mysql
│ │ │ └── MysqlDriver.java
│ │ └── resources
│ │ └── META-INF
│ │ └── services
│ │ └── cn.jdbc.Driver
│ ├── spi-oracle
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── oracle
│ │ │ └── OracleDriver.java
│ │ └── resources
│ │ └── META-INF
│ │ └── services
│ │ └── cn.jdbc.Driver
│ └── web-client
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ └── cn
│ │ └── lastwhisper
│ │ └── JdbcUtil.java
│ └── resources
│ └── META-INF
│ └── services
│ └── cn.jdbc.Driver
├── java-basic
├── README.MD
├── basic
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── Jsq.java
│ │ │ ├── Main.java
│ │ │ ├── README.md
│ │ │ ├── RandomTest.java
│ │ │ ├── collection
│ │ │ ├── ArraysTest.java
│ │ │ ├── Intersection.java
│ │ │ └── README.md
│ │ │ ├── cpu
│ │ │ └── ControlCpu.java
│ │ │ ├── date
│ │ │ ├── AggregateTypeEnum.java
│ │ │ ├── LocalDateTest.java
│ │ │ ├── LocalDateUtil.java
│ │ │ └── Pair.java
│ │ │ ├── decimal
│ │ │ └── BigDecimalTest.java
│ │ │ ├── guava
│ │ │ ├── bloomfilter
│ │ │ │ └── TestBloomFilter.java
│ │ │ ├── cache
│ │ │ │ └── TestCache.java
│ │ │ ├── collection
│ │ │ │ └── MapTest.java
│ │ │ └── limit
│ │ │ │ ├── TestRateLimiter.java
│ │ │ │ └── TokenBucket.java
│ │ │ ├── hutool
│ │ │ ├── IDUtilTest.java
│ │ │ └── ZipUtilTest.java
│ │ │ ├── json
│ │ │ ├── FeatureComment.java
│ │ │ ├── JSONObjectTest.java
│ │ │ └── biz
│ │ │ │ ├── Biz.java
│ │ │ │ ├── BizTest.java
│ │ │ │ └── RuleTypeEnum.java
│ │ │ ├── packagesacn
│ │ │ ├── ClasspathPackageScanner.java
│ │ │ ├── PackageScanner.java
│ │ │ └── StringUtil.java
│ │ │ ├── pinyin4j
│ │ │ ├── DeCode.java
│ │ │ └── PinYinUtil.java
│ │ │ ├── regex
│ │ │ └── RegExTest.java
│ │ │ ├── spring
│ │ │ ├── SpringELTest.java
│ │ │ └── StopWatchTest.java
│ │ │ ├── str
│ │ │ └── StringTest.java
│ │ │ ├── sugar
│ │ │ └── type
│ │ │ │ ├── A.java
│ │ │ │ ├── B.java
│ │ │ │ └── README.md
│ │ │ ├── sysproperty
│ │ │ └── SystemProperty.java
│ │ │ └── trycatch
│ │ │ └── ForTryFinallyTest.java
│ │ └── resources
│ │ └── log4j2.xml
├── concurrent
│ ├── README.md
│ ├── jmm-specification
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ ├── AsIfSerialSample.java
│ │ │ ├── Jmm01_HappensBefore.java
│ │ │ ├── Jmm02_CpuCache.java
│ │ │ ├── Jmm03_CodeVisibility.java
│ │ │ ├── Jmm04_CodeAtomic.java
│ │ │ ├── Jmm05_CodeReorder.java
│ │ │ ├── Jmm06_MemoryBarrier.java
│ │ │ ├── Jmm07_ByteCodeJitDump.java
│ │ │ ├── JmmCausalityCase16Test.java
│ │ │ ├── dcl
│ │ │ └── Singleton.java
│ │ │ ├── tmodel
│ │ │ └── ThreadModel.java
│ │ │ └── util
│ │ │ └── UnsafeInstance.java
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── concurrent
│ │ ├── UncaughtExceptionHandler
│ │ ├── ExecuteCaught.java
│ │ ├── ExecuteCaught2.java
│ │ ├── InitiativeCaught.java
│ │ ├── NoCaughtThread.java
│ │ ├── README.md
│ │ ├── Task.java
│ │ └── WitchCaughtThread.java
│ │ ├── basic
│ │ ├── Daemon.java
│ │ ├── DeadLockDemo.java
│ │ ├── Deprecated.java
│ │ ├── Interrupted
│ │ │ ├── InterruptLockSupportDemo.java
│ │ │ ├── InterruptNotAliveDemo.java
│ │ │ ├── InterruptReadCancelDemo.java
│ │ │ ├── InterruptReadDemo.java
│ │ │ ├── InterruptRunnableDemo.java
│ │ │ ├── InterruptSynchronizedDemo.java
│ │ │ ├── InterruptWaitingDemo.java
│ │ │ ├── README.md
│ │ │ └── Shutdown.java
│ │ ├── README.md
│ │ ├── SleepUtils.java
│ │ ├── communicate
│ │ │ ├── Join.java
│ │ │ ├── Piped.java
│ │ │ ├── README.md
│ │ │ └── WaitNotify.java
│ │ ├── createthread
│ │ │ └── TestCallable.java
│ │ ├── state
│ │ │ ├── ThreadState.java
│ │ │ └── jstack.txt
│ │ ├── synchronized1
│ │ │ ├── Juc_PrintMarkWord.java
│ │ │ ├── README.md
│ │ │ ├── T0_BasicLock.java
│ │ │ ├── T0_ObjectSize.java
│ │ │ ├── T0_ObjectStackAlloc.java
│ │ │ └── T0_heavyWeightMonitor.java
│ │ ├── threadlocal
│ │ │ ├── AlibabaThreadLocalDemo.java
│ │ │ ├── InheritableThreadLocalDemo.java
│ │ │ ├── InheritableThreadLocalDemo2.java
│ │ │ ├── README.md
│ │ │ ├── ThreadLocalDemo.java
│ │ │ ├── ThreadLocalDemo2.java
│ │ │ ├── ThreadLocalMemoryLeak.java
│ │ │ └── ThreadLocal_GC_Demo.java
│ │ └── volatileDemo
│ │ │ ├── Main.java
│ │ │ ├── VolatileDemo.java
│ │ │ ├── VolatileDemo2.java
│ │ │ ├── VolatileRefExample.java
│ │ │ └── VolatileRefExample2.java
│ │ ├── example
│ │ ├── README.md
│ │ ├── alternate
│ │ │ └── TestABCAlternateForLock.java
│ │ ├── future
│ │ │ ├── Data.java
│ │ │ ├── FutureClient.java
│ │ │ ├── FutureData.java
│ │ │ ├── Main.java
│ │ │ ├── README.md
│ │ │ └── RealData.java
│ │ └── productconsumer
│ │ │ ├── blockqueue
│ │ │ └── ProdConsumer_BlockQueueDemo.java
│ │ │ ├── lockcondition
│ │ │ └── TestProductAndConsumerForLock.java
│ │ │ └── waitnotify
│ │ │ ├── TestProductAndConsumer.java
│ │ │ └── TestProductAndConsumer2.java
│ │ ├── juc
│ │ ├── README.md
│ │ ├── aqs
│ │ │ ├── AQSDemo.java
│ │ │ ├── README.md
│ │ │ ├── ThreadNoSafe.java
│ │ │ ├── ThreadSafe.java
│ │ │ ├── mylock1
│ │ │ │ ├── MLock.java
│ │ │ │ └── Main.java
│ │ │ └── mylock2
│ │ │ │ ├── MLock.java
│ │ │ │ └── Main.java
│ │ ├── blockingqueue
│ │ │ ├── ArrayBlockingQueueDemo.java
│ │ │ ├── DelayQueueDemo.java
│ │ │ ├── PriorityBlockingQueueDemo.java
│ │ │ └── SynchronousQueueDemo.java
│ │ ├── cas
│ │ │ ├── ABADemo.java
│ │ │ ├── AtomicIntegerTest.java
│ │ │ └── CASDemo.java
│ │ ├── completefuture
│ │ │ ├── CFutureMain1.java
│ │ │ ├── CFutureMain2.java
│ │ │ ├── CFutureMain3.java
│ │ │ ├── CFutureMain4.java
│ │ │ ├── CFutureMain5.java
│ │ │ ├── CFutureMain6.java
│ │ │ └── README.md
│ │ ├── executor
│ │ │ ├── ForkJoinPoolTest.java
│ │ │ ├── README.md
│ │ │ ├── RejectedExecutionHandlerTest.java
│ │ │ ├── ScheduledExecutorTest.java
│ │ │ ├── ThreadPoolExceptionTest.java
│ │ │ ├── ThreadPoolIdTest.java
│ │ │ └── trace
│ │ │ │ ├── CatchException.java
│ │ │ │ ├── DivTask.java
│ │ │ │ ├── README.md
│ │ │ │ ├── TraceMain.java
│ │ │ │ └── TraceThreadPoolExecutor.java
│ │ ├── future
│ │ │ ├── FutureTest.java
│ │ │ └── Task.java
│ │ ├── lock
│ │ │ ├── ReentrantLockDemo.java
│ │ │ ├── ReentrantLockInterruptedDemo.java
│ │ │ ├── SpinLockDemo.java
│ │ │ ├── TestLock.java
│ │ │ ├── TestManyReadOneWriteCollection.java
│ │ │ └── TestReadWriteLock.java
│ │ ├── locksupport
│ │ │ ├── LockSupportDemo.java
│ │ │ └── README.md
│ │ └── tools
│ │ │ ├── ExchangerDemo.java
│ │ │ ├── README.md
│ │ │ ├── TestCountDownLatch.java
│ │ │ ├── TestCountDownLatch2.java
│ │ │ ├── TestCyclicBarrier.java
│ │ │ ├── TestCyclicBarrier2.java
│ │ │ └── TestSemaphore.java
│ │ └── unsafe
│ │ ├── README.md
│ │ ├── UnSafeCreateTest.java
│ │ ├── UnSafeMemoryTest.java
│ │ ├── UnSafeOpArrayTest.java
│ │ ├── UnSafeParkTest.java
│ │ └── UnsafeCasTest.java
├── design-pattern
│ ├── README.md
│ ├── notes
│ │ ├── 创建型模式——单例模式(四).md
│ │ ├── 创建型模式——原型模式(五).md
│ │ ├── 创建型模式——工厂方法(一).md
│ │ ├── 创建型模式——建造者模式(三).md
│ │ ├── 创建型模式——抽象工厂(二).md
│ │ ├── 创建型模式——简单工厂(不在GOF23种设计模式中).md
│ │ ├── 结构型模式——享元模式.md
│ │ ├── 结构型模式——代理模式(七).md
│ │ ├── 结构型模式——外观模式(一).md
│ │ ├── 结构型模式——桥接模式(六).md
│ │ ├── 结构型模式——组合模式(五).md
│ │ ├── 结构型模式——装饰者模式(二).md
│ │ ├── 结构型模式——适配器模式(三).md
│ │ ├── 行为型模式——中介者模式(八).md
│ │ ├── 行为型模式——命令模式(七).md
│ │ ├── 行为型模式——备忘录模式(六).md
│ │ ├── 行为型模式——模板方法(一).md
│ │ ├── 行为型模式——状态模式(十一).md
│ │ ├── 行为型模式——策略模式(三).md
│ │ ├── 行为型模式——观察者模式(五).md
│ │ ├── 行为型模式——解释器模式(四).md
│ │ ├── 行为型模式——访问者模式(十).md
│ │ ├── 行为型模式——责任链模式(九).md
│ │ └── 行为型模式——迭代器模式(二).md
│ ├── pom.xml
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── desgin
│ │ │ ├── advance
│ │ │ └── decorator_vs_proxy
│ │ │ │ ├── Boxer.java
│ │ │ │ ├── BoxerImpl.java
│ │ │ │ ├── Client.java
│ │ │ │ ├── README.md
│ │ │ │ ├── decorator
│ │ │ │ └── FastShoesDecorator.java
│ │ │ │ └── proxy
│ │ │ │ └── AgentProxy.java
│ │ │ ├── mashibing
│ │ │ ├── chainofresponsibility
│ │ │ │ ├── README.md
│ │ │ │ ├── abstractImpl
│ │ │ │ │ ├── v1
│ │ │ │ │ │ ├── Client.java
│ │ │ │ │ │ └── Handler.java
│ │ │ │ │ ├── v2
│ │ │ │ │ │ ├── Chain.java
│ │ │ │ │ │ ├── ChainClient.java
│ │ │ │ │ │ └── ChainHandler.java
│ │ │ │ │ └── v3
│ │ │ │ │ │ ├── Chain.java
│ │ │ │ │ │ ├── ChainClient.java
│ │ │ │ │ │ └── ChainHandler.java
│ │ │ │ └── interfaceImpl
│ │ │ │ │ ├── v1
│ │ │ │ │ ├── Main.java
│ │ │ │ │ └── MsgProcessor.java
│ │ │ │ │ ├── v2
│ │ │ │ │ ├── FaceFilter.java
│ │ │ │ │ ├── Filter.java
│ │ │ │ │ ├── HTMLFilter.java
│ │ │ │ │ ├── Main.java
│ │ │ │ │ ├── MsgProcessor.java
│ │ │ │ │ └── SesitiveFilter.java
│ │ │ │ │ ├── v3
│ │ │ │ │ ├── FaceFilter.java
│ │ │ │ │ ├── Filter.java
│ │ │ │ │ ├── FilterChain.java
│ │ │ │ │ ├── HTMLFilter.java
│ │ │ │ │ ├── Main.java
│ │ │ │ │ └── SesitiveFilter.java
│ │ │ │ │ ├── v4
│ │ │ │ │ ├── FaceFilter.java
│ │ │ │ │ ├── Filter.java
│ │ │ │ │ ├── FilterChain.java
│ │ │ │ │ ├── HTMLFilter.java
│ │ │ │ │ ├── Main.java
│ │ │ │ │ ├── Request.java
│ │ │ │ │ ├── Response.java
│ │ │ │ │ └── SesitiveFilter.java
│ │ │ │ │ └── v5
│ │ │ │ │ ├── AbstractFilter.java
│ │ │ │ │ ├── FaceFilter.java
│ │ │ │ │ ├── Filter.java
│ │ │ │ │ ├── FilterChain.java
│ │ │ │ │ ├── HTMLFilter.java
│ │ │ │ │ ├── Main.java
│ │ │ │ │ ├── Request.java
│ │ │ │ │ ├── Response.java
│ │ │ │ │ └── SesitiveFilter.java
│ │ │ ├── command
│ │ │ │ ├── Boy.java
│ │ │ │ ├── Command.java
│ │ │ │ ├── HugCommand.java
│ │ │ │ ├── MM.java
│ │ │ │ └── ShoppingCommand.java
│ │ │ ├── iterator
│ │ │ │ ├── ArrayList.java
│ │ │ │ ├── Cat.java
│ │ │ │ ├── Collection.java
│ │ │ │ ├── Iterator.java
│ │ │ │ ├── LinkedList.java
│ │ │ │ ├── Node.java
│ │ │ │ ├── Test.java
│ │ │ │ └── generic
│ │ │ │ │ └── GenericArrayList.java
│ │ │ └── strategy
│ │ │ │ ├── Cat.java
│ │ │ │ ├── CatHeightComparator.java
│ │ │ │ ├── CatWeightComparator.java
│ │ │ │ ├── Comparable.java
│ │ │ │ ├── Comparator.java
│ │ │ │ ├── DataSorter.java
│ │ │ │ ├── Dog.java
│ │ │ │ └── Test.java
│ │ │ ├── pattern
│ │ │ ├── behavioral
│ │ │ │ ├── chainofresponsibility
│ │ │ │ │ └── README.md
│ │ │ │ ├── command
│ │ │ │ │ ├── CloseCourseVideoCommand.java
│ │ │ │ │ ├── Command.java
│ │ │ │ │ ├── CourseVideo.java
│ │ │ │ │ ├── OpenCourseVideoCommand.java
│ │ │ │ │ ├── Staff.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── interpreter
│ │ │ │ │ ├── Calculator.java
│ │ │ │ │ ├── Client.java
│ │ │ │ │ ├── DivNode.java
│ │ │ │ │ ├── ModNode.java
│ │ │ │ │ ├── MulNode.java
│ │ │ │ │ ├── Node.java
│ │ │ │ │ ├── SymbolNode.java
│ │ │ │ │ ├── ValueNode.java
│ │ │ │ │ └── springel
│ │ │ │ │ │ └── SpringTest.java
│ │ │ │ ├── iterator
│ │ │ │ │ ├── Course.java
│ │ │ │ │ ├── CourseAggregate.java
│ │ │ │ │ ├── CourseAggregateImpl.java
│ │ │ │ │ ├── CourseIterator.java
│ │ │ │ │ ├── CourseIteratorImpl.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── mediator
│ │ │ │ │ ├── StudyGroup.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ ├── User.java
│ │ │ │ │ └── my
│ │ │ │ │ │ ├── Client.java
│ │ │ │ │ │ ├── HouseOwner.java
│ │ │ │ │ │ ├── Mediator.java
│ │ │ │ │ │ ├── MediatorStructure.java
│ │ │ │ │ │ ├── Person.java
│ │ │ │ │ │ └── Tenant.java
│ │ │ │ ├── memento
│ │ │ │ │ ├── Article.java
│ │ │ │ │ ├── ArticleMemento.java
│ │ │ │ │ ├── ArticleMementoManager.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ └── my
│ │ │ │ │ │ ├── Caretaker.java
│ │ │ │ │ │ ├── Client.java
│ │ │ │ │ │ ├── Memento.java
│ │ │ │ │ │ └── Role.java
│ │ │ │ ├── observer
│ │ │ │ │ ├── Course.java
│ │ │ │ │ ├── Question.java
│ │ │ │ │ ├── Teacher.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ ├── guavatest
│ │ │ │ │ │ ├── GuavaEvent.java
│ │ │ │ │ │ └── GuavaEventTest.java
│ │ │ │ │ └── my
│ │ │ │ │ │ ├── Observer.java
│ │ │ │ │ │ ├── Observerable.java
│ │ │ │ │ │ ├── Test.java
│ │ │ │ │ │ ├── User.java
│ │ │ │ │ │ └── WechatServer.java
│ │ │ │ ├── state
│ │ │ │ │ ├── CourseVideoContext.java
│ │ │ │ │ ├── CourseVideoState.java
│ │ │ │ │ ├── PauseState.java
│ │ │ │ │ ├── PlayState.java
│ │ │ │ │ ├── SpeedState.java
│ │ │ │ │ ├── StopState.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── strategy
│ │ │ │ │ ├── EmptyPromotionStrategy.java
│ │ │ │ │ ├── FanXianPromotionStrategy.java
│ │ │ │ │ ├── LiJianPromotionStrategy.java
│ │ │ │ │ ├── ManJianPromotionStrategy.java
│ │ │ │ │ ├── PromotionActivity.java
│ │ │ │ │ ├── PromotionStrategy.java
│ │ │ │ │ ├── PromotionStrategyFactory.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── templatemethod
│ │ │ │ │ ├── ACourse.java
│ │ │ │ │ ├── DesignPatternCourse.java
│ │ │ │ │ ├── FECourse.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ └── my
│ │ │ │ │ │ ├── Abstract.java
│ │ │ │ │ │ ├── ConcreteClass_BaoCai.java
│ │ │ │ │ │ ├── ConcreteClass_CaiXin.java
│ │ │ │ │ │ └── Test.java
│ │ │ │ └── visitor
│ │ │ │ │ ├── CodingCourse.java
│ │ │ │ │ ├── Course.java
│ │ │ │ │ ├── FreeCourse.java
│ │ │ │ │ ├── IVisitor.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ └── Visitor.java
│ │ │ ├── creational
│ │ │ │ ├── abstractfactory
│ │ │ │ │ ├── Article.java
│ │ │ │ │ ├── CourseFactory.java
│ │ │ │ │ ├── JavaArticle.java
│ │ │ │ │ ├── JavaCourseFactory.java
│ │ │ │ │ ├── JavaVideo.java
│ │ │ │ │ ├── PythonArticle.java
│ │ │ │ │ ├── PythonCourseFactory.java
│ │ │ │ │ ├── PythonVideo.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ └── Video.java
│ │ │ │ ├── builder
│ │ │ │ │ ├── Coach.java
│ │ │ │ │ ├── Course.java
│ │ │ │ │ ├── CourseActualBuilder.java
│ │ │ │ │ ├── CourseBuilder.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ └── V2
│ │ │ │ │ │ ├── Course.java
│ │ │ │ │ │ └── Test.java
│ │ │ │ ├── factorymethod
│ │ │ │ │ ├── FEVideo.java
│ │ │ │ │ ├── FEVideoFactory.java
│ │ │ │ │ ├── JavaVideo.java
│ │ │ │ │ ├── JavaVideoFactory.java
│ │ │ │ │ ├── PythonVideo.java
│ │ │ │ │ ├── PythonVideoFactory.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ ├── Video.java
│ │ │ │ │ └── VideoFactory.java
│ │ │ │ ├── prototype
│ │ │ │ │ ├── abstractprototype
│ │ │ │ │ │ ├── A.java
│ │ │ │ │ │ └── B.java
│ │ │ │ │ └── my
│ │ │ │ │ │ ├── Resume.java
│ │ │ │ │ │ └── Test.java
│ │ │ │ ├── simplefactory
│ │ │ │ │ ├── JavaVideo.java
│ │ │ │ │ ├── PythonVideo.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ ├── Video.java
│ │ │ │ │ └── VideoFactory.java
│ │ │ │ └── singleton
│ │ │ │ │ ├── CASSingleton.java
│ │ │ │ │ ├── CASSingletonTest.java
│ │ │ │ │ ├── ContainerSingleton.java
│ │ │ │ │ ├── EnumInstance.java
│ │ │ │ │ ├── HungrySingleton.java
│ │ │ │ │ ├── LazyDoubleCheckSingleton.java
│ │ │ │ │ ├── LazySingleton.java
│ │ │ │ │ ├── StaticInnerClassSingleton.java
│ │ │ │ │ ├── T.java
│ │ │ │ │ ├── Test.java
│ │ │ │ │ ├── Test1.java
│ │ │ │ │ ├── ThreadLocalInstance.java
│ │ │ │ │ ├── ThreadTest.java
│ │ │ │ │ └── my
│ │ │ │ │ ├── Singleton1.java
│ │ │ │ │ ├── Singleton2.java
│ │ │ │ │ ├── Singleton3.java
│ │ │ │ │ ├── Singleton4.java
│ │ │ │ │ └── Singleton5.java
│ │ │ └── structural
│ │ │ │ ├── adapter
│ │ │ │ ├── classadapter
│ │ │ │ │ ├── Adaptee.java
│ │ │ │ │ ├── Adapter.java
│ │ │ │ │ ├── ConcreteTarget.java
│ │ │ │ │ ├── Target.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── exmaple
│ │ │ │ │ ├── AC220.java
│ │ │ │ │ ├── DC5.java
│ │ │ │ │ ├── PowerAdapter.java
│ │ │ │ │ └── Test.java
│ │ │ │ └── objectadapter
│ │ │ │ │ ├── Adaptee.java
│ │ │ │ │ ├── Adapter.java
│ │ │ │ │ ├── ConcreteTarget.java
│ │ │ │ │ ├── Target.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── bridge
│ │ │ │ ├── ABCBank.java
│ │ │ │ ├── Account.java
│ │ │ │ ├── Bank.java
│ │ │ │ ├── DepositAccount.java
│ │ │ │ ├── ICBCBank.java
│ │ │ │ ├── SavingAccount.java
│ │ │ │ └── Test.java
│ │ │ │ ├── composite
│ │ │ │ ├── CatalogComponent.java
│ │ │ │ ├── Course.java
│ │ │ │ ├── CourseCatalog.java
│ │ │ │ └── Test.java
│ │ │ │ ├── decorator
│ │ │ │ ├── IODecorator.java
│ │ │ │ ├── v1
│ │ │ │ │ ├── Battercake.java
│ │ │ │ │ ├── BattercakeWithEgg.java
│ │ │ │ │ ├── BattercakeWithEggSausage.java
│ │ │ │ │ └── Test.java
│ │ │ │ └── v2
│ │ │ │ │ ├── ABattercake.java
│ │ │ │ │ ├── AbstractDecorator.java
│ │ │ │ │ ├── Battercake.java
│ │ │ │ │ ├── EggDecorator.java
│ │ │ │ │ ├── SausageDecorator.java
│ │ │ │ │ └── Test.java
│ │ │ │ ├── facade
│ │ │ │ ├── GiftExchangeService.java
│ │ │ │ ├── PointsGift.java
│ │ │ │ ├── PointsPaymentService.java
│ │ │ │ ├── QualifyService.java
│ │ │ │ ├── ShippingService.java
│ │ │ │ └── Test.java
│ │ │ │ ├── flyweight
│ │ │ │ ├── Employee.java
│ │ │ │ ├── EmployeeFactory.java
│ │ │ │ ├── Manager.java
│ │ │ │ ├── Test.java
│ │ │ │ └── application
│ │ │ │ │ └── IntegerDemo.java
│ │ │ │ └── proxy
│ │ │ │ └── README.md
│ │ │ └── principle
│ │ │ ├── demeter
│ │ │ ├── Boss.java
│ │ │ ├── Course.java
│ │ │ ├── TeamLeader.java
│ │ │ └── Test.java
│ │ │ ├── dependencyInversion
│ │ │ ├── v1
│ │ │ │ ├── Bottom.java
│ │ │ │ ├── Car.java
│ │ │ │ ├── Client.java
│ │ │ │ ├── Framework.java
│ │ │ │ └── Tire.java
│ │ │ └── v2
│ │ │ │ ├── Bottom.java
│ │ │ │ ├── Car.java
│ │ │ │ ├── Client.java
│ │ │ │ ├── Framework.java
│ │ │ │ └── Tire.java
│ │ │ ├── interfacesegregation
│ │ │ ├── Bird.java
│ │ │ ├── Dog.java
│ │ │ ├── IAnimalAction.java
│ │ │ ├── IEatAnimalAction.java
│ │ │ ├── IFlyAnimalAction.java
│ │ │ └── ISwimAnimalAction.java
│ │ │ ├── openclose
│ │ │ ├── ICourse.java
│ │ │ ├── JavaCourse.java
│ │ │ ├── JavaDiscountCourse.java
│ │ │ └── Test.java
│ │ │ └── singleresponsibility
│ │ │ ├── Bird.java
│ │ │ ├── CourseImpl.java
│ │ │ ├── FlyBird.java
│ │ │ ├── ICourse.java
│ │ │ ├── ICourseContent.java
│ │ │ ├── ICourseManager.java
│ │ │ ├── Test.java
│ │ │ └── WalkBird.java
│ └── uml
│ │ └── 设计模式.mdj
├── feature-jdk5
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ ├── AutoBox.java
│ │ │ ├── StaticImport.java
│ │ │ ├── VariableParameter.java
│ │ │ ├── annotation
│ │ │ ├── AnnotationTest.java
│ │ │ ├── JsonProperty.java
│ │ │ ├── MyAnnotation.java
│ │ │ ├── StudentRsp.java
│ │ │ └── UseAnnotation.java
│ │ │ ├── enums
│ │ │ ├── EnumTest.java
│ │ │ ├── WeekDay.java
│ │ │ └── WeekDay1.java
│ │ │ ├── equals
│ │ │ ├── EqualsWithExtends.java
│ │ │ └── HashCode.java
│ │ │ ├── exception
│ │ │ └── ErrorAndException.java
│ │ │ ├── generic
│ │ │ ├── Generic1.java
│ │ │ ├── Generic2.java
│ │ │ ├── Generic3.java
│ │ │ └── Generic4
│ │ │ │ ├── BaseDao.java
│ │ │ │ ├── BaseDaoImpl.java
│ │ │ │ ├── Client.java
│ │ │ │ ├── Person.java
│ │ │ │ ├── PersonDao.java
│ │ │ │ └── PersonDaoImpl.java
│ │ │ ├── introspection
│ │ │ ├── IntrospectorTest.java
│ │ │ └── Point.java
│ │ │ ├── io
│ │ │ ├── io
│ │ │ │ ├── PropertiesDemo.java
│ │ │ │ ├── StringCodingDemo.java
│ │ │ │ ├── bytestream
│ │ │ │ │ ├── BufferedInputStreamDemo.java
│ │ │ │ │ ├── BufferedOutputStreamDemo.java
│ │ │ │ │ ├── FileInputStreamDemo.java
│ │ │ │ │ ├── FileOutputStreamDemo.java
│ │ │ │ │ └── IOByteStreamCopyFile.java
│ │ │ │ ├── charstream
│ │ │ │ │ ├── BufferedReaderDemo.java
│ │ │ │ │ ├── BufferedWriterDemo.java
│ │ │ │ │ ├── IOCharBufferStreamCopyFile.java
│ │ │ │ │ ├── IOCharStreamCopyFile.java
│ │ │ │ │ ├── InputStreamReaderDemo.java
│ │ │ │ │ ├── OutputStreamWriterDemo.java
│ │ │ │ │ └── other
│ │ │ │ │ │ └── LineNumberReaderDemo.java
│ │ │ │ ├── file
│ │ │ │ │ └── FileDemo.java
│ │ │ │ └── otherstream
│ │ │ │ │ ├── ByteArrayStreamDemo.java
│ │ │ │ │ ├── DataStreamDemo.java
│ │ │ │ │ ├── ObjectStreamDemo.java
│ │ │ │ │ ├── Person.java
│ │ │ │ │ ├── PrintWriterDemo.java
│ │ │ │ │ ├── RandomAccessFileDemo.java
│ │ │ │ │ ├── SequenceInputStreamDemo.java
│ │ │ │ │ ├── SystemInDemo.java
│ │ │ │ │ └── SystemOutDemo.java
│ │ │ ├── nio
│ │ │ │ ├── README.md
│ │ │ │ ├── TestBlockingNIO.java
│ │ │ │ ├── TestBuffer.java
│ │ │ │ ├── TestChannel.java
│ │ │ │ ├── TestNIO.java
│ │ │ │ ├── TestNIOPathFiles.java
│ │ │ │ ├── TestNIO_UDP.java
│ │ │ │ ├── TestPipe.java
│ │ │ │ ├── v1
│ │ │ │ │ ├── BIOServer.java
│ │ │ │ │ └── Client.java
│ │ │ │ ├── v2
│ │ │ │ │ ├── MockNIOServer.java
│ │ │ │ │ └── MyNIOServer.java
│ │ │ │ └── v3
│ │ │ │ │ ├── NIOClient.java
│ │ │ │ │ └── NIOServer.java
│ │ │ └── socket
│ │ │ │ ├── TCPClient.java
│ │ │ │ ├── TCPServer.java
│ │ │ │ ├── UDPClient.java
│ │ │ │ └── UDPServer.java
│ │ │ ├── reflect
│ │ │ ├── ReflectExecutMain.java
│ │ │ ├── ReflectForClass.java
│ │ │ ├── ReflectForConstructor.java
│ │ │ ├── ReflectForField.java
│ │ │ ├── ReflectForMethod.java
│ │ │ ├── ReflectPoint.java
│ │ │ ├── ReflectToArray.java
│ │ │ ├── ReflectUpdateField.java
│ │ │ ├── ReflectUtils.java
│ │ │ └── pojo
│ │ │ │ └── MyObject.java
│ │ │ └── serializable
│ │ │ ├── Test.java
│ │ │ ├── Test2.java
│ │ │ └── Test3.java
│ │ └── resources
│ │ ├── ExtClassloaderJar.jar
│ │ └── config.properties
├── feature-jdk8
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── annotation
│ │ ├── MyAnnotation.java
│ │ ├── MyAnnotations.java
│ │ └── TestAnnotation.java
│ │ ├── date
│ │ ├── LocalDateTest.java
│ │ ├── TestLocalDateTime.java
│ │ └── TestLocalDateTime2.java
│ │ ├── interfa
│ │ └── MyInterface.java
│ │ ├── lambda
│ │ ├── Employee.java
│ │ ├── MyFun.java
│ │ ├── TestLambda.java
│ │ ├── TestLambda2.java
│ │ ├── TestLambda3.java
│ │ ├── TestMethodRef.java
│ │ ├── example
│ │ │ ├── MyFun2.java
│ │ │ ├── MyFun3.java
│ │ │ └── TestLambda.java
│ │ └── strategy
│ │ │ ├── EmployeeAgeFilter.java
│ │ │ ├── EmployeeSalaryFilter.java
│ │ │ └── Filter.java
│ │ ├── optional
│ │ ├── Godness.java
│ │ ├── Man.java
│ │ ├── NewMan.java
│ │ └── TestOptional.java
│ │ ├── stream
│ │ ├── CollectorsTest.java
│ │ ├── Employee.java
│ │ ├── Status.java
│ │ ├── StreamMapFlatMapDemo.java
│ │ ├── TestStreamAPI.java
│ │ ├── TestStreamAPI2.java
│ │ ├── TestStreamAPI3.java
│ │ ├── example
│ │ │ ├── TestStreamAPI.java
│ │ │ ├── TestTransaction.java
│ │ │ ├── Trader.java
│ │ │ └── Transaction.java
│ │ └── parallel
│ │ │ ├── ForkJoinCalculate.java
│ │ │ └── TestForkJoin.java
│ │ └── 参考.txt
├── interview
│ ├── README.MD
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── interview
│ │ │ ├── AccessModifier
│ │ │ ├── A1.java
│ │ │ ├── A2.java
│ │ │ ├── defaulttest
│ │ │ │ ├── A.java
│ │ │ │ └── B.java
│ │ │ ├── privatetest
│ │ │ │ ├── A.java
│ │ │ │ └── B.java
│ │ │ ├── protectedtest
│ │ │ │ ├── A.java
│ │ │ │ └── B.java
│ │ │ └── publictest
│ │ │ │ ├── A.java
│ │ │ │ └── B.java
│ │ │ ├── ComparableAndComparator
│ │ │ └── CompareComparatorAndComparableTest.java
│ │ │ ├── EqualsAndhashCode
│ │ │ ├── ConflictHashCodeTest1.java
│ │ │ ├── ConflictHashCodeTest2.java
│ │ │ ├── EqualsTest1.java
│ │ │ ├── EqualsTest2.java
│ │ │ ├── EqualsTest3.java
│ │ │ └── NormalHashCodeTest.java
│ │ │ ├── Exception
│ │ │ ├── FinallyReturnTest.java
│ │ │ ├── FinallyTest.java
│ │ │ ├── ThrowsAndThrowTest.java
│ │ │ ├── TryCatchTest.java
│ │ │ └── TryTest.java
│ │ │ ├── InnerClass
│ │ │ ├── Static
│ │ │ │ ├── OuterClass.java
│ │ │ │ └── Outter.java
│ │ │ ├── anonymous
│ │ │ │ ├── FinalTest.java
│ │ │ │ ├── InnerClass.java
│ │ │ │ ├── OuterClass.java
│ │ │ │ └── OuterClassExample.java
│ │ │ ├── local
│ │ │ │ ├── OuterClass.java
│ │ │ │ └── Outter.java
│ │ │ └── member
│ │ │ │ ├── OuterClass.java
│ │ │ │ └── Outter.java
│ │ │ ├── IterableAndIterator
│ │ │ ├── IterableAndIterator.java
│ │ │ └── ResizingArrayStack.java
│ │ │ ├── Operator
│ │ │ ├── Division.java
│ │ │ ├── LogicalBitOperation.java
│ │ │ ├── LogicalOperator.java
│ │ │ └── ShiftOperator.java
│ │ │ ├── OverloadVsOverride
│ │ │ ├── OverLoadClass.java
│ │ │ ├── SubClass.java
│ │ │ └── SuperClass.java
│ │ │ ├── SwapTwoInteger
│ │ │ ├── Swap1.java
│ │ │ └── Swap2.java
│ │ │ ├── Thread
│ │ │ ├── CycleWait.java
│ │ │ ├── FutureTaskDemo.java
│ │ │ ├── InterruptDemo.java
│ │ │ ├── MyCallable.java
│ │ │ ├── MyRunnable.java
│ │ │ ├── MyThread.java
│ │ │ ├── SyncBlockAndMethod.java
│ │ │ ├── SynchronizeDemo.java
│ │ │ ├── ThreadPoolDemo.java
│ │ │ ├── ThreadTest.java
│ │ │ ├── VolatileDemo.java
│ │ │ ├── WaitSleepDemo.java
│ │ │ ├── WaitSleepDemo1.java
│ │ │ └── YieldDemo.java
│ │ │ └── ValueAndaddress
│ │ │ ├── Example1.java
│ │ │ ├── Example2.java
│ │ │ ├── Example3.java
│ │ │ └── Example4.java
│ │ └── resources
│ │ └── project-parent.zip
├── jvm
│ ├── README.md
│ ├── jdk7-setting
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ └── methodarea
│ │ │ └── OOMTest.java
│ ├── pom.xml
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── jvm
│ │ │ │ ├── classloader
│ │ │ │ ├── ClassLifeCycle.java
│ │ │ │ ├── ClassLoaderPrintTest.java
│ │ │ │ ├── ClassLoaderUnique.java
│ │ │ │ ├── DemoObj.java
│ │ │ │ ├── READMD.md
│ │ │ │ ├── hotdeploy
│ │ │ │ │ ├── ClassLoaderHotDeploy.java
│ │ │ │ │ └── HotCodeTest.java
│ │ │ │ └── loadorder
│ │ │ │ │ ├── LoadOrderTest.java
│ │ │ │ │ └── MyClassLoaderTest.java
│ │ │ │ ├── classloading
│ │ │ │ ├── InterfaceInit.java
│ │ │ │ ├── StaticCodeTest.java
│ │ │ │ ├── initiative
│ │ │ │ │ ├── Initialization1.java
│ │ │ │ │ ├── Initialization2.java
│ │ │ │ │ ├── Initialization3.java
│ │ │ │ │ ├── Initialization4.java
│ │ │ │ │ ├── Initialization5.java
│ │ │ │ │ ├── MethodHandleClass.java
│ │ │ │ │ ├── SubClass.java
│ │ │ │ │ └── SuperClass.java
│ │ │ │ └── passive
│ │ │ │ │ ├── ConstClass.java
│ │ │ │ │ ├── Interface.java
│ │ │ │ │ ├── NotInitialization1.java
│ │ │ │ │ ├── NotInitialization2.java
│ │ │ │ │ └── NotInitialization3.java
│ │ │ │ ├── gc
│ │ │ │ ├── InitiativeGC.java
│ │ │ │ ├── finalize
│ │ │ │ │ ├── Finalization.java
│ │ │ │ │ └── Finalization2.java
│ │ │ │ ├── gcroots
│ │ │ │ │ └── ReferenceCountingGC.java
│ │ │ │ └── reference
│ │ │ │ │ ├── PhantomReferenceDemo.java
│ │ │ │ │ ├── ReferenceQueueDemo.java
│ │ │ │ │ ├── ReferenceQueueTest.java
│ │ │ │ │ ├── SoftReferenceDemo.java
│ │ │ │ │ ├── StrongReferenceDemo.java
│ │ │ │ │ ├── ThreadLocalMemoryLeak.java
│ │ │ │ │ ├── WeakHashMapDemo.java
│ │ │ │ │ └── WeakReferenceDemo.java
│ │ │ │ ├── memorystruct
│ │ │ │ ├── ByteCodeSample.java
│ │ │ │ ├── DirectMemoryOOM.java
│ │ │ │ ├── HeapOOM.java
│ │ │ │ ├── HelloWorld.java
│ │ │ │ ├── Increment.class
│ │ │ │ ├── Increment.java
│ │ │ │ ├── Intern.java
│ │ │ │ ├── Intern2.java
│ │ │ │ ├── InternDifference.java
│ │ │ │ ├── MethodAreaOOM.java
│ │ │ │ ├── PermGenOOM.java
│ │ │ │ ├── StackSOF.java
│ │ │ │ ├── TestStr.java
│ │ │ │ ├── TestStr2.class
│ │ │ │ └── TestStr2.java
│ │ │ │ ├── ms
│ │ │ │ ├── Math.java
│ │ │ │ └── User.java
│ │ │ │ └── tmp2
│ │ │ │ └── command
│ │ │ │ └── jstack
│ │ │ │ └── AllStackTrace.java
│ │ │ └── java
│ │ │ └── lang
│ │ │ └── String.java
│ └── words.txt
├── learn-source-jdk7
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── learn7
│ │ └── util
│ │ └── collection
│ │ ├── HashMap7MultiThread.java
│ │ └── HashMap7Test.java
└── learn-source-jdk8
│ ├── READMD.md
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── cn
│ └── lastwhisper
│ └── learn8
│ ├── common
│ └── ReflectUtils.java
│ ├── lang
│ ├── LongTest.java
│ ├── StringTest.java
│ └── thread
│ │ └── ThreadTest.java
│ └── util
│ ├── ArraysTest.java
│ ├── CollectionsTest.java
│ ├── ObjectsTest.java
│ ├── collection
│ ├── ArrayListTest.java
│ ├── HashMap8MultiThread.java
│ ├── HashMap8Test.java
│ ├── LinkedHashMapTest.java
│ ├── LinkedListTest.java
│ └── TreeMapTest.java
│ └── concurrent
│ ├── collection
│ ├── ConcurrentHashMapTest.java
│ └── CopyOnWriteArrayListTest.java
│ ├── executor
│ └── FutureTest.java
│ └── queue
│ ├── ArrayBlockingQueueDemo.java
│ ├── DelayQueueTest.java
│ ├── LinkedBlockingQueueTest.java
│ ├── SynchronousQueueTest.java
│ └── my
│ ├── LinkedBlockingQueue.java
│ ├── Queue.java
│ └── QueueTest.java
├── lesson-code
├── design
│ └── fsm
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── ApplicationDemo.java
│ │ ├── MarioStateMachine.java
│ │ ├── State.java
│ │ ├── state
│ │ ├── v1
│ │ │ ├── ApplicationDemo.java
│ │ │ ├── CapeMario.java
│ │ │ ├── FireMario.java
│ │ │ ├── IMario.java
│ │ │ ├── MarioStateMachine.java
│ │ │ ├── SmallMario.java
│ │ │ ├── State.java
│ │ │ └── SuperMario.java
│ │ └── v2
│ │ │ ├── ApplicationDemo.java
│ │ │ ├── CapeMario.java
│ │ │ ├── FireMario.java
│ │ │ ├── IMario.java
│ │ │ ├── MarioStateMachine.java
│ │ │ ├── SmallMario.java
│ │ │ ├── State.java
│ │ │ └── SuperMario.java
│ │ ├── switchcase
│ │ ├── ApplicationDemo.java
│ │ ├── MarioStateMachine.java
│ │ └── State.java
│ │ └── table
│ │ ├── ApplicationDemo.java
│ │ ├── Event.java
│ │ ├── MarioStateMachine.java
│ │ └── State.java
└── java-common-mistakes
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ └── cn
│ │ └── cunchang
│ │ ├── TestSomething.java
│ │ ├── repeatcode
│ │ ├── Cart.java
│ │ ├── Db.java
│ │ ├── Item.java
│ │ ├── NormalUserCart.java
│ │ └── wrong
│ │ │ ├── InternalUserCart.java
│ │ │ ├── NormalUserCart.java
│ │ │ └── VipUserCart.java
│ │ └── threadpool
│ │ ├── ExtremeThreadPoolExecutor.java
│ │ ├── README.md
│ │ ├── ThreadPoolExpansiveTest.java
│ │ └── ThreadPoolOOMTest.java
│ └── resources
│ └── logback.xml
├── log
├── jcl
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ └── JCLTest.java
│ │ └── resources
│ │ └── log4j.properties
├── jul
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── JULTest.java
│ │ │ └── log
│ │ │ └── MyJULLogFilter.java
│ │ └── resources
│ │ └── jul.properties
├── log4j
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ └── Log4jTest.java
│ │ └── resources
│ │ ├── log.sql
│ │ ├── log4j
│ │ └── log4j.properties
│ │ ├── log4j_FileAppender配置.properties
│ │ ├── log4j_JDBCAppender配置.properties
│ │ ├── log4j_Layout配置.properties
│ │ ├── log4j_组件和配置文件.properties
│ │ └── log4j_自定义Logger.properties
├── log4j2
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── Log4j2Test.java
│ │ │ └── Slf4jTest.java
│ │ └── resources
│ │ ├── AsyncAppender
│ │ └── log4j2.xml
│ │ ├── AsyncLogger全局
│ │ ├── log4j2.component.properties
│ │ └── log4j2.xml
│ │ ├── AsyncLogger混合
│ │ └── log4j2.xml
│ │ └── log4j2.xml
├── logback
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── LogbackTest.java
│ │ │ └── logback.xml
│ │ └── resources
│ │ ├── logback_FileAppender配置.xml
│ │ ├── logback_HtmlAppender配置.xml
│ │ ├── logback_RollingFileAppender配置.xml
│ │ ├── logback_异步配置.xml
│ │ ├── logback_自定义logger.xml
│ │ └── logback_配置文件.xml
├── slf4j
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── Log4jTest.java
│ │ │ └── Slf4jTest.java
│ │ └── resources
│ │ └── log4j.properties
├── springboot-log
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ └── SpringbootLogApplication.java
│ │ └── resources
│ │ │ ├── application.properties
│ │ │ ├── logback-spring.xml
│ │ │ └── logconfig
│ │ │ ├── application.properties
│ │ │ ├── log4j2.xml
│ │ │ └── logback.xml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ └── SpringbootLogApplicationTests.java
├── 日志技术 (上).pdf
└── 日志技术 (下).pdf
├── mvc
├── README.MD
├── pom.xml
├── servlet
│ ├── .classpath
│ ├── .project
│ ├── .settings
│ │ ├── .jsdtscope
│ │ ├── org.eclipse.core.resources.prefs
│ │ ├── org.eclipse.jdt.core.prefs
│ │ ├── org.eclipse.wst.common.component
│ │ ├── org.eclipse.wst.common.project.facet.core.xml
│ │ ├── org.eclipse.wst.jsdt.ui.superType.container
│ │ └── org.eclipse.wst.jsdt.ui.superType.name
│ ├── WebContent
│ │ ├── META-INF
│ │ │ └── MANIFEST.MF
│ │ ├── index.jsp
│ │ └── note.txt
│ ├── build
│ │ └── classes
│ │ │ ├── META-INF
│ │ │ └── services
│ │ │ │ └── javax.servlet.ServletContainerInitializer
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ ├── service
│ │ │ ├── AbstractHelloService.class
│ │ │ ├── HelloService.class
│ │ │ ├── HelloServiceExt.class
│ │ │ └── HelloServiceImpl.class
│ │ │ └── servlet
│ │ │ ├── HelloServlet.class
│ │ │ ├── MyServletContainerInitializer.class
│ │ │ ├── UserFilter.class
│ │ │ ├── UserListener.class
│ │ │ └── UserServlet.class
│ └── src
│ │ ├── META-INF
│ │ └── services
│ │ │ └── javax.servlet.ServletContainerInitializer
│ │ └── cn
│ │ └── lastwhisper
│ │ ├── service
│ │ ├── AbstractHelloService.java
│ │ ├── HelloService.java
│ │ ├── HelloServiceExt.java
│ │ └── HelloServiceImpl.java
│ │ └── servlet
│ │ ├── HelloServlet.java
│ │ ├── MyServletContainerInitializer.java
│ │ ├── UserFilter.java
│ │ ├── UserListener.java
│ │ └── UserServlet.java
├── springmvc-annotation
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ ├── MyWebAppInitializer.java
│ │ │ ├── config
│ │ │ ├── AppConfig.java
│ │ │ └── RootConfig.java
│ │ │ ├── controller
│ │ │ ├── AsyncController.java
│ │ │ ├── HelloController.java
│ │ │ └── MyFirstInterceptor.java
│ │ │ └── service
│ │ │ ├── DeferredResultQueue.java
│ │ │ └── HelloService.java
│ │ ├── resources
│ │ ├── mvc.xml
│ │ └── note.txt
│ │ └── webapp
│ │ ├── WEB-INF
│ │ └── views
│ │ │ └── success.jsp
│ │ ├── index.jsp
│ │ └── upload_3.jpg
└── springmvc
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ └── cn
│ │ └── lastwhisper
│ │ ├── bean
│ │ └── User.java
│ │ └── controller
│ │ ├── ControllerDemo1.java
│ │ ├── ControllerDemo2.java
│ │ ├── ControllerDemo3.java
│ │ ├── ControllerDemo4.java
│ │ ├── DownLoadFileController.java
│ │ ├── ParameterController1.java
│ │ └── ParameterController2.java
│ ├── resources
│ └── springmvc.xml
│ └── webapp
│ ├── WEB-INF
│ ├── pages
│ │ ├── success.jsp
│ │ ├── success2.jsp
│ │ └── success3.jsp
│ └── web.xml
│ ├── index.jsp
│ └── js
│ └── jquery.min.js
├── notes
├── leetcode
│ ├── LeetCode 第 39 题:“组合总和”题解配图.pptx
│ ├── Leetcode.mmap
│ ├── leetcode-39.vsdx
│ ├── leetcode-46.vsdx
│ ├── leetcode-47.vsdx
│ ├── leetcode-56.vsdx
│ ├── leetcode-77.vsdx
│ └── leetcode-92.vsdx
└── orm
│ ├── jpa
│ ├── SpringDataJPA第一天讲义.doc
│ ├── SpringDataJPA第三天讲义.doc
│ ├── SpringDataJPA第二天讲义.doc
│ ├── jpa01.txt
│ ├── jpa02.txt
│ └── jpa03.txt
│ └── mybatis
│ ├── Mybatis第一天讲义.pdf
│ ├── Mybatis第三天讲义.pdf
│ ├── Mybatis第二天讲义.pdf
│ ├── Mybatis第四天讲义.pdf
│ ├── Noname1.txt
│ ├── Noname2.txt
│ ├── Noname3.txt
│ └── Noname4.txt
├── orm
├── jdbc
│ ├── README.md
│ ├── pom.xml
│ ├── sql
│ │ └── batchtable.sql
│ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── jdbc
│ │ │ ├── Main1.java
│ │ │ ├── Main2.java
│ │ │ ├── Main3.java
│ │ │ ├── Main4.java
│ │ │ └── util
│ │ │ ├── Callback.java
│ │ │ └── JdbcUtil.java
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── jdbc
│ │ └── test
│ │ └── JdbcTest.java
├── jpa
│ ├── jpa-basic
│ │ ├── pom.xml
│ │ ├── sql
│ │ │ └── rt.sql
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── jpa
│ │ │ │ │ ├── domain
│ │ │ │ │ └── Customer.java
│ │ │ │ │ └── utils
│ │ │ │ │ ├── Callback.java
│ │ │ │ │ └── JpaUtil.java
│ │ │ └── resources
│ │ │ │ └── META-INF
│ │ │ │ └── persistence.xml
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── test
│ │ │ ├── JPQLTest.java
│ │ │ └── JpaTest.java
│ ├── jpa-manytomany
│ │ ├── .mvn
│ │ │ └── wrapper
│ │ │ │ ├── MavenWrapperDownloader.java
│ │ │ │ ├── maven-wrapper.jar
│ │ │ │ └── maven-wrapper.properties
│ │ ├── pom.xml
│ │ ├── readme.md
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── jpamanytomany
│ │ │ │ │ ├── JpaManytomanyApplication.java
│ │ │ │ │ ├── dao
│ │ │ │ │ ├── RoleDao.java
│ │ │ │ │ └── UserDao.java
│ │ │ │ │ ├── domain
│ │ │ │ │ ├── SysRole.java
│ │ │ │ │ └── SysUser.java
│ │ │ │ │ └── mtm
│ │ │ │ │ ├── SysRole.java
│ │ │ │ │ └── SysUser.java
│ │ │ └── resources
│ │ │ │ └── application.properties
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── jpamanytomany
│ │ │ └── ManyToManyTest.java
│ ├── jpa-onetomany
│ │ ├── pom.xml
│ │ ├── sql
│ │ │ └── rt.sql
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cn
│ │ │ │ │ └── lastwhisper
│ │ │ │ │ └── jpaonetomany
│ │ │ │ │ ├── JpaOnetomanyApplication.java
│ │ │ │ │ ├── dao
│ │ │ │ │ ├── CustomerDao.java
│ │ │ │ │ └── LinkManDao.java
│ │ │ │ │ └── domain
│ │ │ │ │ ├── Customer.java
│ │ │ │ │ └── LinkMan.java
│ │ │ └── resources
│ │ │ │ └── application.properties
│ │ │ └── test
│ │ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── jpaonetomany
│ │ │ ├── OneToManyTest.java
│ │ │ └── SelectTest.java
│ ├── jpa.sql
│ ├── pom.xml
│ └── springdatajpa
│ │ ├── .mvn
│ │ └── wrapper
│ │ │ ├── MavenWrapperDownloader.java
│ │ │ ├── maven-wrapper.jar
│ │ │ └── maven-wrapper.properties
│ │ ├── pom.xml
│ │ ├── readme.md
│ │ ├── sql
│ │ └── rt.sql
│ │ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── springdatajpa
│ │ │ │ ├── SpringdatajpaApplication.java
│ │ │ │ ├── dao
│ │ │ │ └── CustomerDao.java
│ │ │ │ └── domain
│ │ │ │ └── Customer.java
│ │ └── resources
│ │ │ └── application.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── springdatajpa
│ │ ├── CamelCaseTest.java
│ │ ├── JPQLTest.java
│ │ ├── JpaTest.java
│ │ └── SpecTest.java
├── mongodb
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── Application.java
│ │ │ │ ├── domain
│ │ │ │ └── Comment.java
│ │ │ │ ├── repository
│ │ │ │ └── CommentRepository.java
│ │ │ │ └── service
│ │ │ │ └── CommentService.java
│ │ └── resources
│ │ │ └── application.yml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── ApplicationTests.java
│ │ └── service
│ │ └── CommentServiceTest.java
└── mybatis
│ ├── README.MD
│ ├── mybatis-action
│ ├── dirty-read
│ │ ├── README.md
│ │ ├── init.sql
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── Application.java
│ │ │ │ ├── config
│ │ │ │ ├── RdsDataSourceConfiguration.java
│ │ │ │ └── SwaggerConfig.java
│ │ │ │ ├── controller
│ │ │ │ └── UserController.java
│ │ │ │ ├── mapper
│ │ │ │ └── UserMapper.java
│ │ │ │ └── model
│ │ │ │ └── User.java
│ │ │ └── resources
│ │ │ ├── application.yml
│ │ │ └── mybatis
│ │ │ ├── mapper
│ │ │ └── UserMapper.xml
│ │ │ └── mybatis-config.xml
│ └── insert-fetch-id
│ │ ├── pom.xml
│ │ ├── sql
│ │ └── rt.sql
│ │ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── cunchang
│ │ │ │ └── dao
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ ├── ExecutorTypeBatch.java
│ │ └── InsertFetchIdTest.java
│ ├── mybatis-annotation-crud
│ ├── pom.xml
│ ├── readme.md
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── annotation
│ │ │ │ └── crud
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ ├── domain
│ │ │ │ └── User.java
│ │ │ │ └── utils
│ │ │ │ ├── Callback.java
│ │ │ │ └── MybatisUtil.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── jdbcConfig.properties
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── MybatisAnnotationTest.java
│ ├── mybatis-annotation-manytable
│ ├── pom.xml
│ ├── readme.md
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── annotation
│ │ │ │ └── manytable
│ │ │ │ ├── dao
│ │ │ │ ├── AccountMapper.java
│ │ │ │ └── UserMapper.java
│ │ │ │ ├── domain
│ │ │ │ ├── Account.java
│ │ │ │ └── User.java
│ │ │ │ └── utils
│ │ │ │ ├── Callback.java
│ │ │ │ └── MybatisUtil.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── jdbcConfig.properties
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── MybatisAnnotationTest.java
│ ├── mybatis-basic
│ ├── pom.xml
│ ├── readme.md
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatisbasic
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── mybatisbasic
│ │ │ └── dao
│ │ │ └── UserMapper.xml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── MybatisTest.java
│ ├── mybatis-cache
│ ├── pom.xml
│ ├── readme.md
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── cache
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── cache
│ │ │ │ └── dao
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── MybatisCacheTest.java
│ ├── mybatis-crud
│ ├── pom.xml
│ ├── sql
│ │ └── rt.sql
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatiscrud
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ ├── QueryVo.java
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatiscrud
│ │ │ │ └── dao
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ ├── MybatisCRUDTest.java
│ │ └── MybatisSelectTest.java
│ ├── mybatis-dynamicsql
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── dynamicsql
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ ├── QueryVo.java
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── dynamicsql
│ │ │ │ └── dao
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── MybatisDynamicSqlTest.java
│ ├── mybatis-interceptor
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── interceptor
│ │ │ │ ├── CameHumpInterceptor.java
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ ├── datascope
│ │ │ │ ├── DataScope.java
│ │ │ │ └── DataScopeInterceptor.java
│ │ │ │ └── domain
│ │ │ │ ├── Dept.java
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── interceptor
│ │ │ │ └── dao
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── MybatisSelectTest.java
│ ├── mybatis-lazy
│ ├── pom.xml
│ ├── readme.md
│ ├── sql
│ │ └── rt.sql
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── onetomany
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ ├── Account.java
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── onetomany
│ │ │ │ └── dao
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── UserTest.java
│ ├── mybatis-manytomany
│ ├── pom.xml
│ ├── readme.md
│ ├── sql
│ │ └── rt.sql
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── manytomany
│ │ │ │ ├── dao
│ │ │ │ ├── RoleMapper.java
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ ├── Role.java
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── manytomany
│ │ │ │ └── dao
│ │ │ │ ├── RoleMapper.xml
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── UserRoleTest.java
│ ├── mybatis-onetomany
│ ├── pom.xml
│ ├── readme.md
│ ├── sql
│ │ └── rt.sql
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── onetomany
│ │ │ │ ├── dao
│ │ │ │ └── UserMapper.java
│ │ │ │ └── domain
│ │ │ │ ├── Account.java
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── onetomany
│ │ │ │ └── dao
│ │ │ │ └── UserMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── UserTest.java
│ ├── mybatis-onetoone
│ ├── pom.xml
│ ├── readme.md
│ ├── sql
│ │ └── rt.sql
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── onetoone
│ │ │ │ ├── dao
│ │ │ │ └── AccountMapper.java
│ │ │ │ └── domain
│ │ │ │ ├── Account.java
│ │ │ │ ├── AccountUser.java
│ │ │ │ └── User.java
│ │ └── resources
│ │ │ ├── SqlMapConfig.xml
│ │ │ ├── cn
│ │ │ └── lastwhisper
│ │ │ │ └── mybatis
│ │ │ │ └── onetoone
│ │ │ │ └── dao
│ │ │ │ └── AccountMapper.xml
│ │ │ └── log4j.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── AccountTest.java
│ ├── orm.sql
│ └── pom.xml
├── spring-annotation
├── README.md
├── aop-@Aspect
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── aop
│ │ │ ├── LogAspects.java
│ │ │ ├── MathCalculator.java
│ │ │ ├── TestClient.java
│ │ │ └── config
│ │ │ └── MainConfigOfAop.java
│ │ └── resources
│ │ └── Bean.xml
├── aop-interface
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ ├── Calculate.java
│ │ ├── TestClient.java
│ │ ├── TulingCalculate.java
│ │ └── aop
│ │ ├── EalyAopMainConfig.java
│ │ ├── TulingLogAdvice.java
│ │ └── TulingLogInterceptor.java
├── aop-schema-based
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── cunchang
│ │ │ │ ├── aop
│ │ │ │ ├── CarAdvisor.java
│ │ │ │ ├── CarAdvisor2.java
│ │ │ │ ├── DrivingBeforeAdvice.java
│ │ │ │ └── DrivingInterceptor.java
│ │ │ │ └── domain
│ │ │ │ ├── BenzCar.java
│ │ │ │ ├── BmwCar.java
│ │ │ │ └── Car.java
│ │ └── resources
│ │ │ └── aop-low-api.xml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── aop
│ │ └── test
│ │ └── AOP_LowApiTest.java
├── autowired
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── autowired
│ │ │ ├── bean
│ │ │ ├── Boss.java
│ │ │ ├── Car.java
│ │ │ ├── Person.java
│ │ │ └── Red.java
│ │ │ ├── config
│ │ │ └── MainConfigOfAutoWired.java
│ │ │ ├── controller
│ │ │ └── BookController.java
│ │ │ ├── dao
│ │ │ └── BookDao.java
│ │ │ └── service
│ │ │ └── BookService.java
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── autowired
│ │ └── test
│ │ └── IOCTest_AutoWired.java
├── componentregister
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── componentregister
│ │ │ │ ├── MainTest.java
│ │ │ │ ├── bean
│ │ │ │ ├── Blue.java
│ │ │ │ ├── Color.java
│ │ │ │ ├── ColorFactoryBean.java
│ │ │ │ ├── Person.java
│ │ │ │ ├── RainBow.java
│ │ │ │ ├── Red.java
│ │ │ │ └── Yellow.java
│ │ │ │ ├── condition
│ │ │ │ ├── LinuxCondition.java
│ │ │ │ ├── MacCondition.java
│ │ │ │ └── WindowsCondition.java
│ │ │ │ ├── config
│ │ │ │ ├── MainConfigRegister.java
│ │ │ │ └── MainConfigScan.java
│ │ │ │ ├── controller
│ │ │ │ └── BookController.java
│ │ │ │ ├── dao
│ │ │ │ └── BookDao.java
│ │ │ │ ├── filter
│ │ │ │ └── MyTypeFilter.java
│ │ │ │ ├── register
│ │ │ │ └── MyImportBeanDefinitionRegistrar.java
│ │ │ │ ├── selector
│ │ │ │ └── MyImportSelector.java
│ │ │ │ └── service
│ │ │ │ └── BookService.java
│ │ └── resources
│ │ │ └── Bean.xml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── componentregister
│ │ └── test
│ │ └── IOCTest.java
├── event
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── spring
│ │ │ └── event
│ │ │ ├── BlackListEvent.java
│ │ │ ├── BlackListNotifier.java
│ │ │ ├── EmailService.java
│ │ │ └── EventConfig.java
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── spring
│ │ └── event
│ │ └── IOCTest_Event.java
├── ext
│ ├── README.md
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── spring
│ │ │ │ └── ext
│ │ │ │ ├── ExtConfig.java
│ │ │ │ ├── MyApplicationListener.java
│ │ │ │ ├── MyBeanDefinitionRegistryPostProcessor.java
│ │ │ │ ├── MyBeanFactoryPostProcessor.java
│ │ │ │ ├── UserService.java
│ │ │ │ └── bean
│ │ │ │ └── Blue.java
│ │ └── resources
│ │ │ └── note.txt
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── spring
│ │ └── ext
│ │ └── test
│ │ └── IOCTest_EXT.java
├── liftcycle
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ └── java
│ │ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── LifeCycleBean.java
│ │ │ ├── MyBeanPostProcessor.java
│ │ │ └── config
│ │ │ └── MainConfigOfLifeCycle.java
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── cunchang
│ │ └── IOCTest_LifeCycle2.java
├── pom.xml
├── profile
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── profile
│ │ │ │ ├── bean
│ │ │ │ └── Yellow.java
│ │ │ │ └── config
│ │ │ │ └── MainConfigofProfile.java
│ │ └── resources
│ │ │ └── db.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── profile
│ │ └── test
│ │ └── IOCTest_Profile.java
├── propertyvalue
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── propertyvalue
│ │ │ │ ├── bean
│ │ │ │ └── Person.java
│ │ │ │ └── config
│ │ │ │ └── MainConfigOfPropertyValues.java
│ │ └── resources
│ │ │ ├── Bean.xml
│ │ │ └── person.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── propertyvalue
│ │ └── test
│ │ └── IOCTest_PropertyValue.java
└── transaction
│ ├── README.md
│ ├── pom.xml
│ └── src
│ ├── main
│ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ └── tx
│ │ │ ├── TxConfig.java
│ │ │ ├── UserDao.java
│ │ │ └── UserService.java
│ └── resources
│ │ ├── Bean.xml
│ │ └── test.sql
│ └── test
│ └── java
│ └── cn
│ └── lastwhisper
│ └── tx
│ └── test
│ └── IOCTest_TX.java
├── spring-batch
└── spring-batch
│ ├── pom.xml
│ └── src
│ ├── main
│ ├── java
│ │ └── cn
│ │ │ └── cunchang
│ │ │ ├── SpringBatchApplication.java
│ │ │ ├── batch
│ │ │ ├── BatchConfiguration.java
│ │ │ ├── BatchMessageChannel.java
│ │ │ ├── job
│ │ │ │ └── BatchConfiguration.java
│ │ │ ├── listener
│ │ │ │ ├── JobCompletionNotificationListener.java
│ │ │ │ └── StepCompletionNotificationListener.java
│ │ │ └── processor
│ │ │ │ └── PersonItemProcessor.java
│ │ │ ├── pojo
│ │ │ └── Person.java
│ │ │ └── schedule
│ │ │ └── EntryXxljob.java
│ └── resources
│ │ ├── application.properties
│ │ ├── sample-data.csv
│ │ └── schema-all.sql
│ └── test
│ └── java
│ └── cn
│ └── cunchang
│ └── SpringBatchApplicationTests.java
├── springboot-aop
├── cache
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ ├── CacheDemoApplication.java
│ │ │ │ ├── config
│ │ │ │ └── ApplicationContextHolder.java
│ │ │ │ └── service
│ │ │ │ └── MenuService.java
│ │ └── resources
│ │ │ └── application.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── CacheDemoApplicationTests.java
├── execution
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ ├── ExecutionDemoApplication.java
│ │ │ │ ├── anno
│ │ │ │ ├── AdminOnly.java
│ │ │ │ ├── NeedSecured.java
│ │ │ │ ├── NeedSecuredClass.java
│ │ │ │ └── NeedSecuredSource.java
│ │ │ │ ├── bean
│ │ │ │ └── Product.java
│ │ │ │ ├── config
│ │ │ │ ├── AdviceAspectConfig.java
│ │ │ │ ├── AnnoAspectConfig.java
│ │ │ │ ├── ArgsAspectConfig.java
│ │ │ │ ├── ExecutionAspectConfig.java
│ │ │ │ ├── ObjectAspectConfig.java
│ │ │ │ └── PkgTypeAspectConfig.java
│ │ │ │ ├── log
│ │ │ │ ├── LogService.java
│ │ │ │ └── Loggable.java
│ │ │ │ └── service
│ │ │ │ ├── ProductService.java
│ │ │ │ └── sub
│ │ │ │ └── SubService.java
│ │ └── resources
│ │ │ └── application.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── test
│ │ └── ExecutionDemoApplicationTests.java
├── log
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ └── aop
│ │ │ │ ├── LogApplication.java
│ │ │ │ ├── dao
│ │ │ │ └── ProductDao.java
│ │ │ │ ├── datalog
│ │ │ │ ├── ActionDao.java
│ │ │ │ ├── Datalog.java
│ │ │ │ └── DatalogAspect.java
│ │ │ │ ├── domain
│ │ │ │ ├── Action.java
│ │ │ │ ├── ActionType.java
│ │ │ │ ├── ChangeItem.java
│ │ │ │ └── Product.java
│ │ │ │ └── util
│ │ │ │ └── DiffUtil.java
│ │ └── resources
│ │ │ └── application.yml
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── LogApplicationTests.java
├── pom.xml
├── principle
│ └── README.md
├── security
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── cn
│ │ │ │ └── lastwhisper
│ │ │ │ ├── SecurityDemoApplication.java
│ │ │ │ ├── config
│ │ │ │ ├── MyPasswordEncoder.java
│ │ │ │ └── SecurityConfig.java
│ │ │ │ └── controller
│ │ │ │ └── DemoController.java
│ │ └── resources
│ │ │ └── application.properties
│ │ └── test
│ │ └── java
│ │ └── cn
│ │ └── lastwhisper
│ │ └── SecurityDemoApplicationTests.java
└── transaction
│ ├── pom.xml
│ └── src
│ ├── main
│ ├── java
│ │ └── cn
│ │ │ └── lastwhisper
│ │ │ ├── TransactionDemoApplication.java
│ │ │ ├── aop
│ │ │ ├── dao
│ │ │ │ ├── OperationLogDao.java
│ │ │ │ └── UserDao.java
│ │ │ └── domain
│ │ │ │ ├── OperationLog.java
│ │ │ │ └── User.java
│ │ │ └── service
│ │ │ └── DemoService.java
│ └── resources
│ │ └── application.properties
│ └── test
│ └── java
│ └── cn
│ └── lastwhisper
│ └── TransactionDemoApplicationTests.java
└── tool
├── pom.xml
└── src
└── main
├── java
└── cn
│ └── cunchang
│ ├── DeleteFile.java
│ ├── DeleteFileToTrash.java
│ └── KillServer.java
└── resources
└── config.properties
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.js linguist-language=java
2 | *.css linguist-language=java
3 | *.html linguist-language=java
4 | *.jsp linguist-language=java
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | target/
3 | *.iml
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ```
2 | ├─algorithms 算法
3 | ├─database 数据库
4 | ├─distributed 分布式系统
5 | ├─framework 一些常用类库
6 | ├─java-advance 高级类库和jsr规范等
7 | ├─java-basic Java基础
8 | ├─lesson-code 一些课程代码
9 | ├─mvc mvc框架
10 | ├─orm orm框架
11 | ├─spring-annotation spring注解驱动开发
12 | ├─spring-batch
13 | ├─springboot-aop springaop使用以及aop应用
14 | │
15 | └─
16 |
17 | ```
18 |
19 |
--------------------------------------------------------------------------------
/algorithms/algorithm-common/src/main/java/cn/lastwhisper/leetcode/common/linkedlist/ListNode.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.common.linkedlist;
2 |
3 | public class ListNode {
4 | public int val;
5 | public ListNode next;
6 |
7 | public ListNode(int x) {
8 | val = x;
9 | }
10 |
11 | }
--------------------------------------------------------------------------------
/algorithms/algorithm-common/src/main/java/cn/lastwhisper/leetcode/common/tree/TreeNode.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.common.tree;
2 |
3 | public class TreeNode {
4 | public int val;
5 | public TreeNode left;
6 | public TreeNode right;
7 |
8 | public TreeNode(int x) {
9 | val = x;
10 | }
11 | }
--------------------------------------------------------------------------------
/algorithms/go/algorithm/leetcode/array/数组中的第K个最大元素_215_中等/Solution1.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "sort"
4 |
5 | func findKthLargest(nums []int, k int) int {
6 | sort.Ints(nums)
7 | return nums[len(nums)-k]
8 | }
9 |
10 | func main() {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/algorithms/go/algorithm/leetcode/lc69.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | func mySqrt(x int) int {
6 |
7 |
8 | return 0
9 | }
10 |
11 | func main() {
12 | fmt.Println(mySqrt(4))
13 | fmt.Println(mySqrt(8))
14 | }
15 |
16 |
--------------------------------------------------------------------------------
/algorithms/leetcode/dynamic/src/main/java/cn/lastwhisper/leetcode/dynamic/三角形最小路径和_120_中等/README.md:
--------------------------------------------------------------------------------
1 | https://leetcode-cn.com/problems/triangle/solution/javadong-tai-gui-hua-si-lu-yi-ji-dai-ma-shi-xian-b/
--------------------------------------------------------------------------------
/algorithms/leetcode/greedy/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/greedy/README.md
--------------------------------------------------------------------------------
/algorithms/leetcode/leetcode-common/src/main/java/cn/lastwhisper/leetcode/common/linkedlist/ListNode.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.common.linkedlist;
2 |
3 | public class ListNode {
4 | public int val;
5 | public ListNode next;
6 |
7 | public ListNode(int x) {
8 | val = x;
9 | }
10 |
11 | }
--------------------------------------------------------------------------------
/algorithms/leetcode/leetcode-common/src/main/java/cn/lastwhisper/leetcode/common/tree/TreeNode.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.common.tree;
2 |
3 | public class TreeNode {
4 | public int val;
5 | public TreeNode left;
6 | public TreeNode right;
7 |
8 | public TreeNode(int x) {
9 | val = x;
10 | }
11 | }
--------------------------------------------------------------------------------
/algorithms/leetcode/leetcode大纲.md:
--------------------------------------------------------------------------------
1 | 双指针(快慢指针) 283、27、26、80、202
2 | 滑动窗口 209、3、438、76
3 | 对撞指针 167、125、344、345、11
4 | 快速排序 75、
5 |
--------------------------------------------------------------------------------
/algorithms/leetcode/linkedlist/README.MD:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/linkedlist/README.MD
--------------------------------------------------------------------------------
/algorithms/leetcode/linkedlist/src/main/java/cn/lastwhisper/leetcode/common/linkedlist/相交链表_160_简单/参考:
--------------------------------------------------------------------------------
1 | https://leetcode.com/problems/intersection-of-two-linked-lists/solution/
--------------------------------------------------------------------------------
/algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/剪枝.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/剪枝.png
--------------------------------------------------------------------------------
/algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/组合.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/组合.png
--------------------------------------------------------------------------------
/algorithms/leetcode/stackqueue/src/main/java/cn/lastwhisper/leetcode/stackqueue/二叉树的后序遍历_145_困难/参考.txt:
--------------------------------------------------------------------------------
1 | https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--34/
--------------------------------------------------------------------------------
/algorithms/leetcode/stackqueue/src/main/java/cn/lastwhisper/leetcode/stackqueue/扁平化嵌套列表迭代器_341_中等/参考:
--------------------------------------------------------------------------------
1 | https://leetcode-cn.com/problems/flatten-nested-list-iterator/solution/shi-yong-di-gui-he-zhan-liang-chong-jie-fa-jin-xin/
--------------------------------------------------------------------------------
/algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one176/最多可以参加的会议数目_5342/Solution.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.week.one176.最多可以参加的会议数目_5342;
2 |
3 | class Solution {
4 |
5 | public int maxEvents(int[][] events) {
6 | return 0;
7 | }
8 |
9 | public static void main(String[] args){
10 |
11 | }
12 | }
--------------------------------------------------------------------------------
/algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one177/形成三的最大倍数_5172_困难/Solution.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.week.one177.形成三的最大倍数_5172_困难;
2 |
3 | class Solution {
4 | public String largestMultipleOfThree(int[] digits) {
5 |
6 | return null;
7 | }
8 | }
--------------------------------------------------------------------------------
/algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one177/最接近的因数_5171_中等/Solution.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.week.one177.最接近的因数_5171_中等;
2 |
3 | class Solution {
4 | public int[] closestDivisors(int num) {
5 |
6 | return null;
7 | }
8 | }
--------------------------------------------------------------------------------
/algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one177/验证二叉树_5170_中等/Solution.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.leetcode.week.one177.验证二叉树_5170_中等;
2 |
3 | class Solution {
4 | public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
5 |
6 | return true;
7 | }
8 |
9 | public static void main(String[] args) {
10 |
11 | }
12 | }
--------------------------------------------------------------------------------
/algorithms/leetcode2/README.md:
--------------------------------------------------------------------------------
1 | 2刷力扣
2 |
3 | ```java
4 | /**
5 | * 思考:
6 | * -------------------------------------------------------------------
7 | * 思路:
8 | * -------------------------------------------------------------------
9 | * 时间复杂度:O(n^2)
10 | * 空间复杂度:O(1)
11 | */
12 |
13 |
14 | ```
15 |
16 | - greedy 贪心
17 | - point 双指针
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/algorithms/leetcode2/leetcode2-common/src/main/java/cn/cunchang/linkedlist/ListNode.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.linkedlist;
2 |
3 | public class ListNode {
4 | public int val;
5 | public ListNode next;
6 |
7 | public ListNode(int x) {
8 | val = x;
9 | }
10 |
11 | }
--------------------------------------------------------------------------------
/algorithms/leetcode2/leetcode2-common/src/main/java/cn/cunchang/tree/TreeNode.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.tree;
2 |
3 | public class TreeNode {
4 | public int val;
5 | public TreeNode left;
6 | public TreeNode right;
7 |
8 | public TreeNode(int x) {
9 | val = x;
10 | }
11 | }
--------------------------------------------------------------------------------
/algorithms/leetcode2/sort/src/main/java/cn/cunchang/sort/README.md:
--------------------------------------------------------------------------------
1 | 快排
2 | QuickSort1 第一个元素做分区
3 | QuickSort2 最后一个元素做分区
4 | QuickSort3 随机一个元素做分区
5 | 堆排序
6 | Heap1 数组第一个元素空出
7 | Heap2 数组第一个元素不空出
--------------------------------------------------------------------------------
/algorithms/leetcode2/src/main/java/cn/cunchang/接雨水_42_困难/README.md:
--------------------------------------------------------------------------------
1 |
2 | Solution1;按照自己的思路写了一遍
3 | Solution2;精简代码;因为Solution1超时了,,,,
4 | Solution3;备忘录优化
5 |
6 |
--------------------------------------------------------------------------------
/algorithms/offer/src/main/java/cn/lastwhisper/offer/单例/Singleton1.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.offer.单例;
2 |
3 | /**
4 | * 恶汉式之类加载时初始化
5 | * @author cn.lastwhisper
6 | */
7 | public class Singleton1 {
8 | // 类属性,所有引用共享一个地址
9 | private static Singleton1 instance = new Singleton1();
10 |
11 | private Singleton1() {
12 | }
13 | public static Singleton1 getInstance() {
14 | return instance;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/algorithms/offer/src/main/java/cn/lastwhisper/offer/单例/Singleton5.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.offer.单例;
2 |
3 | /**
4 | * 懒汉式之枚举
5 | */
6 | public enum Singleton5 {
7 | INSTANCE;
8 |
9 | public Singleton5 getInstance() {
10 | return INSTANCE;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/algorithms/offer/src/main/java/cn/lastwhisper/offer/面试题05_替换空格_简单/Solution.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.offer.面试题05_替换空格_简单;
2 |
3 | class Solution {
4 | public String replaceSpace(String s) {
5 | StringBuilder sb = new StringBuilder();
6 | for (char c : s.toCharArray()) {
7 | if (c != ' ') sb.append(c);
8 | else sb.append("%20");
9 | }
10 | return sb.toString();
11 | }
12 | }
--------------------------------------------------------------------------------
/bigdata/flink/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | log4j.rootLogger=warn,stdout
2 |
3 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender
4 | log4j.appender.stdout.Target = System.out
5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
6 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/bigdata/hadoop/hdfs/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | log4j.rootLogger=info,stdout
2 |
3 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender
4 | log4j.appender.stdout.Target = System.out
5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
6 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/bigdata/hadoop/mapreduce/src/main/java/cn/cunchang/mr/README.md:
--------------------------------------------------------------------------------
1 |
2 | # mapreduce
3 | mapreduce模块下的类,都要放到hadoop上执行
4 |
5 | WordCountJob
6 | JavaSerialize、HadoopSerialize
7 |
8 |
9 | # yarn
10 | WordCountJobQueue
11 |
12 |
--------------------------------------------------------------------------------
/bigdata/hadoop/mapreduce/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | log4j.rootLogger=info,stdout
2 |
3 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender
4 | log4j.appender.stdout.Target = System.out
5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
6 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/access.log:
--------------------------------------------------------------------------------
1 | 202512120010,imooc.com,2000
2 | 202512120010,a.com,6000
3 | 202512120010,b.com,5000
4 | 202512120010,imooc.com,4000
5 | 202512120010,a.com,1000
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/nest/1/a.txt:
--------------------------------------------------------------------------------
1 | a
2 | a
3 | a
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/nest/1/b.txt:
--------------------------------------------------------------------------------
1 | b
2 | b
3 | b
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/nest/2/c.txt:
--------------------------------------------------------------------------------
1 | c
2 | c
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/nest/2/d.txt:
--------------------------------------------------------------------------------
1 | d
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/nest/wc.txt:
--------------------------------------------------------------------------------
1 | pk,pk,pk
2 | flink,flink
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/people.csv:
--------------------------------------------------------------------------------
1 | name;age;job
2 | Jorge;30;Developer
3 | Bob;32;Developer
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/wc.data:
--------------------------------------------------------------------------------
1 | pk,pk,pk,flink,flink
2 | pk,pk,pk,flink,flink
--------------------------------------------------------------------------------
/bigdata/imooc-flink/data/wc.txt:
--------------------------------------------------------------------------------
1 | pk,pk,pk
2 | flink,flink
--------------------------------------------------------------------------------
/bigdata/imooc-flink/imooc-flink-project/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/bigdata/imooc-flink/imooc-flink-project/README.md
--------------------------------------------------------------------------------
/bigdata/imooc-flink/imooc-flink-project/src/main/java/com/imooc/flink/domain/Product.java:
--------------------------------------------------------------------------------
1 | package com.imooc.flink.domain;
2 |
3 | public class Product {
4 |
5 | public String category;
6 | public String name;
7 |
8 | @Override
9 | public String toString() {
10 | return "Product{" +
11 | "category='" + category + '\'' +
12 | ", name='" + name + '\'' +
13 | '}';
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/bigdata/imooc-flink/imooc-flink-project/src/main/java/com/imooc/flink/utils/StringUtils.java:
--------------------------------------------------------------------------------
1 | package com.imooc.flink.utils;
2 |
3 | public class StringUtils {
4 |
5 | public static final String GAODE_KEY = "6d5be617aa12cd42f6c7421cbfa8883a";
6 | }
7 |
--------------------------------------------------------------------------------
/distributed/READEME.MD:
--------------------------------------------------------------------------------
1 | hystrix 如何进行降级、限流、熔断
2 |
3 | mq 各种mq的使用
4 |
5 | registration-center 各种注册中心
6 |
7 | springcloud-netflix netflix组件使用
8 |
9 | sso 单点登录
--------------------------------------------------------------------------------
/distributed/gateway/README.md:
--------------------------------------------------------------------------------
1 | gateway单独使用
2 | https://blog.csdn.net/jiongyan6966/article/details/84633632
3 |
4 | service-product 8081
5 | http://localhost:8081/method
6 |
7 | service-order-load1 8082
8 | service-order-load2 8083
9 | http://localhost:8082/method
10 | http://localhost:8083/method
11 |
12 | zuul-gateway 9000
13 | http://localhost:9000/shop-api/product/method
14 | http://localhost:9000/shop-api/order/method
--------------------------------------------------------------------------------
/distributed/gateway/service-order-load1/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8082
--------------------------------------------------------------------------------
/distributed/gateway/service-order-load1/src/test/java/cn/lastwhisper/servicea/ServiceAApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ServiceAApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/gateway/service-order-load2/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8083
--------------------------------------------------------------------------------
/distributed/gateway/service-order-load2/src/test/java/cn/lastwhisper/servicea/ServiceAApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ServiceAApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/gateway/service-product/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8081
--------------------------------------------------------------------------------
/distributed/gateway/service-product/src/test/java/cn/lastwhisper/service/ServiceAApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ServiceAApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/gateway/zuul-gateway/src/main/resources/META-INF/additional-spring-configuration-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "properties": [
3 | {
4 | "name": "api-2.ribbon.listOfServers",
5 | "type": "java.lang.String",
6 | "description": "Description for api-2.ribbon.listOfServers."
7 | }
8 | ] }
--------------------------------------------------------------------------------
/distributed/gateway/zuul-gateway/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 9000
3 | zuul:
4 | routes:
5 | product:
6 | path: /shop-api/product/**
7 | url: http://localhost:8081/
8 | order:
9 | path: /shop-api/order/**
10 | # url: http://localhost:8083/
11 | order:
12 | ribbon:
13 | listOfServers: http://localhost:8082,http://localhost:8083
14 | ribbon:
15 | eureka:
16 | enabled: false
17 |
--------------------------------------------------------------------------------
/distributed/gateway/zuul-gateway/src/test/java/cn/lastwhisper/zuul/ZuulGatewayApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.zuul;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ZuulGatewayApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/gray/README.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/distributed/gray/src/main/java/cn/cunchang/v2/web/req/RequestConfig.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.v2.web.req;
2 |
3 | import lombok.Data;
4 |
5 | /**
6 | * Created by qiumu on 2020/10/11.
7 | */
8 | @Data
9 | public class RequestConfig {
10 |
11 |
12 | /**
13 | * 接口ID
14 | */
15 | private Integer id;
16 |
17 | private Integer grayNumber;
18 |
19 | private Integer normalNumber;
20 |
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/distributed/gray/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | # common spring boot settings
2 |
3 | spring.redis.database=
4 | spring.redis.host=127.0.0.1
5 | spring.redis.port=6397
6 | spring.redis.password=
7 | spring.redis.ssl=
8 | spring.redis.timeout=
9 | spring.redis.cluster.nodes=
10 | spring.redis.sentinel.master=
11 | spring.redis.sentinel.nodes=
12 |
13 |
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-cache-ha/src/main/java/cn/lastwhisper/cache/ha/mapper/UserMapper.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.cache.ha.mapper;
2 |
3 | public interface UserMapper {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-cache-ha/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | server.port=8081
2 | spring.datasource.url=jdbc:mysql://localhost:3306/eshop?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
3 | spring.datasource.username=root
4 | spring.datasource.password=root
5 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-cache-ha/src/main/resources/mybatis/UserMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-cache-ha/src/main/resources/templates/hello.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/hystrix/eshop-cache-ha/src/main/resources/templates/hello.html
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-product-ha/src/main/java/cn/lastwhisper/product/ha/mapper/UserMapper.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.product.ha.mapper;
2 |
3 | /**
4 | * @author Administrator
5 | */
6 | public interface UserMapper {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-product-ha/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | server.port=8082
2 | spring.datasource.url=jdbc:mysql://localhost:3306/eshop?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
3 | spring.datasource.username=root
4 | spring.datasource.password=root
5 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver
6 | logging.level.org.apache.http.impl=info
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-product-ha/src/main/resources/mybatis/UserMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-product-ha/src/main/resources/templates/hello.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/hystrix/eshop-product-ha/src/main/resources/templates/hello.html
--------------------------------------------------------------------------------
/distributed/hystrix/eshop-product-ha/src/test/java/cn/lastwhisper/product/ha/ProductHaApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.product.ha;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ProductHaApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/lock/flow1/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | server.port=1111
2 | spring.redis.database=0
3 | spring.redis.host=localhost
4 | #连接池最大连接数(使用负值表示没有限制)默认8
5 | spring.redis.port=6379
6 | #连接池最大阻塞等待时间(使用负值表示没有限制)默认-1
7 | spring.redis.lettuce.pool.max-active=8
8 | #连接池中的最大空闲连接默认8
9 | spring.redis.lettuce.pool.max-wait=-1
10 | #连接池中的最小空闲连接默认0
11 | spring.redis.lettuce.pool.max-idle=8
12 | spring.redis.lettuce.pool.min-idle=0
--------------------------------------------------------------------------------
/distributed/lock/flow1/src/main/resources/lua/DelLockScript.lua:
--------------------------------------------------------------------------------
1 | if redis.call("get",KEYS[1]) == ARGV[1]
2 | then
3 | return redis.call("del",KEYS[1])
4 | else
5 | return 0
6 | end
--------------------------------------------------------------------------------
/distributed/lock/flow1/src/test/java/cn/cunchang/Application1Tests.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class Application1Tests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/lock/flow2/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | server.port=2222
2 | spring.redis.database=0
3 | spring.redis.host=localhost
4 | #连接池最大连接数(使用负值表示没有限制)默认8
5 | spring.redis.port=6379
6 | #连接池最大阻塞等待时间(使用负值表示没有限制)默认-1
7 | spring.redis.lettuce.pool.max-active=8
8 | #连接池中的最大空闲连接默认8
9 | spring.redis.lettuce.pool.max-wait=-1
10 | #连接池中的最小空闲连接默认0
11 | spring.redis.lettuce.pool.max-idle=8
12 | spring.redis.lettuce.pool.min-idle=0
--------------------------------------------------------------------------------
/distributed/lock/flow2/src/test/java/cn/cunchang/Application2Tests.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class Application2Tests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/lock/jedis/README.md:
--------------------------------------------------------------------------------
1 |
2 | # redis学习时的代码笔记
3 |
4 | ## asynqueue 异步队列
5 |
6 | ## basic 基础数据结构操作
7 |
8 | ## cluster Java集群操作
9 |
10 | ## dlock redis分布式锁
11 |
12 | ## hyperloglog 统计
13 |
14 | ## bloomfilter 布隆过滤器
15 |
16 | ## partition hash节点迁移率
17 |
18 | ## pipeline 流水线指令
19 |
20 | ## publishersubscriber 发布订阅
21 |
22 | ## sentinel 哨兵
23 |
24 | ## transaction 事务
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/distributed/lock/jedis/src/main/java/cn/cunchang/JedisUtil.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import cn.cunchang.common.Const;
4 | import redis.clients.jedis.Jedis;
5 |
6 | public class JedisUtil {
7 |
8 | public static Jedis getJedis() {
9 | // 默认db0,可以设置
10 | Jedis jedis = new Jedis(Const.IP, Const.PORT);
11 | // jedis.select(1);
12 | return jedis;
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/distributed/lock/jedis/src/main/java/cn/cunchang/basic/BasicOperation.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.basic;
2 |
3 | /**
4 | * Redis基础数据结构的操作
5 | * @author cunchang
6 | * @date 2019/11/23
7 | */
8 | public class BasicOperation {
9 |
10 |
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/lock/jedis/src/main/java/cn/cunchang/common/Const.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.common;
2 |
3 | /**
4 | *
5 | * @author cunchang
6 | * @date 2020/4/20
7 | */
8 | public interface Const {
9 |
10 | String IP = "127.0.0.1";
11 | Integer PORT = 6379;
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/lock/jedis/src/main/java/cn/cunchang/lock/real/CodeBlock.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.lock.real;
2 |
3 | /**
4 | * 代码块
5 | *
6 | * @author cunchang
7 | */
8 | public interface CodeBlock {
9 |
10 | /**
11 | * 操作共享资源
12 | */
13 | void operatingSharedResource();
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/distributed/lock/jedis/src/main/resources/Setnx_Expire_Srcipt.lua:
--------------------------------------------------------------------------------
1 | if redis.call('setnx', KEYS[1], KEYS[2]) == 1
2 | then return redis.call('expire', KEYS[1], KEYS[3]);
3 | end
4 | return nil;
--------------------------------------------------------------------------------
/distributed/mq/activemq/activemq-api/src/main/java/cn/latwhisper/activemq/Constant.java:
--------------------------------------------------------------------------------
1 | package cn.latwhisper.activemq;
2 |
3 | /**
4 | *
5 | * @author lastwhisper
6 | * @date 2020/2/10
7 | */
8 | public interface Constant {
9 | // tcp://IP:61616
10 | String BROKER_URL = "tcp://192.168.217.101:61616";
11 |
12 | String QUEUE_NAME="hello-queue";
13 |
14 | String TOPIC_NAME="hello-topic";
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/distributed/mq/activemq/activemq-api/src/main/resources/jms规范接口.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/mq/activemq/activemq-api/src/main/resources/jms规范接口.jpg
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/README.md:
--------------------------------------------------------------------------------
1 | rabbitmq-api 为基础api与高级特性源码
2 | rabbitmq-spring 为整合springamqp框架源码
3 | rabbitmq-springboot-producer & rabbitmq-springboot-consumer 为整合springboot框架源码
4 | rabbitmq-springboot-producer-reliable 为rabbitmq可靠消息投递方案
5 | rabbitmq-springcloudstream-producer & rabbitmq-springcloudstream-consumer 为整合spring cloud stream源码
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-api/src/main/java/cn/lastwhisper/rabbitmq/common/Constant.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.rabbitmq.common;
2 |
3 | /**
4 | *
5 | * @author lastwhisper
6 | * @date 2020/2/8
7 | */
8 | public interface Constant {
9 |
10 | String ip = "192.168.217.101";
11 | Integer port = 5672;
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-spring/src/main/java/cn/lastwhisper/rabbitmq/Application.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.rabbitmq;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-spring/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/java/com/bfxy/springboot/Application.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/java/com/bfxy/springboot/MainConfig.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot;
2 |
3 | import org.springframework.context.annotation.ComponentScan;
4 | import org.springframework.context.annotation.Configuration;
5 |
6 | @Configuration
7 | @ComponentScan({"com.bfxy.springboot.*"})
8 | public class MainConfig {
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/resources/application.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/resources/application.properties
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/Application.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/MainConfig.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot;
2 |
3 | import org.springframework.context.annotation.ComponentScan;
4 | import org.springframework.context.annotation.Configuration;
5 |
6 | @Configuration
7 | @ComponentScan({"com.bfxy.springboot.*"})
8 | public class MainConfig {
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/config/database/BaseMapper.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot.config.database;
2 |
3 | import tk.mybatis.mapper.common.Mapper;
4 | import tk.mybatis.mapper.common.MySqlMapper;
5 |
6 | public interface BaseMapper extends Mapper, MySqlMapper {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/constant/Constants.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot.constant;
2 |
3 | public final class Constants {
4 |
5 | public static final String ORDER_SENDING = "0";
6 |
7 | public static final String ORDER_SEND_SUCCESS = "1";
8 |
9 | public static final String ORDER_SEND_FAILURE = "2";
10 |
11 | public static final int ORDER_TIMEOUT = 1; /*min*/
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/java/com/bfxy/springboot/Application.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/java/com/bfxy/springboot/MainConfig.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.springboot;
2 |
3 | import org.springframework.context.annotation.ComponentScan;
4 | import org.springframework.context.annotation.Configuration;
5 |
6 | @Configuration
7 | @ComponentScan({"com.bfxy.springboot.*"})
8 | public class MainConfig {
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/resources/application.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/resources/application.properties
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springcloudstream-consumer/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springcloudstream-consumer/src/main/java/com/bfxy/rabbitmq/Application.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.rabbitmq;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springcloudstream-producer/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/distributed/mq/rabbitmq/rabbitmq-springcloudstream-producer/src/main/java/com/bfxy/rabbitmq/Application.java:
--------------------------------------------------------------------------------
1 | package com.bfxy.rabbitmq;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/mq/rocketmq/rocketmq-api/src/main/java/cn/cunchang/contants/Const.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.contants;
2 |
3 | public interface Const {
4 |
5 | String NAMESRV_ADDR_SINGLE = "127.0.0.1:9876";
6 |
7 | String NAMESRV_ADDR_MASTER_SLAVE = "127.0.0.1:9876;192.168.217.102:9876";
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/distributed/mq/rocketmq/springboot-rocketmq/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | rocketmq.name-server=192.168.232.128:9876
2 | rocketmq.producer.group=springBootGroup
--------------------------------------------------------------------------------
/distributed/mq/rocketmq/springcloud-alibaba-rocketmq/README.md:
--------------------------------------------------------------------------------
1 |
2 | spring-cloud-starter-stream-rocketmq
3 |
4 |
5 |
--------------------------------------------------------------------------------
/distributed/session/jwt-session/src/main/java/cn/cunchang/Application.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/session/jwt-session/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/distributed/session/jwt-session/src/test/java/cn/cunchang/ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/session/redis-session/src/main/java/cn/cunchang/Application.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/session/redis-session/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | redis:
3 | host: 127.0.0.1
4 | port: 6379
--------------------------------------------------------------------------------
/distributed/session/redis-session/src/test/java/cn/cunchang/ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/session/spring-session/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | redis:
3 | host: 127.0.0.1
4 | port: 6379
5 | session:
6 | store-type: redis
7 | timeout: 3600
8 | redis:
9 | namespace: login_user #前缀
10 |
--------------------------------------------------------------------------------
/distributed/session/spring-session/src/test/java/cn/cuchang/ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.cuchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/session/tomcat-session/src/main/java/cn/cuchang/Application.java:
--------------------------------------------------------------------------------
1 | package cn.cuchang;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/session/tomcat-session/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/distributed/session/tomcat-session/src/test/java/cn/cuchang/ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.cuchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/sharding-sphere/ShardingSphereDemo/sql/course.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE course_1 (
2 | cid BIGINT(20) PRIMARY KEY,
3 | cname VARCHAR(50) NOT NULL,
4 | user_id BIGINT(20) NOT NULL,
5 | cstatus varchar(10) NOT NULL
6 | );
7 |
8 | CREATE TABLE course_2 (
9 | cid BIGINT(20) PRIMARY KEY,
10 | cname VARCHAR(50) NOT NULL,
11 | user_id BIGINT(20) NOT NULL,
12 | cstatus varchar(10) NOT NULL
13 | );
--------------------------------------------------------------------------------
/distributed/sharding-sphere/ShardingSphereDemo/src/main/java/com/roy/shardingDemo/mapper/CourseMapper.java:
--------------------------------------------------------------------------------
1 | package com.roy.shardingDemo.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.roy.shardingDemo.entity.Course;
5 |
6 | /**
7 | * @author :楼兰
8 | * @date :Created in 2021/1/4
9 | * @description:
10 | **/
11 |
12 | public interface CourseMapper extends BaseMapper {
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/sharding-sphere/ShardingSphereDemo/src/main/java/com/roy/shardingDemo/mapper/DictMapper.java:
--------------------------------------------------------------------------------
1 | package com.roy.shardingDemo.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.roy.shardingDemo.entity.Dict;
5 |
6 | /**
7 | * @author :楼兰
8 | * @date :Created in 2021/1/5
9 | * @description:
10 | **/
11 | public interface DictMapper extends BaseMapper {
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/springcloud-debug/consumer/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8055
3 |
4 | spring:
5 | application:
6 | name: consumer #微服务名称
7 |
8 | #配置nacos注册中心地址
9 | cloud:
10 | nacos:
11 | discovery:
12 | server-addr: 127.0.0.1:8848
13 |
14 |
15 |
16 | management:
17 | endpoints:
18 | web:
19 | exposure:
20 | include: '*'
21 |
--------------------------------------------------------------------------------
/distributed/springcloud-debug/producer/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8056
3 |
4 | spring:
5 | application:
6 | name: producer #微服务名称
7 |
8 | #配置nacos注册中心地址
9 | cloud:
10 | nacos:
11 | discovery:
12 | server-addr: 127.0.0.1:8848
13 |
14 |
15 |
16 | management:
17 | endpoints:
18 | web:
19 | exposure:
20 | include: '*'
21 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/api-gateway/src/main/java/cn/lastwhisper/apigateway/constant/CookieConstant.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.apigateway.constant;
2 |
3 | /**
4 | * Created by 廖师兄
5 | * 2018-03-04 23:28
6 | */
7 | public interface CookieConstant {
8 |
9 | String TOKEN = "token";
10 |
11 | String OPENID = "openid";
12 |
13 | /**
14 | * 过期时间(单位:s)
15 | */
16 | Integer expire = 7200;
17 | }
18 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/api-gateway/src/main/java/cn/lastwhisper/apigateway/constant/RedisConstant.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.apigateway.constant;
2 |
3 | /**
4 | * Created by 廖师兄
5 | * 2018-03-04 23:37
6 | */
7 | public interface RedisConstant {
8 |
9 | String TOKEN_TEMPLATE = "token_%s";
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/api-gateway/src/main/java/cn/lastwhisper/apigateway/exception/RateLimitException.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.apigateway.exception;
2 |
3 | /**
4 | * Created by 廖师兄
5 | * 2018-03-11 23:56
6 | */
7 | public class RateLimitException extends RuntimeException {
8 | }
9 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/api-gateway/src/test/java/cn/lastwhisper/apigateway/ApiGatewayApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.apigateway;
2 |
3 | import org.junit.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ApiGatewayApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/client/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | eureka:
2 | client:
3 | service-url:
4 | defaultZone: http://localhost:8761/eureka/
5 | # instance:
6 | # hostname: clientName
7 | spring:
8 | application:
9 | name: client
10 | server:
11 | port: 8080
12 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/client/src/test/java/cn/lastwhisper/client/ClientApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.client;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ClientApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/config/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM hub.c.163.com/library/java:8-alpine
2 |
3 | MAINTAINER 15037584397@163.com
4 |
5 | ADD target/*.jar app.jar
6 |
7 | EXPOSE 8080
8 |
9 | ENTRYPOINT ["java","-jar","/app.jar"]
10 |
11 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/config/src/test/java/cn/lastwhisper/config/ConfigApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.config;
2 |
3 | import org.junit.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | public class ConfigApplicationTests {
8 |
9 | @Test
10 | public void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/eureka/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM hub.c.163.com/library/java:8-alpine
2 |
3 | MAINTAINER 15037584397@163.com
4 |
5 | ADD target/*.jar app.jar
6 |
7 | EXPOSE 8761
8 |
9 | ENTRYPOINT ["java","-jar","/app.jar"]
10 |
11 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/eureka/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8761
3 | spring:
4 | application:
5 | name: eureka
6 | eureka:
7 | client:
8 | service-url:
9 | defaultZone: http://localhost:8761/eureka/ #配置HA互相注册
10 | register-with-eureka: false
11 | #关闭eureka的自我保护功能
12 | server:
13 | enable-self-preservation: false
14 |
15 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/eureka/src/test/java/cn/lastwhisper/eureka/EurekaApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.eureka;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class EurekaApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/order-old/src/main/java/cn/lastwhisper/order/repository/OrderDetailRepository.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.order.repository;
2 |
3 | import cn.lastwhisper.order.domain.OrderDetail;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 |
6 | /**
7 | * @author lastwhisper
8 | */
9 | public interface OrderDetailRepository extends JpaRepository {
10 | }
11 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/order-old/src/main/java/cn/lastwhisper/order/repository/OrderMasterRepository.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.order.repository;
2 |
3 | import cn.lastwhisper.order.domain.OrderMaster;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 |
6 | /**
7 | *
8 | * @author lastwhisper
9 | * @date 2019/10/26
10 | */
11 | public interface OrderMasterRepository extends JpaRepository {
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/order-old/src/main/java/cn/lastwhisper/order/service/OrderService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.order.service;
2 |
3 | import cn.lastwhisper.order.dto.OrderDTO;
4 |
5 | /**
6 | *
7 | * @author lastwhisper
8 | * @date 2019/10/26
9 | */
10 | public interface OrderService {
11 |
12 | public OrderDTO create(OrderDTO orderDTO);
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/order-old/src/test/java/cn/lastwhisper/order/OrderApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.order;
2 |
3 | import org.junit.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | public class OrderApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/order/order-server/src/main/java/cn/lastwhisper/order/repository/OrderMasterRepository.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.order.repository;
2 |
3 | import cn.lastwhisper.order.domain.OrderMaster;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 |
6 | /**
7 | *
8 | * @author lastwhisper
9 | * @date 2019/10/26
10 | */
11 | public interface OrderMasterRepository extends JpaRepository {
12 | }
13 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/order/order-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "properties": [
3 | {
4 | "name": "hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds",
5 | "type": "java.lang.String",
6 | "description": "Description for hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds."
7 | }
8 | ] }
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/product-old/src/main/java/cn/lastwhisper/product/service/CategoryService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.product.service;
2 |
3 | import cn.lastwhisper.product.domain.ProductCategory;
4 |
5 | import java.util.List;
6 |
7 | public interface CategoryService {
8 |
9 | List findByCategoryTypeIn(List categoryTypeList);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/product/product-server/src/main/java/cn/lastwhisper/product/service/CategoryService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.product.service;
2 |
3 | import cn.lastwhisper.product.domain.ProductCategory;
4 |
5 | import java.util.List;
6 |
7 | public interface CategoryService {
8 |
9 | List findByCategoryTypeIn(List categoryTypeList);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/user/user-server/src/main/java/cn/lastwhisper/user/constant/CookieConstant.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.user.constant;
2 |
3 | /**
4 | * Created by 廖师兄
5 | * 2018-03-04 23:28
6 | */
7 | public interface CookieConstant {
8 |
9 | String TOKEN = "token";
10 |
11 | String OPENID = "openid";
12 |
13 | /**
14 | * 过期时间(单位:s)
15 | */
16 | Integer expire = 7200;
17 | }
18 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/user/user-server/src/main/java/cn/lastwhisper/user/constant/RedisConstant.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.user.constant;
2 |
3 | /**
4 | * Created by 廖师兄
5 | * 2018-03-04 23:37
6 | */
7 | public interface RedisConstant {
8 |
9 | String TOKEN_TEMPLATE = "token_%s";
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/user/user-server/src/main/java/cn/lastwhisper/user/service/UserService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.user.service;
2 |
3 | import cn.lastwhisper.user.domain.UserInfo;
4 |
5 | /**
6 | *
7 | * @author lastwhisper
8 | * @date 2019/11/3
9 | */
10 | public interface UserService {
11 |
12 | UserInfo findByOpenid(String openid);
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/distributed/springcloud-netflix/user/user-server/src/main/resources/bootstrap.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | application:
3 | name: user
4 | cloud:
5 | config:
6 | discovery:
7 | enabled: true
8 | service-id: CONFIG
9 | profile: dev
10 | eureka:
11 | client:
12 | service-url:
13 | defaultZone: http://localhost:8761/eureka/
--------------------------------------------------------------------------------
/distributed/transaction/README.md:
--------------------------------------------------------------------------------
1 | 分布式事务
2 |
3 | - demo :产生分布式事务的案例
4 | - seata-AT-demo:AT模式解决方案
5 |
6 |
--------------------------------------------------------------------------------
/distributed/transaction/demo/account-service/src/main/java/cn/itcast/account/service/AccountService.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.account.service;
2 |
3 | public interface AccountService {
4 | /**
5 | * 从用户账户中借出
6 | */
7 | void debit(String userId, int money);
8 | }
--------------------------------------------------------------------------------
/distributed/transaction/demo/eureka-server/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8761
3 | spring:
4 | application:
5 | name: eureka-server
6 | ribbon:
7 | eureka:
8 | enabled: true
9 | eureka:
10 | client:
11 | registerWithEureka: false
12 | fetchRegistry: false
13 | serviceUrl:
14 | defaultZone: http://localhost:${server.port}/eureka/
--------------------------------------------------------------------------------
/distributed/transaction/demo/order-service/src/main/java/cn/itcast/order/mapper/OrderMapper.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.order.mapper;
2 |
3 | import cn.itcast.order.entity.Order;
4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5 |
6 | /**
7 | * @author 虎哥
8 | */
9 | public interface OrderMapper extends BaseMapper {
10 | }
11 |
--------------------------------------------------------------------------------
/distributed/transaction/demo/order-service/src/main/java/cn/itcast/order/service/OrderService.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.order.service;
2 |
3 | import cn.itcast.order.entity.Order;
4 |
5 | public interface OrderService {
6 |
7 | /**
8 | * 创建订单
9 | */
10 | Long create(Order order);
11 | }
--------------------------------------------------------------------------------
/distributed/transaction/demo/storage-service/src/main/java/cn/itcast/storage/service/StorageService.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.storage.service;
2 |
3 | public interface StorageService{
4 |
5 | /**
6 | * 扣除存储数量
7 | */
8 | void deduct(String commodityCode, int count);
9 | }
--------------------------------------------------------------------------------
/distributed/transaction/seata-AT-demo/account-service/src/main/java/cn/itcast/account/service/AccountService.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.account.service;
2 |
3 | public interface AccountService {
4 | /**
5 | * 从用户账户中借出
6 | */
7 | void debit(String userId, int money);
8 | }
--------------------------------------------------------------------------------
/distributed/transaction/seata-AT-demo/eureka-server/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8761
3 | spring:
4 | application:
5 | name: eureka-server
6 | ribbon:
7 | eureka:
8 | enabled: true
9 | eureka:
10 | client:
11 | registerWithEureka: false
12 | fetchRegistry: false
13 | serviceUrl:
14 | defaultZone: http://localhost:${server.port}/eureka/
--------------------------------------------------------------------------------
/distributed/transaction/seata-AT-demo/order-service/src/main/java/cn/itcast/order/mapper/OrderMapper.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.order.mapper;
2 |
3 | import cn.itcast.order.entity.Order;
4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5 |
6 | /**
7 | * @author 虎哥
8 | */
9 | public interface OrderMapper extends BaseMapper {
10 | }
11 |
--------------------------------------------------------------------------------
/distributed/transaction/seata-AT-demo/order-service/src/main/java/cn/itcast/order/service/OrderService.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.order.service;
2 |
3 | import cn.itcast.order.entity.Order;
4 |
5 | public interface OrderService {
6 |
7 | /**
8 | * 创建订单
9 | */
10 | Long create(Order order);
11 | }
--------------------------------------------------------------------------------
/distributed/transaction/seata-AT-demo/storage-service/src/main/java/cn/itcast/storage/service/StorageService.java:
--------------------------------------------------------------------------------
1 | package cn.itcast.storage.service;
2 |
3 | public interface StorageService{
4 |
5 | /**
6 | * 扣除存储数量
7 | */
8 | void deduct(String commodityCode, int count);
9 | }
--------------------------------------------------------------------------------
/distributed/transaction/分布式事务.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/transaction/分布式事务.zip
--------------------------------------------------------------------------------
/framework/flyway/src/main/resources/db/migration/V1__Create_person_table.sql:
--------------------------------------------------------------------------------
1 | create table PERSON (
2 | ID int not null,
3 | NAME varchar(100) not null
4 | );
--------------------------------------------------------------------------------
/framework/flyway/src/main/resources/db/migration/V2__Add_people.sql:
--------------------------------------------------------------------------------
1 | insert into PERSON (ID, NAME) values (1, 'Axel');
2 | insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
3 | insert into PERSON (ID, NAME) values (3, 'Ms. Bar');
--------------------------------------------------------------------------------
/framework/hutool/src/main/java/cn/cunchang/IDUtilTest.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import cn.hutool.core.util.IdUtil;
4 |
5 | /**
6 | * @author cunchang
7 | * @date 2022/5/15 11:43 PM
8 | */
9 | public class IDUtilTest {
10 |
11 | public static void main(String[] args) {
12 | System.out.println(IdUtil.getSnowflakeNextId());
13 | // System.out.println(IdUtil.objectId());
14 |
15 |
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/framework/tika/src/main/java/cn/lastwhisper/TikaApplication.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class TikaApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(TikaApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/framework/tika/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/framework/tika/src/test/java/cn/lastwhisper/TikaApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class TikaApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 |
12 |
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/TikaApplication.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class TikaApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(TikaApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/mapreduce-osdi04.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/mapreduce-osdi04.pdf
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/office.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/office.xlsx
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/template.xls:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/template.xls
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/timg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/timg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg.gif
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/timg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg.jpg
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/timg.jpg.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg.jpg.zip
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/transportation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/transportation.png
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/测试.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/测试.docx
--------------------------------------------------------------------------------
/framework/tika/src/test/resources/测试.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/测试.xlsx
--------------------------------------------------------------------------------
/java-advance/annotation/PluggableAnnotationProcessingAPI/mylombok-test/src/main/java/cn/cunchang/Person.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | @MyGetter
4 | public class Person {
5 |
6 | private String name;
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/java-advance/annotation/PluggableAnnotationProcessingAPI/mylombok/src/main/resources/META-INF/services/javax.annotation.processing.Processor:
--------------------------------------------------------------------------------
1 | cn.cunchang.MyGetterProcessor
--------------------------------------------------------------------------------
/java-advance/annotation/README.md:
--------------------------------------------------------------------------------
1 | # annotation
2 |
3 | JSR 175: A Metadata Facility for the JavaTM Programming Language
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | # Pluggable Annotation Processing API
12 |
13 |
14 |
15 | JSR 269: Pluggable Annotation Processing API
16 |
17 | 参考:https://juejin.cn/post/6844904106545381384?utm_source=ZHShareTargetIDMore&utm_medium=social&utm_oi=825791253932290048#heading-16
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/java-advance/annotation/annatation/src/main/java/cn/cunchang/corejava/runtimeAnnotations/ActionListenerFor.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.corejava.runtimeAnnotations;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * @version 1.00 2004-08-17
7 | * @author Cay Horstmann
8 | */
9 |
10 | @Target(ElementType.METHOD)
11 | @Retention(RetentionPolicy.RUNTIME)
12 | public @interface ActionListenerFor
13 | {
14 | String source();
15 | }
16 |
--------------------------------------------------------------------------------
/java-advance/annotation/annatation/src/main/java/cn/cunchang/dynamicvalue/StudentRsp.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.dynamicvalue;
2 |
3 | /**
4 | * @author cunchang
5 | * @date 2021/4/19 8:02 下午
6 | */
7 | public class StudentRsp {
8 |
9 | /**
10 | * stable beisen_test_name
11 | * real beisen_pro_name
12 | */
13 | @JsonProperty("beisen_test_name")
14 | public String name;
15 |
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/java-advance/annotation/annatation/src/main/java/cn/cunchang/syntax/Level.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.syntax;
2 |
3 | public enum Level {BAD, INDIFFERENT, GOOD}
--------------------------------------------------------------------------------
/java-advance/annotation/annatation/src/main/java/cn/cunchang/syntax/MetaAnnotation.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.syntax;
2 |
3 | public @interface MetaAnnotation {
4 |
5 | String value() default "MetaAnnotation default value";
6 |
7 | }
--------------------------------------------------------------------------------
/java-advance/groovy/README.md:
--------------------------------------------------------------------------------
1 | groovy动态解析脚本
--------------------------------------------------------------------------------
/java-advance/proxy/com/sun/proxy/$Proxy0.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-advance/proxy/com/sun/proxy/$Proxy0.class
--------------------------------------------------------------------------------
/java-advance/proxy/jdk-proxy/README.md:
--------------------------------------------------------------------------------
1 |
2 | v1 jdk动态代理常规用法
3 | v1.equal jdk动态代理生成的类,等价调用
4 |
5 | v2 jdk动态代理接口
6 | v3 jdk动态代理无法代理抽象类
7 |
--------------------------------------------------------------------------------
/java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/Subject.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.v1;
2 |
3 | public interface Subject { // 定义代理接口
4 | String sayHello();
5 | }
6 |
--------------------------------------------------------------------------------
/java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/SubjectImpl.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.v1;
2 |
3 | public class SubjectImpl implements Subject { // 定义代理接口实现类
4 | @Override
5 | public String sayHello() {
6 | System.out.println(" Hello World");
7 | return "success";
8 | }
9 | }
--------------------------------------------------------------------------------
/java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/equal/Subject.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.v1.equal;
2 |
3 | public interface Subject { // 定义代理接口
4 | String sayHello();
5 | }
6 |
--------------------------------------------------------------------------------
/java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/equal/SubjectImpl.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.v1.equal;
2 |
3 | public class SubjectImpl implements Subject { // 定义代理接口实现类
4 | @Override
5 | public String sayHello() {
6 | System.out.println(" Hello World");
7 | return "success";
8 | }
9 | }
--------------------------------------------------------------------------------
/java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v2/Subject.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.v2;
2 |
3 | public interface Subject {
4 | String sayHello();
5 | }
6 |
7 |
--------------------------------------------------------------------------------
/java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v3/AbstractProxy.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.v3;
2 |
3 | public abstract class AbstractProxy {
4 | abstract void sayHello();
5 | }
6 |
--------------------------------------------------------------------------------
/java-advance/proxy/mybatis-mapper/src/main/java/cn/cunchang/SqlSession.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * @author cunchang
7 | * @date 2021/11/25 12:46 上午
8 | */
9 | public interface SqlSession {
10 |
11 | List selectList(String statementId);
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/java-advance/proxy/mybatis-mapper/src/main/java/cn/cunchang/SysUser.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | /**
4 | * @author cunchang
5 | * @date 2021/11/25 12:48 上午
6 | */
7 | public class SysUser {
8 | }
9 |
--------------------------------------------------------------------------------
/java-advance/proxy/mybatis-mapper/src/main/java/cn/cunchang/UserMapper.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import java.util.List;
4 |
5 | public interface UserMapper{
6 | List selectAll();
7 | }
--------------------------------------------------------------------------------
/java-advance/proxy/src/main/java/cn/cunchang/Moveable.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | /**
4 | * @author cunchang
5 | * @date 2021/5/9 9:57 上午
6 | */
7 | public interface Moveable {
8 | void move();
9 | // void stop();
10 | }
11 |
--------------------------------------------------------------------------------
/java-advance/proxy/src/main/java/cn/cunchang/myjdkdynamic/InvocationHandler.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.myjdkdynamic;
2 |
3 | import java.lang.reflect.Method;
4 | public interface InvocationHandler {
5 |
6 | /**
7 | * 代理执行的逻辑
8 | * @param o 代理类
9 | * @param m 要执行的方法
10 | */
11 | public void invoke(Object o,Method m);
12 | }
--------------------------------------------------------------------------------
/java-advance/proxy/src/main/java/cn/cunchang/staticproxy/inherit/TankLogTimeProxy.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.staticproxy.inherit;
2 |
3 | public class TankLogTimeProxy extends TankTimeProxy {
4 |
5 | @Override
6 | public void move() {
7 | //记录日志
8 | System.out.println("Tank start....");
9 | super.move();
10 | System.out.println("Tank end....");
11 | }
12 |
13 |
14 | }
--------------------------------------------------------------------------------
/java-advance/spi/spi-mysql/src/main/resources/META-INF/services/cn.jdbc.Driver:
--------------------------------------------------------------------------------
1 | cn.mysql.MysqlDriver
--------------------------------------------------------------------------------
/java-advance/spi/spi-oracle/src/main/resources/META-INF/services/cn.jdbc.Driver:
--------------------------------------------------------------------------------
1 | cn.oracle.OracleDriver
--------------------------------------------------------------------------------
/java-advance/spi/web-client/src/main/resources/META-INF/services/cn.jdbc.Driver:
--------------------------------------------------------------------------------
1 | #cn.mysql.MysqlDriver
--------------------------------------------------------------------------------
/java-basic/README.MD:
--------------------------------------------------------------------------------
1 | java基础学习
2 | 1. jdk特性
3 | 2. jvm代码
4 | 3. 并发
5 | 4. 设计模式
--------------------------------------------------------------------------------
/java-basic/basic/src/main/java/cn/cunchang/README.md:
--------------------------------------------------------------------------------
1 |
2 | - collection 集合相关操作
3 | - cpu 控制cpu的利用率
4 | - decimal decimal相关操作
5 | - packagesacn 扫包
6 | - regex 正则表达式
7 | - sugar java语法糖
8 | - sysproperty 系统变量
9 | - trycatch trycatch相关操作
--------------------------------------------------------------------------------
/java-basic/basic/src/main/java/cn/cunchang/collection/README.md:
--------------------------------------------------------------------------------
1 |
2 | - Arrays https://blog.csdn.net/AlbenXie/article/details/103051176
3 |
4 |
--------------------------------------------------------------------------------
/java-basic/basic/src/main/java/cn/cunchang/hutool/IDUtilTest.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.hutool;
2 |
3 | import cn.hutool.core.util.IdUtil;
4 |
5 | /**
6 | * @author cunchang
7 | * @date 2022/5/15 11:43 PM
8 | */
9 | public class IDUtilTest {
10 |
11 | public static void main(String[] args) {
12 | System.out.println(IdUtil.getSnowflakeNextId());
13 | // System.out.println(IdUtil.objectId());
14 |
15 |
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-basic/basic/src/main/java/cn/cunchang/packagesacn/PackageScanner.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.packagesacn;
2 |
3 | import java.io.IOException;
4 | import java.util.List;
5 |
6 | public interface PackageScanner {
7 |
8 | List getFullyQualifiedClassNameList() throws IOException;
9 |
10 | }
--------------------------------------------------------------------------------
/java-basic/basic/src/main/java/cn/cunchang/sugar/type/A.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.sugar.type;
2 |
3 | // A.jar
4 | //A.java有类A,A调了B的方法add(int i),这时传的是个原始类型, 完美匹配
5 | public class A {
6 | public static void main(String[] args) {
7 | // add(int i) ,1不会进行拆装箱
8 | // add(Integer i),1会进行拆装箱
9 | B.add(1);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/basic/src/main/java/cn/cunchang/sugar/type/B.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.sugar.type;
2 |
3 | // B.jar
4 | //B.java
5 | public class B {
6 | // public static void add(int i) {
7 | // System.out.println(i);
8 | // }
9 |
10 | public static void add(Integer i) {
11 | System.out.println(i);
12 | }
13 | }
--------------------------------------------------------------------------------
/java-basic/basic/src/main/java/cn/cunchang/sugar/type/README.md:
--------------------------------------------------------------------------------
1 |
2 | 自动拆装箱的坑
3 |
4 | Java自动拆装箱为什么不起作用了 - 鸿缘的文章 - 知乎
5 | https://zhuanlan.zhihu.com/p/26650204
6 |
7 |
--------------------------------------------------------------------------------
/java-basic/concurrent/README.md:
--------------------------------------------------------------------------------
1 | 1. jmm-specification
2 | 2. thread-syncronized
3 | 3. thread-current
4 | 4.
--------------------------------------------------------------------------------
/java-basic/concurrent/jmm-specification/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | AsIfSerialSample AsIfSerial语义
4 | Jmm01_HappensBefore HappensBefore
5 | Jmm05_CodeReorder 指令重排序
6 | Jmm06_MemoryBarrier 内存屏障
7 |
8 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/UncaughtExceptionHandler/README.md:
--------------------------------------------------------------------------------
1 |
2 | JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止
3 | https://blog.csdn.net/u013256816/article/details/50417822
4 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/UncaughtExceptionHandler/Task.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.concurrent.UncaughtExceptionHandler;
2 |
3 | public class Task implements Runnable {
4 | @Override
5 | public void run() {
6 | System.out.println(3 / 2);
7 | System.out.println(3 / 0);
8 | System.out.println(3 / 1);
9 | }
10 | }
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/README.md:
--------------------------------------------------------------------------------
1 | # basic
2 | 1. communicate ;线程通信相关
3 | 2. createthread;线程创建相关
4 | 3. Interrupted ;线程中断相关
5 | 4. state ;线程状态相关
6 | 5. syncronized ;线程锁、锁升级相关
7 | 6. threadlocal ;
8 | 7. DeadLockDemo;死锁 demo
9 | 8. Daemon;守护线程
10 | 9. Deprecated;线程暂停、恢复和停止对应线程Thread的API就是suspend()、resume()和stop(),这些方法已经被废弃
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/SleepUtils.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.concurrent.basic;
2 |
3 | import java.util.concurrent.TimeUnit;
4 |
5 | public class SleepUtils {
6 | public static void second(long seconds) {
7 | try {
8 | TimeUnit.SECONDS.sleep(seconds);
9 | } catch (InterruptedException e) {
10 | e.printStackTrace();
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/communicate/README.md:
--------------------------------------------------------------------------------
1 | # 线程间通信
2 | 1. WaitNotify
3 | 2. Join
4 | 3. Piped;管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要
5 | 用于线程之间的数据传输,而传输的媒介为内存。
6 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/synchronized1/README.md:
--------------------------------------------------------------------------------
1 | # synchronize原理
2 |
3 | 使用jol-core
4 |
5 | 1. T0_ObjectSize;无锁、可偏向锁
6 | 2. T0_BasicLock;偏向锁-》轻量级锁
7 | 3. T0_heavyWeightMonitor;自旋锁后未获得到锁,升级重量级锁,
8 | 4. Juc_PrintMarkWord;对象处在偏向锁,调用hashcode,会升级为轻量级锁,因为偏向锁无法记录hashcode。
9 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/threadlocal/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1. ThreadLocalDemo;的用法
4 | 2. ThreadLocalDemo2;一个线程多个local
5 | 3. InheritableThreadLocalDemo;InheritableThreadLocal解决父子线程local传递问题
6 | 4. InheritableThreadLocalDemo2;InheritableThreadLocal在线程池中的窘境
7 | 5. AlibabaThreadLocalDemo;通过修饰runnable解决InheritableThreadLocal的问题
8 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/example/README.md:
--------------------------------------------------------------------------------
1 | # 线程的一些案例
2 | 1. future;手写future
3 | 2. alternate;线程交替打印ABCABC
4 | 3. productconsumer;生产者消费者
5 |
6 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/example/future/Data.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.concurrent.example.future;
2 |
3 | //公共data数据接口
4 | public abstract class Data {
5 | //方法作用 返回线程执行结果
6 | public abstract String getRequest();
7 | }
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/example/future/README.md:
--------------------------------------------------------------------------------
1 | 手写future
2 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/README.md:
--------------------------------------------------------------------------------
1 | # locks 锁相关
2 | # aqs aqs相关
3 | # tools
4 | # executor
5 | # blockingqueue
6 | # lockfree 无锁
7 |
8 |
9 | locksupport waiting当前线程
10 | future 获取异步执行的结果
11 | completefuture 获取异步执行的结果
12 |
13 |
14 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/aqs/README.md:
--------------------------------------------------------------------------------
1 | 1. ThreadNoSafe 线程不安全
2 | 2. ThreadSafe 通过互斥保证线程安全
3 | 3. mylock1 手动实现Lock,通过synchronized和wait、notify
4 | 4. mylock2 手动实现Lock,通过aqs
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/completefuture/README.md:
--------------------------------------------------------------------------------
1 |
2 | 脱离线程池使用
3 | CFutureMain1 手动设置future完成状态
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/executor/README.md:
--------------------------------------------------------------------------------
1 |
2 | 1. RejectedExecutionHandlerTest;线程池拒绝策略
3 | 2. ScheduledExecutorTest;调度线程池
4 | 3. ThreadPoolIdTest;验证线程池的线程复用
5 | 4. ThreadPoolExceptionTest;线程池execute执行异常,线程会不断创建
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/executor/trace/DivTask.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.concurrent.juc.executor.trace;
2 |
3 | public class DivTask implements Runnable {
4 | int a,b;
5 | public DivTask(int a,int b){
6 | this.a=a;
7 | this.b=b;
8 | }
9 | @Override
10 | public void run() {
11 | double re=a/b;
12 | System.out.println(re);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/executor/trace/README.md:
--------------------------------------------------------------------------------
1 | CatchException;线程池如何处理异常
2 | TraceMain;包装线程池异常
3 |
4 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/locksupport/README.md:
--------------------------------------------------------------------------------
1 | ## 一、线程阻塞唤醒
2 | 方式1: 使用Object中的wait()方法让线程等待, 使用Object中的notify()方法唤醒线程
3 | 方式2: 使用JUC包中Condition的await()方法让线程等待,使用signal()方法唤醒线程
4 | 方式3: LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程
5 |
6 | ## 二、优缺点
7 | 传统的synchronized和Lock实现等待唤醒通知的约束
8 | 1. 线程先要获得并持有锁,必须在锁块(synchronized或lock)中
9 | 2. 必须要先等待后唤醒,线程才能够被唤醒
10 |
11 |
12 |
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/tools/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/tools/README.md
--------------------------------------------------------------------------------
/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/unsafe/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 为什么JUC中大量使用了sun.misc.Unsafe 这个类,但官方却不建议开发者使用? - 落白的回答 - 知乎
6 | https://www.zhihu.com/question/29266773/answer/2461567743
7 |
8 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/advance/decorator_vs_proxy/Boxer.java:
--------------------------------------------------------------------------------
1 | package com.desgin.advance.decorator_vs_proxy;
2 |
3 | /**
4 | * 拳击手
5 | * @author lastwhisper
6 | * @date 2020/4/12
7 | */
8 | public interface Boxer {
9 |
10 | // 打拳
11 | void fight();
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/advance/decorator_vs_proxy/README.md:
--------------------------------------------------------------------------------
1 | decorator_proxy为装饰者模式与代理模式的对比
2 | https://www.zhihu.com/question/41988550/answer/462204684
3 | 拳击手、经纪人、移速鞋
4 |
5 |
6 |
7 | 看过钢铁侠没?
8 | 史塔克穿反浩克战甲(装饰模式)
9 | 但是史塔克没能力自己穿,只能让贾维斯帮自己从太空上叫下来(代理模式)
10 | 贾维斯只有一个(代理模式不会无限代理)
11 | mark装甲有无数个(装饰模式可以无限增强)
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/README.md:
--------------------------------------------------------------------------------
1 |
2 | 责任链实现
3 | v1:多个过滤器逻辑写在一起
4 | 问题:如何支持可配置化拦截器?
5 | v2:各个过滤器责任单一
6 | 问题:如何支持可配置化拦截器?
7 | v3:通过一个上下文类,支持配置化
8 | v4:
9 | v4、v5:本质上差不多,但是v5通过模板方法,固定调用了流程,降低了使用门槛
10 |
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v2/FaceFilter.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v2;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class FaceFilter implements Filter {
7 | // process the face tag <>
8 | @Override
9 | public String doFilter(String str) {
10 | return str.replaceAll("QAQ", "^V^");
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v2/Filter.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v2;
2 |
3 | public interface Filter {
4 | String doFilter(String str);
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v3/Filter.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v3;
2 |
3 | public interface Filter {
4 | String doFilter(String str);
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v4/Filter.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v4;
2 |
3 | public interface Filter {
4 | void doFilter(Request request, Response response, FilterChain chain);
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v5/Filter.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v5;
2 |
3 | public interface Filter {
4 | /**
5 | * 责任链
6 | * @param request
7 | * @param response
8 | * @param chain
9 | */
10 | void doFilter(Request request, Response response, FilterChain chain);
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/command/Command.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.command;
2 |
3 | public abstract class Command {
4 | public abstract void execute();
5 | public abstract void unDo();
6 | }
7 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/command/HugCommand.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.command;
2 |
3 | public class HugCommand extends Command {
4 |
5 | @Override
6 | public void execute() {
7 | System.out.println("hug");
8 | }
9 |
10 | @Override
11 | public void unDo() {
12 | System.out.println("open your arms");
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/command/ShoppingCommand.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.command;
2 |
3 | public class ShoppingCommand extends Command {
4 |
5 | @Override
6 | public void execute() {
7 | System.out.println("zoo");
8 | }
9 |
10 | @Override
11 | public void unDo() {
12 | System.out.println("undo zoo");
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/iterator/Cat.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.iterator;
2 |
3 | public class Cat {
4 | public Cat(int id) {
5 | super();
6 | this.id = id;
7 | }
8 |
9 | private int id;
10 |
11 | @Override
12 | public String toString() {
13 | return "cat:" + id;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/iterator/Collection.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.iterator;
2 |
3 | public interface Collection {
4 | void add(Object o);
5 | int size();
6 | Iterator iterator();
7 | }
8 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/iterator/Iterator.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.iterator;
2 |
3 | public interface Iterator {
4 | Object next();
5 | boolean hasNext();
6 | }
7 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/strategy/Comparable.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.strategy;
2 |
3 | //使一个类本身具备比较性
4 | //优点:实现此接口的类可以自己重写自己规定比较的内容
5 | //缺点:因为只有一个方法,一个类只能有一种方式进行比较
6 | public interface Comparable {
7 | public int compareTo(T o);
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/mashibing/strategy/Comparator.java:
--------------------------------------------------------------------------------
1 | package com.desgin.mashibing.strategy;
2 |
3 | public interface Comparator {
4 | int compare(Object o1, Object o2);
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/chainofresponsibility/README.md:
--------------------------------------------------------------------------------
1 | 请查看 design-pattern 项目 com/desgin/mashibing/chainofresponsibility 包
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/command/Command.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.command;
2 |
3 | /**
4 | * 抽象命令类:抽象的命令,可以根据不同类型的命令写出不同的实现
5 | */
6 | public interface Command {
7 | void execute();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/DivNode.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.interpreter;
2 |
3 | public class DivNode extends SymbolNode {
4 | public DivNode(Node left, Node right) {
5 | super(left, right);
6 | }
7 |
8 | @Override
9 | public int interpret() {
10 | return super.left.interpret() / super.right.interpret();
11 | }
12 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/ModNode.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.interpreter;
2 |
3 | public class ModNode extends SymbolNode {
4 | public ModNode(Node left, Node right) {
5 | super(left, right);
6 | }
7 |
8 | @Override
9 | public int interpret() {
10 | return super.left.interpret() % super.right.interpret();
11 | }
12 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/MulNode.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.interpreter;
2 |
3 | public class MulNode extends SymbolNode {
4 | public MulNode(Node left, Node right) {
5 | super(left, right);
6 | }
7 |
8 | @Override
9 | public int interpret() {
10 | return left.interpret() * right.interpret();
11 | }
12 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/Node.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.interpreter;
2 |
3 | public interface Node {
4 | public int interpret();
5 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/SymbolNode.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.interpreter;
2 |
3 | public abstract class SymbolNode implements Node {
4 | protected Node left;
5 | protected Node right;
6 |
7 | public SymbolNode(Node left, Node right) {
8 | this.left = left;
9 | this.right = right;
10 | }
11 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/ValueNode.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.interpreter;
2 |
3 | public class ValueNode implements Node
4 | {
5 | private int value;
6 |
7 | public ValueNode(int value)
8 | {
9 | this.value=value;
10 | }
11 |
12 | @Override
13 | public int interpret()
14 | {
15 | return this.value;
16 | }
17 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/iterator/Course.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.iterator;
2 |
3 | public class Course {
4 | private String name;
5 |
6 | public Course(String name) {
7 | this.name = name;
8 | }
9 |
10 | public String getName() {
11 | return name;
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/iterator/CourseAggregate.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.iterator;
2 |
3 | public interface CourseAggregate {
4 |
5 | void addCourse(Course course);
6 | void removeCourse(Course course);
7 | /**获取迭代器 */
8 | CourseIterator getCourseIterator();
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/iterator/CourseIterator.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.iterator;
2 |
3 | public interface CourseIterator {
4 | Course nextCourse();
5 |
6 | boolean isLastCourse();
7 | }
8 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/StudyGroup.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.mediator;
2 |
3 | import java.util.Date;
4 |
5 | public class StudyGroup {
6 | public static void showMessage(User user, String message) {
7 | System.out.println(new Date().toString()+"["+user.getName()+"]:"+message);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/Test.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.mediator;
2 |
3 | public class Test {
4 | public static void main(String[] args) {
5 | User tom = new User("ldc");
6 | User jack = new User("ghl");
7 |
8 | tom.sendMessage("hey!jack");
9 | jack.sendMessage("hey!tom");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/my/Mediator.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.mediator.my;
2 |
3 | public abstract class Mediator {
4 | //申明一个联络方法
5 | public abstract void constact(String message, Person person);
6 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/my/Person.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.mediator.my;
2 |
3 | public abstract class Person {
4 | protected String name;
5 | protected Mediator mediator;
6 |
7 | Person(String name,Mediator mediator){
8 | this.name = name;
9 | this.mediator = mediator;
10 | }
11 |
12 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/memento/my/Caretaker.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.memento.my;
2 |
3 | public class Caretaker {
4 | Memento memento;
5 |
6 | public Memento getMemento() {
7 | return memento;
8 | }
9 |
10 | public void setMemento(Memento memento) {
11 | this.memento = memento;
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/observer/guavatest/GuavaEvent.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.observer.guavatest;
2 |
3 | import com.google.common.eventbus.Subscribe;
4 |
5 | /**
6 | * Create by lastwhisper on 2019/2/11
7 | */
8 | public class GuavaEvent {
9 | @Subscribe
10 | public void subscribe(String str) {
11 | System.out.println("执行subscribe方法,传入:" + str);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/observer/my/Observer.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.observer.my;
2 |
3 | /***
4 | * 抽象观察者
5 | * 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
6 | * @author lastwhisper
7 | *
8 | */
9 | public interface Observer {
10 | /**
11 | * 观察者接收通知
12 | * @param message
13 | */
14 | void update(String message);
15 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/EmptyPromotionStrategy.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.strategy;
2 |
3 | public class EmptyPromotionStrategy implements PromotionStrategy {
4 | @Override
5 | public void doPromotion() {
6 | System.out.println("无促销");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/FanXianPromotionStrategy.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.strategy;
2 |
3 | public class FanXianPromotionStrategy implements PromotionStrategy {
4 |
5 | @Override
6 | public void doPromotion() {
7 | System.out.println("反现促销,返回的金额存放到网站用户的余额中");
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/LiJianPromotionStrategy.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.strategy;
2 |
3 | public class LiJianPromotionStrategy implements PromotionStrategy{
4 | @Override
5 | public void doPromotion() {
6 | System.out.println("立减促销,课程的价格直接减去配置的价格");
7 | }
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/ManJianPromotionStrategy.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.strategy;
2 |
3 | public class ManJianPromotionStrategy implements PromotionStrategy{
4 |
5 | @Override
6 | public void doPromotion() {
7 | System.out.println("满减促销,满200减20元");
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/PromotionStrategy.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.strategy;
2 |
3 | public interface PromotionStrategy {
4 | void doPromotion();
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/templatemethod/DesignPatternCourse.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.templatemethod;
2 |
3 | public class DesignPatternCourse extends ACourse {
4 | @Override
5 | void packageCourse() {
6 | System.out.println("提供课程Java源代码");
7 | }
8 |
9 | @Override
10 | protected boolean needWriteArticle() {
11 | return true;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/visitor/FreeCourse.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.visitor;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/2/11
5 | */
6 | public class FreeCourse extends Course {
7 | @Override
8 | public void accept(IVisitor visitor) {
9 | visitor.visit(this);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/visitor/IVisitor.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.behavioral.visitor;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/2/11
5 | */
6 | public interface IVisitor {
7 | void visit(FreeCourse freeCourse);
8 |
9 | void visit(CodingCourse codingCourse);
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/Article.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.abstractfactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public abstract class Article {
7 | public abstract void produce();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/CourseFactory.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.abstractfactory;
2 |
3 |
4 |
5 | /**
6 | * Create by lastwhisper on 2019/1/24
7 | */
8 | public interface CourseFactory {
9 | Video getVideo();
10 | Article getArticle();
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/JavaArticle.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.abstractfactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class JavaArticle extends Article {
7 | @Override
8 | public void produce() {
9 | System.out.println("编写Java课程手记");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/JavaVideo.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.abstractfactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class JavaVideo extends Video {
7 | @Override
8 | public void produce() {
9 | System.out.println("录制Java课程视频");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/PythonArticle.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.abstractfactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class PythonArticle extends Article {
7 | @Override
8 | public void produce() {
9 | System.out.println("编写Python课程手记");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/PythonVideo.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.abstractfactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class PythonVideo extends Video {
7 | @Override
8 | public void produce() {
9 | System.out.println("录制python课程视频 ");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/Video.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.abstractfactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public abstract class Video {
7 | public abstract void produce();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/FEVideo.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class FEVideo extends Video {
7 | @Override
8 | public void produce() {
9 | System.out.println("录制前端课程视频");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/FEVideoFactory.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class FEVideoFactory extends VideoFactory {
7 | public Video getVideo() {
8 | return new FEVideo();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/JavaVideo.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public class JavaVideo extends Video {
7 | @Override
8 | public void produce() {
9 | System.out.println("录制java课程");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/JavaVideoFactory.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class JavaVideoFactory extends VideoFactory {
7 | public Video getVideo() {
8 | return new JavaVideo();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/PythonVideo.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public class PythonVideo extends Video {
7 | @Override
8 | public void produce() {
9 | System.out.println("录制python课程");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/PythonVideoFactory.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/24
5 | */
6 | public class PythonVideoFactory extends VideoFactory {
7 | public Video getVideo() {
8 | return new PythonVideo();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/Video.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public abstract class Video {
7 | public abstract void produce();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/VideoFactory.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.factorymethod;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public abstract class VideoFactory {
7 |
8 | public abstract Video getVideo();
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/prototype/abstractprototype/A.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.prototype.abstractprototype;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/27
5 | */
6 | public abstract class A implements Cloneable{
7 | @Override
8 | protected Object clone() throws CloneNotSupportedException {
9 | return super.clone();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/prototype/abstractprototype/B.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.prototype.abstractprototype;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/27
5 | */
6 | public class B extends A{
7 | public static void main(String[] args) throws CloneNotSupportedException {
8 | B b = new B();
9 | b.clone();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/JavaVideo.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.simplefactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public class JavaVideo extends Video{
7 | @Override
8 | public void produce() {
9 | System.out.println("录制java课程");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/PythonVideo.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.simplefactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public class PythonVideo extends Video {
7 | @Override
8 | public void produce() {
9 | System.out.println("录制python课程");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/Test.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.simplefactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public class Test {
7 | public static void main(String[] args) {
8 | Video video = VideoFactory.getVideo(JavaVideo.class);
9 | video.produce();
10 |
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/Video.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.simplefactory;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/23
5 | */
6 | public abstract class Video {
7 | public abstract void produce();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/singleton/CASSingletonTest.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.singleton;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class CASSingletonTest {
7 | public static void main(String[] args){
8 | //Thread t1 = new Thread(new T());
9 | //Thread t2 = new Thread(new T());
10 | //t1.start();
11 | //t2.start();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/singleton/my/Singleton5.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.creational.singleton.my;
2 |
3 | /**
4 | * 懒汉式:枚举
5 | */
6 | public enum Singleton5 {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/Adaptee.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.classadapter;
2 |
3 | public class Adaptee {
4 | public void adapteeRequest() {
5 | System.out.println("被适配者的方法");
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/Adapter.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.classadapter;
2 |
3 | public class Adapter extends Adaptee implements Target {
4 | @Override
5 | public void request() {
6 | super.adapteeRequest();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/ConcreteTarget.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.classadapter;
2 |
3 | /**
4 | * 具体的实现类
5 | */
6 | public class ConcreteTarget implements Target {
7 | @Override
8 | public void request() {
9 | System.out.println("ConcreteTarget目标方法");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/Target.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.classadapter;
2 |
3 | public interface Target {
4 | void request();
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/exmaple/AC220.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.exmaple;
2 |
3 | public class AC220 {
4 | public int outputAC220V() {
5 | int output = 220;
6 | System.out.println("输出220V的交流电"+output+"V");
7 | return output;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/exmaple/DC5.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.exmaple;
2 |
3 | public interface DC5 {
4 | int outputDC5V();
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/exmaple/Test.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.exmaple;
2 |
3 | public class Test {
4 | public static void main(String[]args){
5 | DC5 dc5 = new PowerAdapter();
6 | dc5.outputDC5V();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/Adaptee.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.objectadapter;
2 |
3 | public class Adaptee {
4 | public void adapteeRequest() {
5 | System.out.println("被适配者的方法");
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/Adapter.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.objectadapter;
2 |
3 | public class Adapter implements Target {
4 |
5 | private Adaptee adaptee = new Adaptee();
6 |
7 | @Override
8 | public void request() {
9 | adaptee.adapteeRequest();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/ConcreteTarget.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.objectadapter;
2 |
3 | /**
4 | * 具体的实现类
5 | */
6 | public class ConcreteTarget implements Target {
7 | @Override
8 | public void request() {
9 | System.out.println("ConcreteTarget目标方法");
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/Target.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.adapter.objectadapter;
2 |
3 | public interface Target {
4 | void request();
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/bridge/Account.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.bridge;
2 |
3 | public interface Account {
4 | /**
5 | * 打开我们的账号,打开账号,就要返回账号
6 | */
7 | Account openAccount();
8 |
9 | /**
10 | * 打开我们的账号,查看为什么账户类型,是定期类型还是活期类型
11 | */
12 | void showAccountType();
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v1/Battercake.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.decorator.v1;
2 |
3 | /**
4 | * @author Administrator
5 | */
6 | public class Battercake {
7 | protected String getDesc() {
8 | return "煎饼";
9 | }
10 |
11 | protected int cost() {
12 | return 8;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v1/BattercakeWithEgg.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.decorator.v1;
2 |
3 | public class BattercakeWithEgg extends Battercake {
4 | @Override
5 | public String getDesc() {
6 | return super.getDesc() + "加一个鸡蛋";
7 | }
8 |
9 | @Override
10 | public int cost() {
11 | return super.cost() + 1;
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v1/BattercakeWithEggSausage.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.decorator.v1;
2 |
3 | public class BattercakeWithEggSausage extends BattercakeWithEgg {
4 | @Override
5 | public String getDesc() {
6 | return super.getDesc() + "一个香肠";
7 | }
8 |
9 | @Override
10 | public int cost() {
11 | return super.cost() + 2;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v2/ABattercake.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.decorator.v2;
2 |
3 | public abstract class ABattercake {
4 | protected abstract String getDesc();
5 |
6 | protected abstract int cost();
7 | }
8 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v2/Battercake.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.decorator.v2;
2 |
3 | public class Battercake extends ABattercake {
4 | @Override
5 | protected String getDesc() {
6 | return "煎饼";
7 | }
8 |
9 | @Override
10 | protected int cost() {
11 | return 8;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/PointsGift.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.facade;
2 |
3 | /**
4 | * 积分礼物
5 | */
6 | public class PointsGift {
7 | private String name;
8 |
9 | public PointsGift(String name) {
10 | this.name = name;
11 | }
12 |
13 | public String getName() {
14 | return name;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/PointsPaymentService.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.facade;
2 |
3 | public class PointsPaymentService {
4 | public boolean pay(PointsGift pointsGift) {
5 | /** 扣减积分 */
6 | System.out.println("支付" + pointsGift.getName() + " 积分成功");
7 | return true;
8 | }
9 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/QualifyService.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.facade;
2 |
3 | public class QualifyService {
4 | public boolean isAvailable(PointsGift pointsGift) {
5 | System.out.println("校验" + pointsGift.getName() + "积分资格通过,库存通过");
6 | return true;
7 | }
8 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/ShippingService.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.facade;
2 |
3 | public class ShippingService {
4 | public String shipGift(PointsGift pointsGift) {
5 | /** 物流系统对接逻辑 */
6 | System.out.println(pointsGift.getName() + "进入物流系统");
7 | String shippingOrderNo = "666";
8 | return shippingOrderNo;
9 | }
10 | }
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/Test.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.facade;
2 |
3 | public class Test {
4 | public static void main(String[] args) {
5 | PointsGift pointsGift = new PointsGift("T恤");
6 | GiftExchangeService giftExchangeService = new GiftExchangeService();
7 | giftExchangeService.giftExchange(pointsGift);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/flyweight/Employee.java:
--------------------------------------------------------------------------------
1 | package com.desgin.pattern.structural.flyweight;
2 |
3 | public interface Employee {
4 | void report();
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/proxy/README.md:
--------------------------------------------------------------------------------
1 | 移至 java-advance/proxy 目录
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/demeter/Boss.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.demeter;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | /**
7 | * Create by lastwhisper on 2019/1/22
8 | */
9 | public class Boss {
10 | public void commandCheckNumber(TeamLeader teamLeader) {
11 | teamLeader.checkNumberOfCourse();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/demeter/Course.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.demeter;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public class Course {
7 | }
8 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/demeter/Test.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.demeter;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public class Test {
7 | public static void main(String[] args){
8 | Boss boss = new Boss();
9 | TeamLeader teamLeader = new TeamLeader();
10 | boss.commandCheckNumber(teamLeader);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Bottom.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v1;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Bottom {
7 | private Tire tire;
8 |
9 | public Bottom() {
10 | this.tire = new Tire();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Car.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v1;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Car {
7 | private Framework framework;
8 |
9 | public Car() {
10 | this.framework = new Framework();
11 | }
12 |
13 | public void run() {
14 | System.out.println("汽车跑起来了");
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Client.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v1;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Client {
7 | public static void main(String[] args){
8 | // 改动一下轮胎(Tire)类,把它的尺寸变成动态,比较麻烦
9 | // 需要修改源代码
10 | Car car = new Car();
11 | car.run();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Framework.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v1;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Framework {
7 | private Bottom bottom;
8 |
9 | public Framework() {
10 | this.bottom = new Bottom();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Tire.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v1;
2 |
3 | /**
4 | * 先设计tire
5 | * @author lastwhisper
6 | */
7 | public class Tire {
8 | private int size;
9 |
10 | public Tire() {
11 | this.size = 30;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Bottom.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v2;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Bottom {
7 | private Tire tire;
8 |
9 | public Bottom(Tire tire) {
10 | this.tire = tire;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Car.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v2;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Car {
7 | private Framework framework;
8 |
9 | public Car(Framework framework) {
10 | this.framework = framework;
11 | }
12 |
13 | public void run() {
14 | System.out.println("汽车跑起来了");
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Framework.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v2;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Framework {
7 | private Bottom bottom;
8 |
9 | public Framework(Bottom bottom) {
10 | this.bottom = bottom;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Tire.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.dependencyInversion.v2;
2 |
3 | /**
4 | * 先设计tire
5 | * @author lastwhisper
6 | */
7 | public class Tire {
8 | private int size;
9 |
10 | public Tire(int size) {
11 | this.size = size;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/Dog.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.interfacesegregation;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public class Dog implements IEatAnimalAction,ISwimAnimalAction {
7 |
8 |
9 | @Override
10 | public void eat() {
11 |
12 | }
13 |
14 | @Override
15 | public void swim() {
16 |
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/IAnimalAction.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.interfacesegregation;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface IAnimalAction {
7 | void eat();
8 | void fly();
9 | void swim();
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/IEatAnimalAction.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.interfacesegregation;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface IEatAnimalAction {
7 | void eat();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/IFlyAnimalAction.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.interfacesegregation;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface IFlyAnimalAction {
7 | void fly();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/ISwimAnimalAction.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.interfacesegregation;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface ISwimAnimalAction {
7 | void swim();
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/openclose/ICourse.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.openclose;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface ICourse {
7 | Integer getId();
8 | String getName();
9 | Double getPrice();
10 | //Double getDiscountPrice();
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/FlyBird.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.singleresponsibility;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | /**
7 | * Create by lastwhisper on 2019/1/22
8 | */
9 | public class FlyBird {
10 | public void mainMoveMode(String birdName) {
11 | System.out.println(birdName + "用翅膀飞");
12 | Map map = new HashMap();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/ICourse.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.singleresponsibility;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface ICourse {
7 | String getCourseName();
8 |
9 | byte[] getCourseVideo();
10 |
11 | void studyCourse();
12 |
13 | void refundCourse();
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/ICourseContent.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.singleresponsibility;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface ICourseContent {
7 | String getCourseName();
8 |
9 | byte[] getCourseVideo();
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/ICourseManager.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.singleresponsibility;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public interface ICourseManager {
7 | void studyCourse();
8 |
9 | void refundCourse();
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/WalkBird.java:
--------------------------------------------------------------------------------
1 | package com.desgin.principle.singleresponsibility;
2 |
3 | /**
4 | * Create by lastwhisper on 2019/1/22
5 | */
6 | public class WalkBird {
7 | public void mainMoveMode(String birdName) {
8 | System.out.println(birdName + "用脚走");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/README.md:
--------------------------------------------------------------------------------
1 | 参考“传智 张孝详 Java高新技术”
2 |
3 | # Jdk5的一些新特性学习
4 | - 自动拆装箱 AutoBox
5 | - 静态导入 StaticImport
6 | - 可变参数 VariableParameter
7 | - 枚举 enumtest
8 | - 注解 annotation
9 | - 反省与JavaBean introspection
10 | - beanutils beanutils
11 | - 反射 reflect
12 | - 泛型 generic
13 | - 类加载器;已从当前项目移除,查看该项目 github/code/java-basic/jvm/
14 | - 动态代理;已从当前项目移除,查看该项目 github/code/java-advance/proxy
15 | - throwable
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/java/cn/lastwhisper/AutoBox.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper;
2 |
3 | /**
4 | * jdk5新特性:自动拆箱与装箱
5 | * 语法糖,使开发的效率更高
6 | * IntegerCache缓存池,享元模式
7 | * @author lastwhisper
8 | */
9 | public class AutoBox {
10 |
11 | public static void main(String[] args) {
12 | // 语法糖
13 | //Integer it = 555;//自动装箱
14 | //int i = it;//自动拆箱
15 |
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/java/cn/lastwhisper/annotation/StudentRsp.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.annotation;
2 |
3 | /**
4 | * @author cunchang
5 | * @date 2021/4/19 8:02 下午
6 | */
7 | public class StudentRsp {
8 |
9 | /**
10 | * stable beisen_test_name
11 | * real beisen_pro_name
12 | */
13 | @JsonProperty("beisen_test_name")
14 | public String name;
15 |
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/java/cn/lastwhisper/generic/Generic4/PersonDao.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.generic.Generic4;
2 |
3 | /**
4 | * extends BaseDao是为了可以使用通用的方法
5 | * @author lastwhisper
6 | */
7 | public interface PersonDao extends BaseDao {
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/java/cn/lastwhisper/generic/Generic4/PersonDaoImpl.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.generic.Generic4;
2 |
3 | /**
4 | * extends BaseDaoImpl让通用模板知道你的泛型参数是啥,并且可以使用通用的方法
5 | * implements PersonDao是为了面向接口编程、以及更好的整合Spring
6 | * @author lastwhisper
7 | */
8 | public class PersonDaoImpl extends BaseDaoImpl implements PersonDao {
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/java/cn/lastwhisper/io/nio/README.md:
--------------------------------------------------------------------------------
1 | 参考 https://blog.csdn.net/zxm1306192988/article/details/60581173
2 |
3 | 1. 缓冲区(Buffer);TestBuffer
4 | 2. 通道(Channel);TestChannel
5 | 3. 选择器(Selector)
6 | TestBlockingNIO;不使用Selector
7 | TestNIO;使用Selector
8 | TestNIO_UDP
9 | 4. 管道 (Pipe)
10 | TestPipe
11 | 5. Path 、Paths 、Files
12 | TestNIOPathFiles
13 |
14 |
15 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/java/cn/lastwhisper/reflect/pojo/MyObject.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.reflect.pojo;
2 |
3 | public class MyObject {
4 |
5 | }
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/resources/ExtClassloaderJar.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/feature-jdk5/src/main/resources/ExtClassloaderJar.jar
--------------------------------------------------------------------------------
/java-basic/feature-jdk5/src/main/resources/config.properties:
--------------------------------------------------------------------------------
1 | #
2 | className=TestArrayArguments
3 |
4 |
5 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Jdk8的一些新特性学习
3 | - annotation 注解
4 | - date 日期
5 | - interfa 接口
6 | - lambda lambda
7 | - optional optional
8 | - stream stream
9 |
10 | 参考 https://blog.csdn.net/zxm1306192988/article/details/73744378
11 |
12 |
13 | # jdk6~7特性
14 | - spi
15 | - http://www.spring4all.com/article/260
16 | - resources/META-INF/services下为spi配置文件
17 |
18 |
19 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/date/LocalDateTest.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.date;
2 |
3 | import java.time.LocalDate;
4 |
5 | /**
6 | * @author cunchang
7 | * @date 2021/1/10 6:18 下午
8 | */
9 | public class LocalDateTest {
10 |
11 | public static void main(String[] args) {
12 | LocalDate localDate = LocalDate.ofEpochDay(1610273688163L);
13 | System.out.println(localDate);
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/MyFun.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.lambda;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | @FunctionalInterface
7 | public interface MyFun {
8 | public Integer getValue(Integer num);
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/example/MyFun2.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.lambda.example;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | @FunctionalInterface
7 | public interface MyFun2 {
8 |
9 | public String getValue(String str);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/example/MyFun3.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.lambda.example;
2 |
3 | @FunctionalInterface
4 | public interface MyFun3 {
5 |
6 | public R operation(T t1, T t2);
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/strategy/EmployeeAgeFilter.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.lambda.strategy;
2 |
3 | import cn.cunchang.lambda.Employee;
4 |
5 | /**
6 | * @author lastwhisper
7 | */
8 | public class EmployeeAgeFilter implements Filter {
9 | @Override
10 | public boolean eqCondition(Employee employee) {
11 | return employee.getAge() >= 35;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/strategy/EmployeeSalaryFilter.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.lambda.strategy;
2 |
3 | import cn.cunchang.lambda.Employee;
4 |
5 | /**
6 | * @author lastwhisper
7 | */
8 | public class EmployeeSalaryFilter implements Filter {
9 | @Override
10 | public boolean eqCondition(Employee employee) {
11 | return employee.getSalary() >= 2000;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/strategy/Filter.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.lambda.strategy;
2 |
3 | /**
4 | * 过滤接口
5 | */
6 | public interface Filter {
7 | boolean eqCondition(T t);
8 | }
9 |
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/stream/Status.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.stream;
2 |
3 | public enum Status {
4 | FREE, BUSY, VOCATION;
5 | }
--------------------------------------------------------------------------------
/java-basic/feature-jdk8/src/main/java/cn/cunchang/参考.txt:
--------------------------------------------------------------------------------
1 | https://blog.csdn.net/zxm1306192988/article/details/73744378
--------------------------------------------------------------------------------
/java-basic/interview/README.MD:
--------------------------------------------------------------------------------
1 | Java学习中的一些疑惑的地方
2 | uuid 测试Java uuid是否可重复
3 | cpu 控制Java程序cpu的使用率
4 | Convert 进制转换
5 | timestamp 时间戳
6 | test1 修改集合内对象是否会同步
7 | RelationFile rm -rf
8 | string 测试string相关
9 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/A1.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.AccessModifier;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class A1 {
7 | // 不使用访问修饰符
8 | int a;
9 | // 不使用访问修饰符
10 | int sum(int m, int n) {
11 | return m + n;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/A2.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.AccessModifier;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class A2 {
7 | // protected修饰的变量——》受保护的变量
8 | protected int a;
9 | // protected修饰的方法——》受保护的方法
10 | protected int sum(int m, int n) {
11 | return m + n;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/defaulttest/A.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.AccessModifier.defaulttest;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class A {
7 | // 不使用访问修饰符
8 | int a;
9 | // 不使用访问修饰符
10 | int sum(int m, int n) {
11 | return m + n;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/protectedtest/A.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.AccessModifier.protectedtest;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class A {
7 | // protected修饰的变量——》受保护的变量
8 | protected int a;
9 | // protected修饰的方法——》受保护的方法
10 | protected int sum(int m, int n) {
11 | return m + n;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/protectedtest/B.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.AccessModifier.protectedtest;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class B {
7 | public static void main(String[] args) {
8 | //A2 aObject = new A2();
9 | A aObject = new A();
10 | // protected访问修饰,同包可以访问,不同包不可以访问
11 | aObject.a = 10;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/publictest/A.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.AccessModifier.publictest;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class A {
7 | // public修饰的变量——》公有变量
8 | public int a;
9 | // public修饰的方法——》公有方法
10 | public int sum(int m, int n) {
11 | return m + n;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/publictest/B.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.AccessModifier.publictest;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class B {
7 | public static void main(String[] args) {
8 | A aObject = new A();
9 | // public访问修饰,在任何类中都可以访问
10 | aObject.a = 10;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/InnerClass/anonymous/InnerClass.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.InnerClass.anonymous;
2 |
3 | public interface InnerClass {
4 | // 接口方法默认public
5 | void print();
6 | }
7 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/Operator/LogicalBitOperation.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.Operator;
2 |
3 | /**
4 | * 逻辑位运算符
5 | * @author lastwhisper
6 | */
7 | public class LogicalBitOperation {
8 | public static void main(String[] args) {
9 | int a = 5 & -4;// 4
10 | int b = 3 | 6;// 7
11 | int c = 10 ^ 3;// 9
12 | int d = ~(-14);// 13
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/java/cn/lastwhisper/interview/OverloadVsOverride/SuperClass.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.interview.OverloadVsOverride;
2 |
3 | /**
4 | * 父类
5 | * @author lastwhisper
6 | */
7 | public class SuperClass {
8 | protected int overrideFun(int a, int b) throws ArithmeticException {
9 | int divisor = a / b;
10 | return divisor;
11 | }
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/java-basic/interview/src/main/resources/project-parent.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/interview/src/main/resources/project-parent.zip
--------------------------------------------------------------------------------
/java-basic/jvm/README.md:
--------------------------------------------------------------------------------
1 | src
2 | 1. classloader 类加载相关
3 | 2. classloading 类加载时机
4 | 3. ms 内存结构
5 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/DemoObj.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.classloader;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class DemoObj {
7 | static {
8 | System.out.println("类构造器");
9 | }
10 |
11 | {
12 | System.out.println("对象构造器");
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/READMD.md:
--------------------------------------------------------------------------------
1 |
2 | 1. ClassLoaderPrintTest 打印类加载器,Bootstrap、ext、app
3 | 2. ClassLoaderUnique 同一个类在同一个类加载器唯一
4 | 3. ClassLifeCycle 类加载生命周期
5 | 4. MyClassLoaderTest 自定义类加载器,查看双亲委派机制和父子关系构建
6 |
7 |
8 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/hotdeploy/HotCodeTest.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.classloader.hotdeploy;
2 |
3 | public class HotCodeTest {
4 | public void printVersion(){
5 | System.out.println("当前版本是2哦");
6 | }
7 | }
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/loadorder/LoadOrderTest.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.classloader.loadorder;
2 |
3 | /**
4 | * @author kaisui
5 | * @description
6 | * @date 2022/12/4
7 | */
8 | public class LoadOrderTest {
9 |
10 | public static void main(String[] args) {
11 | System.out.println("load end");
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/InterfaceInit.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.classloading;
2 |
3 | public interface InterfaceInit {
4 | public static int i = 0;
5 | }
6 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/StaticCodeTest.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.classloading;
2 |
3 | /**
4 | * 测试静态语句块和静态变量的顺序
5 | */
6 | public class StaticCodeTest {
7 | static {
8 | i = 0;
9 | //System.out.println(i);
10 | }
11 | static int i = 1;
12 | }
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/passive/ConstClass.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.classloading.passive;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class ConstClass {
7 | public static final String HELLOWORLD = "hello world";
8 |
9 | static {
10 | System.out.println("ConstClass init!");
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/passive/Interface.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.classloading.passive;
2 |
3 | public interface Interface {
4 | //一个接口在初始化时,并不要求初始化其全部接口,
5 | // 只会初始化使用到的接口时(如引用接口中定义的常量),才会初始化.
6 | }
7 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/ByteCodeSample.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.memorystruct;
2 |
3 | /**
4 | * 虚拟机栈中的局部变量表和操作数栈
5 | * @author lastwhisper
6 | */
7 | public class ByteCodeSample {
8 | public static int add(int a, int b) {
9 | int c = 0;
10 | c = a + b;
11 | return c;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/Increment.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/Increment.class
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/Increment.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.memorystruct;
2 |
3 | /**
4 | * 栈帧中i++引发的问题
5 | * @author lastwhisper
6 | * @date 2019/10/25
7 | */
8 | public class Increment {
9 | public int increment() {
10 | int i = 0;
11 | i = i++;
12 | return i;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/TestStr2.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/TestStr2.class
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/TestStr2.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.memorystruct;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class TestStr2 {
7 | /**
8 | * 共产生几个String对象?5个
9 | */
10 | public static void main(String[] args) {
11 | String s = "a";
12 | s = s + "b" + "c";
13 | s = s + "b" + "c" + "d";
14 | System.out.println(s);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/ms/User.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jvm.ms;
2 |
3 | /**
4 | * @author kaisui
5 | * @description
6 | * @date 2023/2/22
7 | */
8 | public class User {
9 | }
10 |
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/tmp2/command/jstack/AllStackTrace.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/tmp2/command/jstack/AllStackTrace.java
--------------------------------------------------------------------------------
/java-basic/jvm/src/main/java/java/lang/String.java:
--------------------------------------------------------------------------------
1 | package java.lang;
2 |
3 | /**
4 | * @author cunchang
5 | * @date 2021/9/2 12:21 上午
6 | */
7 | //public class String {
8 | // //
9 | // static {
10 | // System.out.println("我是自定义的String类的静态代码块");
11 | // }
12 | //
13 | // //错误: 在类 java.lang.String 中找不到 main 方法
14 | // public static void main(String[] args) {
15 | // System.out.println("hello,String");
16 | // }
17 | //}
18 |
--------------------------------------------------------------------------------
/java-basic/learn-source-jdk8/READMD.md:
--------------------------------------------------------------------------------
1 | # jdk1.8.0_241环境下
2 |
3 |
4 |
--------------------------------------------------------------------------------
/java-basic/learn-source-jdk8/src/main/java/cn/lastwhisper/learn8/lang/thread/ThreadTest.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.learn8.lang.thread;
2 |
3 | /**
4 | * Thread
5 | * @author lastwhisper
6 | * @date 2020/4/18
7 | */
8 | public class ThreadTest {
9 |
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/java-basic/learn-source-jdk8/src/main/java/cn/lastwhisper/learn8/util/ObjectsTest.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.learn8.util;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 |
5 | /**
6 | * Objects
7 | * @author lastwhisper
8 | * @date 2020/4/12
9 | */
10 | @Slf4j
11 | public class ObjectsTest {
12 |
13 |
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/lesson-code/design/fsm/README.md:
--------------------------------------------------------------------------------
1 | 有限状态机
2 | - switch-case
3 | - driver-table
4 | - state-pattern
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/State.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | public enum State {
4 | SMALL(0),
5 | SUPER(1),
6 | FIRE(2),
7 | CAPE(3);
8 | private int value;
9 |
10 | private State(int value) {
11 | this.value = value;
12 | }
13 |
14 | public int getValue() {
15 | return this.value;
16 | }
17 | }
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/state/v1/IMario.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.state.v1;
2 |
3 | public interface IMario { //所有状态类的接口
4 | State getName();
5 |
6 | //以下是定义的事件
7 | void obtainMushRoom();
8 |
9 | void obtainCape();
10 |
11 | void obtainFireFlower();
12 |
13 | void meetMonster();
14 | }
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/state/v1/State.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.state.v1;
2 |
3 | public enum State {
4 | SMALL(0),
5 | SUPER(1),
6 | CAPE(2),
7 | FIRE(3),
8 | ;
9 | private int value;
10 |
11 | private State(int value) {
12 | this.value = value;
13 | }
14 |
15 | public int getValue() {
16 | return this.value;
17 | }
18 | }
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/state/v2/IMario.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.state.v2;
2 |
3 | public interface IMario { //所有状态类的接口
4 | State getName();
5 |
6 | //以下是定义的事件
7 | void obtainMushRoom(MarioStateMachine stateMachine);
8 |
9 | void obtainCape(MarioStateMachine stateMachine);
10 |
11 | void obtainFireFlower(MarioStateMachine stateMachine);
12 |
13 | void meetMonster(MarioStateMachine stateMachine);
14 | }
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/state/v2/State.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.state.v2;
2 |
3 | public enum State {
4 | SMALL(0),
5 | SUPER(1),
6 | CAPE(2),
7 | FIRE(3),
8 | ;
9 | private int value;
10 |
11 | private State(int value) {
12 | this.value = value;
13 | }
14 |
15 | public int getValue() {
16 | return this.value;
17 | }
18 | }
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/switchcase/State.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.switchcase;
2 |
3 | public enum State {
4 | SMALL(0),
5 | SUPER(1),
6 | CAPE(2),
7 | FIRE(3),
8 | ;
9 | private int value;
10 |
11 | private State(int value) {
12 | this.value = value;
13 | }
14 |
15 | public int getValue() {
16 | return this.value;
17 | }
18 | }
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/table/Event.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.table;
2 |
3 | public enum Event {
4 | GOT_MUSHROOM(0),
5 | GOT_CAPE(1),
6 | GOT_FIRE(2),
7 | MET_MONSTER(3);
8 | private int value;
9 |
10 | private Event(int value) {
11 | this.value = value;
12 | }
13 |
14 | public int getValue() {
15 | return this.value;
16 | }
17 | }
--------------------------------------------------------------------------------
/lesson-code/design/fsm/src/main/java/cn/cunchang/table/State.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.table;
2 |
3 | public enum State {
4 | SMALL(0),
5 | SUPER(1),
6 | CAPE(2),
7 | FIRE(3),
8 |
9 | ;
10 | private int value;
11 |
12 | private State(int value) {
13 | this.value = value;
14 | }
15 |
16 | public int getValue() {
17 | return this.value;
18 | }
19 | }
--------------------------------------------------------------------------------
/log/jcl/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | # 指定 RootLogger 顶级父元素默认配置信息
2 | # 指定日志级别=trace,使用的 apeender 为=console
3 | log4j.rootLogger = trace,console
4 |
5 | # 指定控制台日志输出的 appender
6 | log4j.appender.console = org.apache.log4j.ConsoleAppender
7 | # 指定消息格式 layout
8 | log4j.appender.console.layout = org.apache.log4j.PatternLayout
9 | # 指定消息格式的内容
10 | log4j.appender.console.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
11 |
12 |
--------------------------------------------------------------------------------
/log/log4j/src/main/resources/log4j_组件和配置文件.properties:
--------------------------------------------------------------------------------
1 | # 指定 RootLogger 顶级父元素默认配置信息
2 | # 指定日志级别=trace,使用的 apeender 为=console
3 | log4j.rootLogger = trace,console
4 |
5 | # 指定控制台日志输出的 appender
6 | log4j.appender.console = org.apache.log4j.ConsoleAppender
7 | # 指定消息格式 layout
8 | log4j.appender.console.layout = org.apache.log4j.SimpleLayout
9 |
10 |
--------------------------------------------------------------------------------
/log/log4j2/src/main/resources/AsyncLogger全局/log4j2.component.properties:
--------------------------------------------------------------------------------
1 | # 全局异步
2 | Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
--------------------------------------------------------------------------------
/log/slf4j/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | # 指定 RootLogger 顶级父元素默认配置信息
2 | # 指定日志级别=trace,使用的 apeender 为=console
3 | log4j.rootLogger = trace,console
4 |
5 | # 指定控制台日志输出的 appender
6 | log4j.appender.console = org.apache.log4j.ConsoleAppender
7 | # 指定消息格式 layout
8 | log4j.appender.console.layout = org.apache.log4j.PatternLayout
9 | # 指定消息格式的内容
10 | log4j.appender.console.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
11 |
--------------------------------------------------------------------------------
/log/springboot-log/src/main/java/cn/cunchang/SpringbootLogApplication.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class SpringbootLogApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(SpringbootLogApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/log/日志技术 (上).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/log/日志技术 (上).pdf
--------------------------------------------------------------------------------
/log/日志技术 (下).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/log/日志技术 (下).pdf
--------------------------------------------------------------------------------
/mvc/README.MD:
--------------------------------------------------------------------------------
1 | mvc学习
2 |
3 | # 1.servlet
4 | servlet3.0
5 |
6 |
7 |
8 | # 2.springmvc
9 |
10 | springmvc项目依赖tomcat,
11 | 并且起始url:http://localhost:8080/springmvc/
12 |
13 |
14 |
--------------------------------------------------------------------------------
/mvc/servlet/.settings/org.eclipse.core.resources.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | encoding//WebContent/note.txt=GBK
3 |
--------------------------------------------------------------------------------
/mvc/servlet/.settings/org.eclipse.jdt.core.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
4 | org.eclipse.jdt.core.compiler.compliance=1.8
5 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
6 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
7 | org.eclipse.jdt.core.compiler.source=1.8
8 |
--------------------------------------------------------------------------------
/mvc/servlet/.settings/org.eclipse.wst.common.project.facet.core.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/mvc/servlet/.settings/org.eclipse.wst.jsdt.ui.superType.container:
--------------------------------------------------------------------------------
1 | org.eclipse.wst.jsdt.launching.baseBrowserLibrary
--------------------------------------------------------------------------------
/mvc/servlet/.settings/org.eclipse.wst.jsdt.ui.superType.name:
--------------------------------------------------------------------------------
1 | Window
--------------------------------------------------------------------------------
/mvc/servlet/WebContent/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Class-Path:
3 |
4 |
--------------------------------------------------------------------------------
/mvc/servlet/WebContent/index.jsp:
--------------------------------------------------------------------------------
1 | <%@ page language="java" contentType="text/html; charset=UTF-8"
2 | pageEncoding="UTF-8"%>
3 |
4 |
5 |
6 |
7 | Insert title here
8 |
9 |
10 | helloServlet
11 |
12 |
--------------------------------------------------------------------------------
/mvc/servlet/WebContent/note.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/WebContent/note.txt
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/META-INF/services/javax.servlet.ServletContainerInitializer:
--------------------------------------------------------------------------------
1 | cn.lastwhisper.servlet.MyServletContainerInitializer
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/service/AbstractHelloService.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/AbstractHelloService.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/service/HelloService.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/HelloService.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceExt.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceExt.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceImpl.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceImpl.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/servlet/HelloServlet.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/HelloServlet.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/servlet/MyServletContainerInitializer.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/MyServletContainerInitializer.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserFilter.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserFilter.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserListener.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserListener.class
--------------------------------------------------------------------------------
/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserServlet.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserServlet.class
--------------------------------------------------------------------------------
/mvc/servlet/src/META-INF/services/javax.servlet.ServletContainerInitializer:
--------------------------------------------------------------------------------
1 | cn.lastwhisper.servlet.MyServletContainerInitializer
--------------------------------------------------------------------------------
/mvc/servlet/src/cn/lastwhisper/service/AbstractHelloService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | public abstract class AbstractHelloService implements HelloService {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/mvc/servlet/src/cn/lastwhisper/service/HelloService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | public interface HelloService {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/mvc/servlet/src/cn/lastwhisper/service/HelloServiceExt.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | public interface HelloServiceExt extends HelloService {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/mvc/servlet/src/cn/lastwhisper/service/HelloServiceImpl.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | public class HelloServiceImpl implements HelloService {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/MyWebAppInitializer.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/MyWebAppInitializer.java
--------------------------------------------------------------------------------
/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/AppConfig.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/AppConfig.java
--------------------------------------------------------------------------------
/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/RootConfig.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/RootConfig.java
--------------------------------------------------------------------------------
/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/AsyncController.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/AsyncController.java
--------------------------------------------------------------------------------
/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/MyFirstInterceptor.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/MyFirstInterceptor.java
--------------------------------------------------------------------------------
/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/service/HelloService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service;
2 |
3 | import org.springframework.stereotype.Service;
4 |
5 | @Service
6 | public class HelloService {
7 |
8 | public String sayHello(String name){
9 |
10 | return "Hello "+name;
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/mvc/springmvc-annotation/src/main/webapp/upload_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/webapp/upload_3.jpg
--------------------------------------------------------------------------------
/mvc/springmvc/src/main/webapp/WEB-INF/pages/success.jsp:
--------------------------------------------------------------------------------
1 | <%--
2 | Created by IntelliJ IDEA.
3 | User: Administrator
4 | Date: 2019/9/17
5 | Time: 18:12
6 | To change this template use File | Settings | File Templates.
7 | --%>
8 | <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 |
10 |
11 | 成功页面
12 |
13 |
14 | 执行成功
15 |
16 |
17 |
--------------------------------------------------------------------------------
/mvc/springmvc/src/main/webapp/WEB-INF/pages/success2.jsp:
--------------------------------------------------------------------------------
1 | <%--
2 | Created by IntelliJ IDEA.
3 | User: Administrator
4 | Date: 2019/9/17
5 | Time: 18:12
6 | To change this template use File | Settings | File Templates.
7 | --%>
8 | <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 |
10 |
11 | 成功页面
12 |
13 |
14 | 由Controller接口的实现类执行的结果
15 |
16 |
17 |
--------------------------------------------------------------------------------
/mvc/springmvc/src/main/webapp/WEB-INF/pages/success3.jsp:
--------------------------------------------------------------------------------
1 | <%--
2 | Created by IntelliJ IDEA.
3 | User: Administrator
4 | Date: 2019/9/17
5 | Time: 18:12
6 | To change this template use File | Settings | File Templates.
7 | --%>
8 | <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 |
10 |
11 | 成功页面
12 |
13 |
14 | 由HttpRequestHandler接口的实现类执行的结果
15 |
16 |
17 |
--------------------------------------------------------------------------------
/notes/leetcode/LeetCode 第 39 题:“组合总和”题解配图.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/LeetCode 第 39 题:“组合总和”题解配图.pptx
--------------------------------------------------------------------------------
/notes/leetcode/Leetcode.mmap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/Leetcode.mmap
--------------------------------------------------------------------------------
/notes/leetcode/leetcode-39.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-39.vsdx
--------------------------------------------------------------------------------
/notes/leetcode/leetcode-46.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-46.vsdx
--------------------------------------------------------------------------------
/notes/leetcode/leetcode-47.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-47.vsdx
--------------------------------------------------------------------------------
/notes/leetcode/leetcode-56.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-56.vsdx
--------------------------------------------------------------------------------
/notes/leetcode/leetcode-77.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-77.vsdx
--------------------------------------------------------------------------------
/notes/leetcode/leetcode-92.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-92.vsdx
--------------------------------------------------------------------------------
/notes/orm/jpa/SpringDataJPA第一天讲义.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/jpa/SpringDataJPA第一天讲义.doc
--------------------------------------------------------------------------------
/notes/orm/jpa/SpringDataJPA第三天讲义.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/jpa/SpringDataJPA第三天讲义.doc
--------------------------------------------------------------------------------
/notes/orm/jpa/SpringDataJPA第二天讲义.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/jpa/SpringDataJPA第二天讲义.doc
--------------------------------------------------------------------------------
/notes/orm/mybatis/Mybatis第一天讲义.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第一天讲义.pdf
--------------------------------------------------------------------------------
/notes/orm/mybatis/Mybatis第三天讲义.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第三天讲义.pdf
--------------------------------------------------------------------------------
/notes/orm/mybatis/Mybatis第二天讲义.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第二天讲义.pdf
--------------------------------------------------------------------------------
/notes/orm/mybatis/Mybatis第四天讲义.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第四天讲义.pdf
--------------------------------------------------------------------------------
/notes/orm/mybatis/Noname1.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname1.txt
--------------------------------------------------------------------------------
/notes/orm/mybatis/Noname2.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname2.txt
--------------------------------------------------------------------------------
/notes/orm/mybatis/Noname3.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname3.txt
--------------------------------------------------------------------------------
/notes/orm/mybatis/Noname4.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname4.txt
--------------------------------------------------------------------------------
/orm/jdbc/src/main/java/cn/lastwhisper/jdbc/util/Callback.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jdbc.util;
2 |
3 |
4 | import java.sql.Connection;
5 | import java.sql.PreparedStatement;
6 | import java.sql.SQLException;
7 |
8 | /**
9 | * @author lastwhisper
10 | */
11 | @FunctionalInterface
12 | public interface Callback {
13 | /**
14 | * 模板方法的回调方法
15 | */
16 | void execute(PreparedStatement pstm) throws SQLException;
17 | }
--------------------------------------------------------------------------------
/orm/jpa/jpa-basic/src/main/java/cn/lastwhisper/jpa/utils/Callback.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.jpa.utils;
2 |
3 | import javax.persistence.EntityManager;
4 |
5 | /**
6 | * @author lastwhisper
7 | */
8 | @FunctionalInterface
9 | public interface Callback {
10 | /**
11 | * 模板方法的回调方法
12 | * @param em EntityManager操作实体类的对象
13 | * @return void
14 | */
15 | void execute(EntityManager em);
16 | }
--------------------------------------------------------------------------------
/orm/jpa/jpa-manytomany/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/orm/jpa/jpa-manytomany/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/orm/jpa/jpa-manytomany/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
2 |
--------------------------------------------------------------------------------
/orm/jpa/jpa-manytomany/readme.md:
--------------------------------------------------------------------------------
1 | spring-data-jpa 的多对多关联案例
--------------------------------------------------------------------------------
/orm/jpa/jpa-onetomany/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.application.name=spring-data-jpa
2 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jpa?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
4 | spring.datasource.username=root
5 | spring.datasource.password=root
6 | spring.jpa.show-sql=true
--------------------------------------------------------------------------------
/orm/jpa/springdatajpa/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/orm/jpa/springdatajpa/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/orm/jpa/springdatajpa/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
2 |
--------------------------------------------------------------------------------
/orm/jpa/springdatajpa/readme.md:
--------------------------------------------------------------------------------
1 | spring-data-jpa 基础
--------------------------------------------------------------------------------
/orm/jpa/springdatajpa/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.application.name = spring-data-jpa
2 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jpa?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
4 | spring.datasource.username=root
5 | spring.datasource.password=root
6 | spring.jpa.show-sql=true
--------------------------------------------------------------------------------
/orm/mongodb/src/main/java/cn/cunchang/Application.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class Application {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(Application.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/orm/mongodb/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | #数据源配置
3 | data:
4 | mongodb:
5 | # 主机地址
6 | host: 127.0.0.1
7 | # 数据库
8 | database: articledb
9 | # 默认端口是27017
10 | port: 27017
11 | # 也可以使用uri连接
12 | # bobo:123456 账号密码
13 | # uri: mongodb://bobo:123456@180.76.159.126:27017,180.76.159.126:27018,180.76.159.126:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs
--------------------------------------------------------------------------------
/orm/mongodb/src/test/java/cn/cunchang/ApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class ApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/orm/mybatis/README.MD:
--------------------------------------------------------------------------------
1 | # 一、mybatis入门与基础使用
2 | - mybatis-basic
3 | - mybatis-crud
4 | - mybatis-dynamicsql
5 | # 二、mybatis多表
6 | - mybatis-datasource-tx
7 | - mybatis-onetoone
8 | - mybatis-onetomany
9 | - mybatis-manytomany
10 | # 三、mybatis缓存与注解
11 | - mybatis-lazy
12 | - mybatis-cache
13 | - mybatis-annotation-crud
14 | - mybatis-annotation-manytable
15 | # 四、mybatis拦截器
16 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-annotation-crud/readme.md:
--------------------------------------------------------------------------------
1 | mybatis注解实现crud
2 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-annotation-crud/src/main/java/cn/lastwhisper/mybatis/annotation/crud/utils/Callback.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.mybatis.annotation.crud.utils;
2 |
3 | import org.apache.ibatis.session.SqlSession;
4 |
5 | /**
6 | * @author Administrator
7 | */
8 | @FunctionalInterface
9 | public interface Callback {
10 | /**
11 | * 执行者
12 | */
13 | void execute(SqlSession sqlSession);
14 | }
15 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-annotation-crud/src/main/resources/jdbcConfig.properties:
--------------------------------------------------------------------------------
1 | jdbc.driver=com.mysql.jdbc.Driver
2 | jdbc.url=jdbc:mysql://localhost:3306/orm
3 | jdbc.username=root
4 | jdbc.password=root
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-annotation-manytable/readme.md:
--------------------------------------------------------------------------------
1 | mybatis注解实现一对一(多对一)、一对多、二级缓存
2 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-annotation-manytable/src/main/java/cn/lastwhisper/mybatis/annotation/manytable/utils/Callback.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.mybatis.annotation.manytable.utils;
2 |
3 | import org.apache.ibatis.session.SqlSession;
4 |
5 | /**
6 | * @author Administrator
7 | */
8 | @FunctionalInterface
9 | public interface Callback {
10 | /**
11 | * 执行者
12 | */
13 | void execute(SqlSession sqlSession);
14 | }
15 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-annotation-manytable/src/main/resources/jdbcConfig.properties:
--------------------------------------------------------------------------------
1 | jdbc.driver=com.mysql.jdbc.Driver
2 | jdbc.url=jdbc:mysql://localhost:3306/orm
3 | jdbc.username=root
4 | jdbc.password=root
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-basic/readme.md:
--------------------------------------------------------------------------------
1 | mybatis xml配置与注解配置基本流程
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-cache/readme.md:
--------------------------------------------------------------------------------
1 | mybatis一级缓存和二级缓存
2 | - 一级缓存是SqlSession级别的
3 | - 二级缓存是Mapper级别的,多个 SqlSession 可以共用二级缓存
4 |
5 | 当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化
6 | 方式来保存对象。
7 |
8 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-lazy/readme.md:
--------------------------------------------------------------------------------
1 | mybatis延迟加载
2 | - association、collection可以使用延迟加载
3 |
4 | 将一对多案例改为延迟加载
5 |
6 | 延迟加载需要在SqlMapConfig.xml中配置
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-manytomany/readme.md:
--------------------------------------------------------------------------------
1 | mybatis多对多
2 | - 多对多使用resultMap的collection
3 | 拆分为双向的一对多
4 |
5 |
6 | 需求:
7 | - 实现查询所有角色并且加载它所分配的用户信息。
8 |
9 | 分析:
10 | - 查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息,而是要通过中
11 | 间表(USER_ROLE 表)才能关联到用户信息。
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-manytomany/src/main/java/cn/lastwhisper/mybatis/manytomany/dao/RoleMapper.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.mybatis.manytomany.dao;
2 |
3 |
4 | import cn.lastwhisper.mybatis.manytomany.domain.Role;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | * @author Administrator
10 | */
11 | public interface RoleMapper {
12 | /**
13 | * 查询所有角色
14 | * @return
15 | */
16 | List findAll();
17 | }
18 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-manytomany/src/main/java/cn/lastwhisper/mybatis/manytomany/dao/UserMapper.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.mybatis.manytomany.dao;
2 |
3 |
4 | import cn.lastwhisper.mybatis.manytomany.domain.User;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | * @author Administrator
10 | */
11 | public interface UserMapper {
12 | /**
13 | * 查询所有角色
14 | * @return
15 | */
16 | List findAll();
17 | }
18 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-onetomany/readme.md:
--------------------------------------------------------------------------------
1 | mybatis一对多
2 | - resultMap的collection
3 |
4 | 需求:
5 | - 查询所有用户信息及用户关联的账户信息。
6 |
7 | 分析:
8 | - 用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息
9 | 查询出来,我们想到了左外连接查询比较合适。
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-onetomany/src/main/java/cn/lastwhisper/mybatis/onetomany/dao/UserMapper.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.mybatis.onetomany.dao;
2 |
3 |
4 | import cn.lastwhisper.mybatis.onetomany.domain.User;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | * @author Administrator
10 | */
11 | public interface UserMapper {
12 | /**
13 | * 查询所有用户,同时获取出每个用户下的所有账户信息
14 | * @return
15 | */
16 | List findAll();
17 | }
18 |
--------------------------------------------------------------------------------
/orm/mybatis/mybatis-onetoone/readme.md:
--------------------------------------------------------------------------------
1 | mybatis实现一对一(多对一)
2 | - 继承
3 | - 定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段
4 | - 关联
5 | - resultMap的association
6 |
7 | 需求:
8 | - 查询所有账户信息,关联查询下单用户信息。
9 |
10 | 注意:
11 | - 因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。
--------------------------------------------------------------------------------
/spring-annotation/aop-@Aspect/src/main/java/cn/lastwhisper/aop/MathCalculator.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.aop;
2 |
3 | /**
4 | * 处理业务类
5 | * @author lastwhisper
6 | */
7 | public class MathCalculator {
8 | // 做除法
9 | public int div(int i, int j) {
10 | System.out.println("MathCalculator...div...");
11 | return i / j;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/spring-annotation/aop-interface/README.md:
--------------------------------------------------------------------------------
1 | 1111
2 |
--------------------------------------------------------------------------------
/spring-annotation/aop-schema-based/README.md:
--------------------------------------------------------------------------------
1 | 参考
2 | https://www.cnblogs.com/HigginCui/p/6323131.html
3 |
4 |
--------------------------------------------------------------------------------
/spring-annotation/aop-schema-based/src/main/java/cn/cunchang/domain/BenzCar.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.domain;
2 |
3 | public class BenzCar implements Car{
4 |
5 | @Override
6 | public void driving() {
7 | System.out.println("奔驰车在行驶...");
8 | }
9 |
10 | }
--------------------------------------------------------------------------------
/spring-annotation/aop-schema-based/src/main/java/cn/cunchang/domain/BmwCar.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.domain;
2 |
3 | public class BmwCar implements Car{
4 |
5 | @Override
6 | public void driving(){
7 | System.out.println("五菱宏光在行驶...");
8 | }
9 |
10 | }
--------------------------------------------------------------------------------
/spring-annotation/aop-schema-based/src/main/java/cn/cunchang/domain/Car.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang.domain;
2 |
3 | /**
4 | * @author cunchang
5 | * @date 2021/8/29 11:21 上午
6 | */
7 | public interface Car {
8 |
9 | public void driving();
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/spring-annotation/autowired/src/main/java/cn/lastwhisper/autowired/bean/Car.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.autowired.bean;
2 |
3 | import org.springframework.stereotype.Component;
4 |
5 | /**
6 | * @author lastwhisper
7 | */
8 | @Component
9 | public class Car {
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/spring-annotation/autowired/src/main/java/cn/lastwhisper/autowired/controller/BookController.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.autowired.controller;
2 |
3 | import cn.lastwhisper.autowired.service.BookService;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.stereotype.Controller;
6 |
7 | @Controller
8 | public class BookController {
9 | @Autowired
10 | private BookService bookService;
11 | }
12 |
--------------------------------------------------------------------------------
/spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Blue.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.componentregister.bean;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Blue {
7 | }
8 |
9 |
--------------------------------------------------------------------------------
/spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Color.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.componentregister.bean;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Color {
7 | }
8 |
--------------------------------------------------------------------------------
/spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/RainBow.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.componentregister.bean;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class RainBow {
7 | }
8 |
--------------------------------------------------------------------------------
/spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Red.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.componentregister.bean;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Red {
7 | }
8 |
--------------------------------------------------------------------------------
/spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Yellow.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.componentregister.bean;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Yellow {
7 | }
8 |
--------------------------------------------------------------------------------
/spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/dao/BookDao.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.componentregister.dao;
2 |
3 | import org.springframework.stereotype.Repository;
4 |
5 | @Repository
6 | public class BookDao {
7 | }
8 |
--------------------------------------------------------------------------------
/spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/service/BookService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.componentregister.service;
2 |
3 | import org.springframework.stereotype.Service;
4 |
5 | @Service
6 | public class BookService {
7 | }
8 |
--------------------------------------------------------------------------------
/spring-annotation/ext/README.md:
--------------------------------------------------------------------------------
1 | 1. event
2 | 2. BeanDefinitionRegistryPostProcessor
3 | 3. BeanFactoryPostProcessor
--------------------------------------------------------------------------------
/spring-annotation/ext/src/main/java/cn/lastwhisper/spring/ext/bean/Blue.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.spring.ext.bean;
2 |
3 | public class Blue {
4 |
5 | private String name;
6 |
7 | public Blue() {
8 | System.out.println("blue...constructor");
9 | }
10 |
11 | public String getName() {
12 | return name;
13 | }
14 |
15 | public void setName(String name) {
16 | this.name = name;
17 | }
18 | }
--------------------------------------------------------------------------------
/spring-annotation/profile/src/main/java/cn/lastwhisper/profile/bean/Yellow.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.profile.bean;
2 |
3 | /**
4 | * @author lastwhisper
5 | */
6 | public class Yellow {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/spring-annotation/profile/src/main/resources/db.properties:
--------------------------------------------------------------------------------
1 | db.user=root
2 | db.password=root
3 | db.driverClass=com.mysql.jdbc.Driver
4 |
--------------------------------------------------------------------------------
/spring-annotation/propertyvalue/src/main/resources/person.properties:
--------------------------------------------------------------------------------
1 | person.nickname=nike
2 | person.moneyList=100,200,300
--------------------------------------------------------------------------------
/spring-annotation/transaction/README.md:
--------------------------------------------------------------------------------
1 | 注解事务实现原理
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/spring-batch/spring-batch/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.batch.job.enabled=false
2 |
--------------------------------------------------------------------------------
/spring-batch/spring-batch/src/main/resources/sample-data.csv:
--------------------------------------------------------------------------------
1 | Jill,Doe
2 | Joe,Doe
3 | Justin,Doe
4 | Jane,Doe
5 | John,Doe
6 | Tom,Doe
7 | Cat,Doe
8 | Zhang,San
9 | Li,Si
10 | Li,Doe
11 | Zhang,Doe
--------------------------------------------------------------------------------
/spring-batch/spring-batch/src/main/resources/schema-all.sql:
--------------------------------------------------------------------------------
1 | DROP TABLE people IF EXISTS;
2 |
3 | CREATE TABLE people
4 | (
5 | person_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
6 | first_name VARCHAR(20),
7 | last_name VARCHAR(20)
8 | );
--------------------------------------------------------------------------------
/spring-batch/spring-batch/src/test/java/cn/cunchang/SpringBatchApplicationTests.java:
--------------------------------------------------------------------------------
1 | package cn.cunchang;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import org.springframework.boot.test.context.SpringBootTest;
5 |
6 | @SpringBootTest
7 | class SpringBatchApplicationTests {
8 |
9 | @Test
10 | void contextLoads() {
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/springboot-aop/cache/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/java/cn/lastwhisper/anno/AdminOnly.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.anno;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * AnnoAspectConfig 注解匹配时使用
10 | */
11 | @Retention(RetentionPolicy.RUNTIME)
12 | @Target(ElementType.METHOD)
13 | public @interface AdminOnly {
14 | }
15 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/java/cn/lastwhisper/anno/NeedSecured.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.anno;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * Created by cat on 2016-12-04.
7 | */
8 | @Retention(RetentionPolicy.RUNTIME)
9 | @Target(ElementType.TYPE)
10 | @Inherited
11 | public @interface NeedSecured {
12 | }
13 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/java/cn/lastwhisper/anno/NeedSecuredClass.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.anno;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * Created by cat on 2016-12-04.
7 | */
8 | @Retention(RetentionPolicy.CLASS)
9 | @Target(ElementType.TYPE)
10 | @Inherited
11 | public @interface NeedSecuredClass {
12 | }
13 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/java/cn/lastwhisper/anno/NeedSecuredSource.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.anno;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | * Created by cat on 2017-02-19.
7 | */
8 | @Retention(RetentionPolicy.SOURCE)
9 | @Target(ElementType.TYPE)
10 | @Inherited
11 | public @interface NeedSecuredSource {
12 | }
13 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/java/cn/lastwhisper/bean/Product.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.bean;
2 |
3 |
4 | import cn.lastwhisper.anno.NeedSecured;
5 |
6 | /**
7 | * Created by cat on 2017-02-19.
8 | */
9 | @NeedSecured
10 | public class Product {
11 | }
12 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/java/cn/lastwhisper/log/Loggable.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.log;
2 |
3 | /**
4 | * Created by cat on 2017-02-19.
5 | */
6 | public interface Loggable {
7 | public void log();
8 | }
9 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/java/cn/lastwhisper/service/sub/SubService.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.service.sub;
2 |
3 | import org.springframework.stereotype.Component;
4 |
5 | /**
6 | * Created by cat on 2017-02-19.
7 | */
8 | @Component
9 | public class SubService {
10 |
11 | public void demo(){
12 | System.out.println("demo for SubService");
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/springboot-aop/execution/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/springboot-aop/log/src/main/java/cn/lastwhisper/aop/LogApplication.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.aop;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class LogApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(LogApplication.class, args);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/springboot-aop/log/src/main/java/cn/lastwhisper/aop/dao/ProductDao.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.aop.dao;
2 |
3 | import cn.lastwhisper.aop.domain.Product;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 |
6 | public interface ProductDao extends JpaRepository {
7 | //public Product findById(Long id);
8 | }
9 |
--------------------------------------------------------------------------------
/springboot-aop/log/src/main/java/cn/lastwhisper/aop/datalog/ActionDao.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.aop.datalog;
2 |
3 | import cn.lastwhisper.aop.domain.Action;
4 | import org.springframework.data.mongodb.repository.MongoRepository;
5 |
6 | public interface ActionDao extends MongoRepository {
7 | }
8 |
--------------------------------------------------------------------------------
/springboot-aop/principle/README.md:
--------------------------------------------------------------------------------
1 | - AOP 底层设计模式
2 | - 动态代理
3 | - 责任链
4 |
5 | 动态代理代码,迁移到proxy
6 | 责任链代码,迁移到design-pattern
7 |
8 |
--------------------------------------------------------------------------------
/springboot-aop/security/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/springboot-aop/transaction/src/main/java/cn/lastwhisper/aop/dao/OperationLogDao.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.aop.dao;
2 |
3 | import cn.lastwhisper.aop.domain.OperationLog;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 |
6 | public interface OperationLogDao extends JpaRepository {
7 | }
8 |
--------------------------------------------------------------------------------
/springboot-aop/transaction/src/main/java/cn/lastwhisper/aop/dao/UserDao.java:
--------------------------------------------------------------------------------
1 | package cn.lastwhisper.aop.dao;
2 |
3 |
4 | import cn.lastwhisper.aop.domain.User;
5 | import org.springframework.data.jpa.repository.JpaRepository;
6 |
7 | public interface UserDao extends JpaRepository {
8 | }
9 |
--------------------------------------------------------------------------------
/springboot-aop/transaction/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver
2 | spring.datasource.url=jdbc:mysql://localhost:3306/spring_transaction?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
3 | spring.datasource.username=root
4 | spring.datasource.password=root
5 | spring.jpa.hibernate.ddl-auto=update
6 | spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
7 |
--------------------------------------------------------------------------------
/tool/src/main/resources/config.properties:
--------------------------------------------------------------------------------
1 | targetDirs=/Users/cunchang/workspace
2 | deleteDirs=.idea;target;out
3 | deleteFiles=.iml
4 |
--------------------------------------------------------------------------------