# Java-Notes **Repository Path**: jy-liu6277/java-notes ## Basic Information - **Project Name**: Java-Notes - **Description**: Notes for learning Java - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-06 - **Last Updated**: 2024-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README * [Java学习路线](./Java学习路线.xmind) ## 常用工具 [基础与准备 README](https://gitee.com/jy-liu6277/before-the-start.git) * iterm高亮显示 * Typora图床设置 * git版本控制 ### Maven * [Maven入门](./JavaWeb/maven.md):安装及配置(仓库配置);工程结构与常用命令;创建Maven项目 * [Maven进阶](./SSM/Maven.md):模块拆分;模块的聚合和继承;多环境兼容(profile);maven私服 ### Linux & Shell * [Linux基本操作](./JavaWeb/Linux.md):vim使用;网络配置 * [Linux上启动各种服务](./DistributedSystem/linux-starter.md):zookeeper;dubbo ## Java ### Basic Java > REFs > > * [黑马程序员. Java基础入门教程. B站](https://www.bilibili.com/video/BV18J411W7cE) > * [Java 全栈知识体系](https://www.pdai.tech/) * [Java基础语法](./Java/Java-Basic.md):变量;运算符;类型转换;控制语句;方法;方法重载 * [继承](./Java/Java-inheritence.md):继承时的属性和方法访问特点;this和super;方法重写;修饰符权限;static * [多态](./Java/Java-polymorphism.md):多态的实现;多态中的属性和方法访问特点;转型 * [抽象类和接口](./Java/Java-abstractClass&interface.md):各自特点;成员特点;关系和区别 * [接口组成的更新](./Java/Java-interfaceUpdate):接口中允许存在默认、静态和私有方法 * [内部类](./Java/Java-innerClass.md):访问特点;静态内部类实现方法调用 * 常用API: * [Math类 Array类](./Java/Java-API-Math.md):`Math.random()`| `Arrays.toString()`|`Arrays.sort()` * [System类](./Java/Java-API-System.md):`System.arrayCopy()` | 返回当前时间 * Object类:所有对象的默认父类 `toStirng() | equals() | hashCode() |wait() notify() `等方法;p * [String和StringBuilder类](./Java/Java-API-String.md):`String.split() | String.replace() | String.toCharArray() | String.length() | Stirng.charAt() | String.subString()` ;使用StringBuilder进行字符串拼接 * [基本类型包装类](./Java/Java-API-WrapperClass.md):数据类型转换`Integer.parseInt()`;String Interger int 三者之间的转换 * [日期相关类](./Java/Java-API-Date.md): Date与SimpleDateFormat联用对日期进行格式化和解析;Calendar类操作日历字段 * [异常](./Java/Java-exception.md):异常处理方法;自定义异常类;throws/throw * 集合: * Collection集合: * [List集合](./Java/Java-collection-list.md):有序可重复(ArrayList | LinkedList | iterator | listiterator) * [Set集合](./Java/Java-collection-set.md):无序不可重复(HashSet | LinkedHashSet | TreeSet) * [Map集合](./Java/Java-map.md):HashMap、TreeMap的常用方法及遍历方法 * [Collections集合工具类](./Java/Java-collections.md):排序、反转、随机顺序 * [范型及可变参数](./Java/Java-generics.md):范型类、接口、方法的使用;可变参数的使用 * 编译期间会擦除范型;可以通过反射 (`Class.newInstance()`) 创建范型类,因为反射也是在运行时才确定具体类型 * [File类](./Java/Java-file.md):File类的构造方法;创建、判断、获取、删除方法;递归遍历File类 * [IO流](./Java/Java-IO.md):字节流;字符流;打印流;对象序列化与反序列化;Properties集合与IO流 * [多线程](./Java/Java-thread.md):多线程的实现方式(继承Thread类 | 实现Runnable接口);线程控制;线程同步(同步代码块 | 同步方法);生产者消费者模式 * [网络编程](./Java/Java-internet.md):UDP通信;TCP通信 * [Lambda表达式和方法引用](./Java/Java-lambda.md):Lambda表达式的使用和省略;Lambda表达式和匿名内部类的区别;方法引用替代Lambda表达式 * [函数式接口与Stream流](./Java/Java-functionalInterface.md):常用的函数式接口(Supplier | Consumer | Predicate | Function);Stream流的用法(生成、中间操作、终结、收集操作) * [类加载和反射](./Java/Java-reflection.md):Class对象的获取;反射获得构造方法、属性以及成员方法;通过配置文件创建对象并调用方法;模块服务的基本使用 * [注解](./Java/Java-annotation.md):Java中预定义的注解;自定注解(注解的属性;元注解);注解使用 * [动态代理](./Java/Java-proxy.md):`InvovationHandler`,`Proxy.newInstance()`;读取 specified class 的字节码,将字节码中的每一个方法都改为调用 `InvocationHandler::invoke()`,之后保存字节码并通过字节码生成代理类 * [Java数据结构](./Java/Java-dataStructure.md):队列;最小堆; **深入学习** * [UML类图](./Java/OOD-UML.md) * [Java type](./Java/more_types.md) * [HashMap](./Java/Java-HashMap.md):存储过程;构造方法;添加、扩容、删除等方法 * [ArrayList](./Java/Java-ArrayList.pdf):ArrayList集合实现的接口;源码分析(扩容、添加、删除、迭代等) ### Java知识点拾遗 * [Java核心技术面试精讲 - note](./Java/review_interview.md) ### JVM虚拟机 > REFs > > * [尚硅谷. JVM全套教程. B站](https://www.bilibili.com/video/BV1PJ411n7xZ) > * [willA笔记更新ing. JVM](https://juejin.cn/post/6844904192209846280) > * [黑马程序员. JVM完整教程. B站](https://www.bilibili.com/video/BV1yE411Z7AP) * [JVM内存结构](./JVM/JVM-1-内存结构.md):程序计数器;栈;堆;方法区;直接内存 * [字符串常量池](./JVM/JVM-StringTable.md):字符串常量/变量拼接;`intern()`方法;调优 * [垃圾回收](./JVM/JVM-GC.md):引用分类;GC算法;垃圾收集器(串行、并行、CMS、G1) * [类加载与字节码技术](./JVM/JVM-类加载与字节码.md):字节码指令分析;类加载器;类加载阶段;编译期优化 * [JVM-JMM和并发](./JVM/JVM-JMM和并发.md) ### 设计模式 > REFs > > * [黑马程序员. Java设计模式详解. B站](https://www.bilibili.com/video/BV1Np4y1z7BU) * [设计模式总结-xmind](./DesignPattern/DesignPattern.xmind) * [设计模式概述](./DesignPattern/设计模式-01.md):UML模型;软件设计六原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则、合成复用原则 * [创建者模式](./DesignPattern/设计模式-02.md):**单例模式**;**工厂模式**;抽象工厂;原型模式;**建造者** * [结构型模式](./DesignPattern/设计模式-03.md):**代理模式**;**适配器模式**;装饰者模式;桥接模式;外观模式;组合模式;享元模式 * [行为型模型-I](./DesignPattern/设计模式-04.md):**模版模式**;**策略模式**;命令模式;**责任链模式** * [行为型模型-II](./DesignPattern/设计模式-05.md):状态模式;**观察者模式**;中介模式;迭代器模式;访问者模式;备忘录模式;解释器模式 * [案例](./DesignPattern/设计模式-06.md):自定义Spring框架实现IoC功能 ### Java并发 > REFs > > * [黑马程序员. Java并发编程. B站](https://www.bilibili.com/video/BV16J411h7Rd) > * [Java并发知识体系详解](https://www.pdai.tech/md/java/thread/java-thread-x-overview.html) > * Java concurrency in practice * [JCP笔记](./Java_concurrent/Java_concurrency_in_action.md) * [Java 线程](./Java_concurrent/Java_con_1_thread.md):线程创建的三种方式及FutureTask、线程状态、线程间协作`sleep()`, `join()`, `yield()`、线程中断`isInterrupted(), intrrupt(), interrupted()` * 同步线程:通过同步的方式避免不同的线程在同一时间访问同一个共享变量(JCP chap2) * 基于锁的互斥同步 * [syncrhonized](./Java_concurrent/Java_con_2_synchronize.md): syncrhonized用法及原理;锁的升级;锁的优化;wait-notify * [LockSupport](./Java_concurrent/Java_con_2_locksupport.md): park-unpark原理;不同线程同步方法的对比 * [Lock接口](./Java_concurrent/Java_con_2_lock.md): 借助 Lock 接口的实现类实现线程同步 * [ReentrantLock](./Java_concurrent/Java_con_2_ReentrantLock.md) + Condition:公平、非公平、可重入 * [ReentrantReadWriteLock](./Java_concurrent/Java_con_2_ReentrantReadWriteLock.md):读锁、写锁、锁降级;ThreadLocal实现重入和计数 * [基于 CAS 的无阻塞同步](./Java_concurrent/Java_con_2_CAS.md):原子类和UNSAFE * [共享对象](./Java_concurrent/Java_con_3_variable.md):保障共享对象的线程安全(JCP chap3)。多线程环境下实现共享数据安全的主要方式有:thread-confined、shared read-only、shared thread-safe、guarded * [volatile 和 final](./Java_concurrent/Java_con_3_volatile.md):无状态 (stateless);可见性->内存屏障;有序性->happens-before;应用场景;final * 线程安全的数据结构(JCP chap5): * [ConcurrentHashMap 1.8](./Java_concurrent/detail_ConcurrentHashMap-8.md):get不加锁;put对每个桶位置加锁;使用 sizeCtl 变量记录数组状态;扩容时其他并发线程协助扩容 * [CopyOnWriteArrayList](./Java_concurrent/Java_con_3_COWList.md):迭代操作在snapshot上进行;修改操作会创建副本,在副本上进行;ReentrantLock 加锁 * [BlockingQueue](./Java_concurrent/Java_con_3_BlockingQueue.md):BlockingQueue and BlockingDeque * [ConcurrentLinkedQueue](./Java_concurrent/Java_con_3_clq): CAS 无锁并发 * [ThreadLocal](./Java_concurrent/Java_con_3_ThreadLocal.md):线性探测寻址;线程隔离机制;ThreadLocalMap和软引用 * 线程协作:JUC同步器和线程池 * [Semaphore](./Java_concurrent/Java_con_4_Semaphore.md):控制同时执行的线程数量;`acquire() -> tryAcruireShared()`, `release() -> tryReleaseShared()` * [CountDownLatch](./Java_concurrent/Java_con_4_Latch.md):主线程等待所有子线程; `await() -> tryAcquireShared()`, `countDown() -> tryReleaseShared()` * [CyclicBarrier](./Java_concurrent/Java_con_4_Barrier.md):子线程完成任务后继续执行主任务;`await() -> Condition.await()/signalAll()` * [ThreadPoolExecutor](./Java_concurrent/Java_con_4_Executor.md):`execute()` 与 `submit()`的用法;线程池的参数;常用线程池 * Fork/Join框架: 原理详解汇总: * [AQS](./Java_concurrent/detail_AQS.md):线程被包装为Node对象,waitStatus指示节点状态,sync_queue同步队列存放阻塞的线程节点;`acquire()` 负责获取资源、管理队列、调用`LockSupport.park()` 阻塞线程;`release()` 调用`LockSupport.unpark()`唤醒队列中的节点 * [Condition](./Java_concurrent/detail_Condition.md):`await()`将Node从sync队列转移到condition队列中,并阻塞当前线程;`signal()` 将Node加入到同步队列并唤醒 * [ConcurrentHashMap 1.7](./Java_concurrent/detail_ConcurrentHashMap-8.md):segment 分段锁 * [线程池实现原理](./Java_concurrent/detail_Executor.md):WorkerSet集合和Woker阻塞队列 * [FutureTask 详解](./Java_concurrent/detail_FutureTask.md):将线程包装成Callable对象,保存返回值和异常;state控制任务的状态;WaitNode构成阻塞队列;借助LockSupport实现线程的阻塞和唤醒;通过Thread.interrupt实现中断 [并发编程模式设计](./Java_concurrent/patterns.md): * 同步模式:保护性暂停、Balking、顺序控制 * 异步模式:生产者/消费者、工作线程(线程池) * 两段式终止 * 线程安全单例 ### Java网络编程 * NIO与Netty * [NIO的特点](./Java_netty/Netty01-nio.md):NIO三大组件(Channel, Buffer, Selector);网络编程概念和常用方法(阻塞、非阻塞;Selector;accept事件等);NIO的零拷贝 * [Netty入门](./Java_netty/Netty02-入门.md):Netty的入门程序;Netty组件(EventLoop, Channel, Future, Handler, Pipeline, ByteBuf);双向通信练习 * [Netty进阶](./Java_netty/Netty03-进阶.md):粘包与半包;协议设计与解析;聊天室案例 * [Netty优化和源码](./Java_netty/Netty04-优化与源码.md):优化(扩展序列化算法、参数调优);RPC框架;源码(启动剖析;NioEventLoop;accept;read) ## 数据库 ### MySQL基础 * [操作数据库、表及增删改表中的数据](./Database/MySQL-basic-1.md)(DDL、DML) * [查询语句-1](./Database/MySQL-basic-2.md): 单表查询;约束;数据库设计范式 * [查询语句-2](./Database/MySQL-basic-3.md):多表查询(连接查询、子查询);事务;DCL * [MySQL syntax and functions with Leetcode examples](./Database/MySQL_syntax_funcs.md) ### MySQL进阶 ​ 极客时间 [MySQL实战45讲笔记](./database/MySQL实战45讲笔记.md) > REFs: > > * [小林coding-图解MySQL](https://xiaolincoding.com/mysql/) >* [黑马MySQL数据库优化](https://www.bilibili.com/video/BV1zJ411M7TB/) > * 高性能MySQL (High Performance MySQL) >* 极客时间 MySQL实战45讲 * [基本结构](./Database/more_MySQL_1.md) * SQL语句的执行过程:链接器、解析器、执行器 * [数据存储](./Database/more_MySQL_struc-1.md) * InnoDB数据的存放和组织方式:frm表结构文件、ibd数据文件;使用段、区、页、行组织表空间 * 单条数据的存储:行结构(额外信息+真实数据) * 页的结构和组织方式:页目录+用户记录 (槽->分组);使用B+树组织页结构 * B+Tree over B Tree:单点查询、插入删除效率、范围查询 * 索引 * [索引的分类](./Database/more_MySQL_index-1.md): * 按数据结构分:B+tree索引和数据的查找过程 * 按物理存储分:聚簇索引和二级索引 * 按字段特性分:主键、唯一、普通、前缀索引 * 按字段个数分:联合索引的最左匹配、范围查询及索引下推 * [索引优化](./Database/more_MySQL_index-2.md):explain语句;前缀优化、覆盖索引、主键自增、防止失效等 * [索引失效](./Database/more_MySQL_index-3.md):最左模糊匹配;对索引进行计算、使用函数、隐式转换;联合索引非最左匹配;OR * [COUNT](./Database/more_MySQL_index-4.md):`count(*) = count(1) > count(primary_key) > count(others) `;count的优化 * 事务 * [事务隔离级别及实现](./Database/more_MySQL_trx-1.md):ACID;隔离级别;Read View * [避免幻读](./Database/more_MySQL_trx-2.md):快照读 -> Read View;当前读 -> 记录锁+间隙锁 * 锁 * [MySQL中的锁](./Database/more_MySQL_lock-1.md):全局锁;表级锁;行级锁 * [行级锁的加锁过程](./Database/more_MySQL_lock-2.md):仅有当前读、update、delete操作会加行级锁(insert优先使用隐式锁) * [死锁](./Database/more_MySQL_lock-3.md):插入意向锁与间隙锁的互斥;insert 时的加锁过程;死锁的解决方法 * [日志](./Database/more_MySQL_log-1.md):undo log, redo log, binlog;WAL;两段式提交;update语句的执行过程 ### JDBC * [JDBC](./Database/JDBC-1.md):使用步骤;对象详解;抽取JDBC工具类;事务 * [连接池](./Database/JDBC-2.md):C3P0;druid;Spring JDBC框架(JdbcTemplate) ### Redis > REFs: > > * [图解Redis](https://xiaolincoding.com/redis/) [Redis在线环境](https://try.redis.io/) * [Redis笔记](./Database/redis-1.md):Redis下载安装;Redis中的命令操作(存储不同类型的数据);持久化配置;Jedis使用、连接池;编写Jedis工具类 * [Redis数据结构与应用场景](./Database/redis-2.md) * String:int/SDS; 缓存、计数、分布式锁、session共享 * List:压缩列表/双向链表;消息队列 * Hash:压缩列表/哈希表;可变对象,如购物车 * Set:哈希表/整数集合;聚合计算、点赞、抽奖等 * Zset:压缩列表/跳表;排行榜、电话姓名排序 * 其他:BitMap (二值统计);HyperLogLog (海量数据统计);GEO (地理信息);Stream (消息队列) * [Redis底层数据结构](./Database/redis-3.md) * SDS:记录了长度和容量的字符串结构,底层使用字符数组进行保存,可扩容,不会发生缓冲区溢出 * 链表:双向链表,头尾节点 * 压缩列表:连续空间,每个节点存储上一个节点的长度,存在连锁更新问题 * 哈希表:链式哈希解决冲突,扩容时通过两个哈希表进行渐进式rehash * 整数集合:数组,元素类型变长时可进行升级操作 * 跳表:遍历每个level进行查找,随机生成层数,skiplist over balanced-tree * quicklist:双向链表+压缩列表;listpack:类似于压缩列表,但不再记录前向节点的长度,避免连锁更新 * [Redis持久化](./Database/redis-4.md) * RDB:数据全量备份;采用子进程进行备份,备份期间的数据操作不会被保存;父子进程所映射的物理内存采用写时复制机制 * AOF:操作命令增量备份;先进行操作再写日志;子进程负责日志重写,重写期间的操作父进程记录在重写缓冲区中 * [过期删除和内存淘汰策略](./Database/redis-5.md): * 过期删除策略:定时、惰性、定期删除 * 内存淘汰策略:LRU:随机抽样,删除最久没有使用的;LFU:访问key时先衰减,再增加 * [Redis高可用](./Database/redis-6.md): * 主从复制:全量复制、基于长连接的命令传播、增量复制 * 哨兵:监控故障节点、哨兵leader负责指定主节点和主从故障转移 * 应用场景问题: * [缓存](./Database/redis-7.md):缓存雪崩(大量key同时过期或Redis宕机)、缓存击穿、缓存穿透 * [数据一致性](./Database/redis-8.md):先更新数据库,再删除缓存 ## JavaWeb > REFs > > * [黑马程序员. JavaWeb全套教程. B站](https://www.bilibili.com/video/BV1qv4y1o79t) * [本地web项目和服务器部署项目的目录对应关系](./JavaWeb/DirectoryStructure.md) * [JavaWeb速查速记](./JavaWeb/JavaWeb速查速记.pptx) ![JavaWeb速查速记](https://gitee.com/jy-liu6277/pic4-note/raw/master/20210810122210.jpg) ### 前端基础 * [HTML](./JavaWeb/HTML.md) * [CSS](./JavaWeb/CSS.md) * [JavaScript](./JavaWeb/JavaScript.md): 1. ECMAScript的基础语法和对象(Function、Global对象等) 2. BOM对象(Window、Location、History对象等) 3. DOM对象(Document对象等);HTML DOM(innerHTML属性) 4. 事件 * [BootStrap](./JavaWeb/BootStrap.md):项目中BootStrap的引入;响应式布局;样式和插件 * [XML](./JavaWeb/XML.md):XML文件的组成和解析 * [JQuery](./JavaWeb/JQuery.md):选择器;DOM操作;动画效果;遍历;事件绑定;插件 * [Ajax & JSON](./JavaWeb/Ajax&Json.md):JQeury发起Ajax请求的方式;定义和解析JSON;JSON数据和Java对象的互相转换(jackson) * [VUE/ElementUI](./JavaWeb/Vue和Element.pdf) ### Servlet * [Tomcat服务器](./JavaWeb/Tomcat.md):Tomcat的安装和配置;IDEA中集成Tomcat创建Web项目 * [Servlet概述](./JavaWeb/Servlet.md):执行原理;Servlet接口中的方法;Sevlet注解;Servlet体系结构;多个虚拟路径配置 * [Http协议概述](./JavaWeb/Http.md):Http请求消息和响应数据的格式 * [Servlet-Request对象](./JavaWeb/Servlet-Request.md):获取请求对象中的参数;请求转发;Request对象共享数据;用户登录案例(BeanUtils工具类的使用) * [Servlet-Response对象](./JavaWeb/Servlet-Response.md):对响应对象的设置;重定向;ServletContext对象(Mime类型获取、共享数据、获取文件真实路径);从服务器下载资源 * [Cookie & Session](./JavaWeb/Cookie&Session.md):通过Cookie和Session进行数据共享的方法、原理及区别 * [JSP](./JavaWeb/JSP.md):JSP中的指令和9个内置对象;EL表达式取值;JSLT标签完成判断和遍历 * [案例一](./JavaWeb/案例一.md):增删改查、分页显示、条件查询 * [Filter & Listener](./JavaWeb/Filter&Listener.md):过滤器生命周期和执行流程;过滤器配置;登录验证过滤器;敏感词过滤(动态代理);Context对象监听 ### Tomcat > REFs: > > * [手写Tomcat](https://www.liaoxuefeng.com/wiki/1545956031987744) > * [pdai: Tomcat知识体系详解](https://www.pdai.tech/md/framework/tomcat/tomcat-overview.html) Tomcat是基于Java Servlet规范实现的Web服务器。主要通过Connector管理连接、通过Context处理请求。当Servlet容器接收到用户的HTTP请求后,由容器负责把请求转换为`HttpServletRequest`和`HttpServletResponse`对象,分别代表HTTP请求和响应,然后,经过若干个Filter组件后,到达最终的Servlet组件,由Servlet组件完成HTTP处理,将响应写入`HttpServletResponse`对象 Connector 模块是Web服务器的实现。所谓连接器 (Connector) 就是一个连接客户和应用服务器的桥梁,它接收用户的请求,并把用户请求包装成标准的Http请求(包含协议名称,请求头Head,请求方法是Get还是Post等等)。同时,这个子模块还按照标准的Http协议,负责给客户端发送响应页面 Context 代表整个容器的信息,全局唯一。如果容器实现了`ServletContext`接口,也可以把`ServletContext`可以看作容器本身。负责调用`Servlet`、`Filter`和`Listener`三大Web App组件。具体职责如下: * Servlet 的加载、实例化、匹配和调用。Context中保存所有的 ServletRegistration,以及包含路径匹配信息的 ServeltMapping。初始化过程中ServletContext负责加载所有的Servlet并进行实例化;处理web请求时由Connector调用ServletContext的`process()`方法,ServletContext负责根据访问路径信息匹配相应的Servlet处理请求,返回响应。 * Filter 的加载、实例化、匹配和调用。与Servlet类似,Filter的管理和调用也由ServletContext负责。每次请求时会过滤出相应的Filter,生成FilterChain对象并依次调用Filter中的`doFilter()`方法,完成请求和响应的拦截过滤。 * Listener 的加载、实例化和调用。加载并管理不同类型的Listener,在Event发布后依次调用所有的EventListener。具体的Listerner由Web App进行实现。 * HttpSession的管理。为每个TCP连接生成一个Session,可根据Cookie获取对应的Session,并定期删除处于非活跃状态的Session。 * [Tomcat设计](./JavaWeb/Tomcat-1.md) * 架构设计:Service 中 包含 Connector 和 Engine,大量运用组合模式 * 初始化和类加载:父子容器层级初始化,实现自己的类加载器(避免加载不到和实现容器隔离) * 生命周期和监听机制:LifeCycle接口统一管理生命周期,使用监听器机制在生命周期过程中触发相应事件 * Connector和线程池:Acceptor 接收新的Socket连接,Poller监听SocketChannel并封装任务对象提交给线程池,Executor线程池提交任务给Engine实现请求的处理 * 请求处理流程:通过Pipeline-Valve实现责任链模式 * [JerryMouse实现 repo](https://github.com/JiayangLJY/jerrymouse.git) 黑马旅游 [项目笔记](./JavaWeb/项目-黑马旅游travel.md) * 为加速访问,前端页面均为HTML。前后端传递请求和响应数据多通过Ajax完成 * 注册功能:生成uuid最为激活码发送至用户邮箱,注册后需要激活账户 * 登录和退出:登录后将用户信息保存在服务端的Session域对象中 * 抽取Servlet(动态代理):HttpServlet <-- BaseServlet <-- XxxServlet,BaseServlet充当代理 * Resdis缓存优化数据展示:将常用数据(如分类信息)缓存至Redis中,减轻数据库负担 * 分页展示:前端:控制展示条目和分页栏内容;后端:limit查询 * 模糊查询:根据参数的有无进行动态sql的拼接 ### Nginx * [安装与配置](./JavaWeb/Nginx_1_安装与配置.pdf):Nginx的安装方式(源码和yum);目录结构分析(conf, html, logs, sbin);Nginx的启动停止命令;核心配置文件结构(全局块、events块、http块) * [静态资源访问](./JavaWeb/Nginx_2_静态资源访问.pdf):服务搭建实例;Nginx静态资源部署(http块配置) * [反向代理](./JavaWeb/Nginx_3_反向代理.pdf):upstream, proxy_pass, proxy_set_header, proxy_redirect * [负载均衡和缓存](./JavaWeb/Nginx_4_负载均衡和缓存.pdf) * [部署](./JavaWeb/Nginx_5_部署.pdf) ## SSM框架 ### Spring > REFs > > * [黑马程序员. SSM框架教程. B站](https://www.bilibili.com/video/BV1WZ4y1P7Bp) **Spring + SpringMVC 使用** * [IoC和配置文件](./SSM/Spring-01.md): * Spring开发:导入Spring依赖,配置文件 (XML + ``),获取ApplicationContext对象,`getBean()` * Bean的范围(Singleton, Prototype, Request, Session);生命周期配置(init, destroy);Bean实例化的三种方式(无参构造方法、静态工厂、实例工厂) * 依赖注入:通过`Setter + `;通过`Constructor + ` * ApplicationContext继承结构,`getBean(objName), getBean(Class)` * 加载外部配置文件 ` ` * [Spring注解](./SSM/Spring-02.md): * 实例类Bean:`@Component, @Controller, @Service, @Repository` * 注入属性:对象属性`@Autowired (@Qualifier)`, `@Resource`;普通属性`@Value` * 配置相关:`@Configuration, @ComponentScan @Bean, @PropertySource, @Import` * Spring集成Junit测试环境;Spring整合web环境(通过监听器生成应用上下文对象) * [JdbcTemplate](./SSM/JdbcTemplate.md):Spring产生JdbcTemplate对象 * [SpringMVC快速入门](./SSM/SpringMVC-01.md):SpringMVC的配置流程;SrpingMVC组件的基本解析 * [SpringMVC的请求和响应](./SSM/SpringMVC-02.md) * 数据响应方式: * 页面跳转:配置`ViewResolver`返回字符串、返回ModelAndView对象 * 回写数据:`@ResponseBody` 回写字符串、回写JSON(手动拼接JSON或配置HandlerAdaptor) * 获取请求数据: * `@RequestParam` 参数绑定注解; `@PathVariable` RESTful风格下获取请求路径中的参数;`@RequestHeader` 获取请求头信息;`@CookieValue` 获取Cookie的值;`@ReqeustBody` 用于POST请求获取JSON数据 * 方法形参注入 HttpServletRequest、HttpServletResponse、HttpSession 获取Servlet相关API * 配置``或 DefaultHandler 静态资源访问的开启;配置Filter解决请求数据乱码问题;自定义类型转换器 * 文件上传:配置 `MultipartResolver`,通过 MultipartFile 形参接收文件 * [SpringMVC拦截器](./SSM/SpringMVC-03.md):实现`HandlerInterceptor`接口,配置 `` * [SpringMVC异常处理](./SSM/SpringMVC-04.md):SpringMVC的前端控制器提供统一的异常处理,可实现`HandlerExceptionResolver`接口或使用`@ControllerAdvice + @ExceptionHandler`注解自定义异常处理方法 * [Spring-AOP](./SSM/Spring-AOP.md):动态代理的实现方式;基于注解的AOP开发`@EnableAspectJAutoProxy, @Aspect `;切点表达式 * [Spring事务控制](./SSM/Spring-03.md): * PlatformTransactionManager (get, commit, rollback), TransactionDefinition (isolation_level, propogation), TransactionStatus (isCompleted, hasSavepoint) * 基于xml的事务控制:注入事务管理器``,将事务器配置为通知类`` ,织入事务`` * 注解式事务控制:`TxConfig` 配置类开启事务并注入事务管理器,类和方法上加入`@Transactional`注解开启事务 > Example: SpringMVC xml 文件配置 > > * [总体说明](./SSM/SpringMVC-xml-config/eg.md):Controller(web)层采用注解配置,service和dao层采用配置文件进行配置 > * [web.xml](./SSM/SpringMVC-xml-config/eg-web.xml)文件:配置applicationContext.xml文件作为全局初始化参数;配置Spring监听器读取配置文件;注册SpringMVC的前端控制器;注册字符编码过滤器 > * [applicationContext](./SSM/SpringMVC-xml-config/eg-applicationContext.xml)文件:加载jdbc配置文件,生成数据源对象和JdbcTemplate对象;注入service层和dao层实例对象 > * [spring-mvc](./SSM/SpringMVC-xml-config/eg-spring-mvc.xml)文件:配置mvc注解驱动;mvc内部视图解析器;放行静态资源文件;扫描配置组件(Controller层);拦截器、异常处理等 > * [pom.xml](./SSM/SpringMVC-xml-config/eg-pom.xml)文件:依赖配置;JDK编译版本配置 **Spring深入理解** * [Spring-IoC](./SSM/Spring-ad-IoC.md):常用注解分析:由于注解驱动的注解;创建对象和赋值的注解;Bean的生命周期相关注解;注入时间和注入条件注解 * [Spring-AOP](./SSM/Spring-ad-AOP.md):AOP注解开发;AOP原理:初始化后置处理器、拦截切面类和目标类、获取切点和通知方法创建代理对象、运行时获取拦截器链并进行增强;声明式事务控制 * [Spring容器初始化过程及原理扩展](./SSM/Spring-ad-ext.md):`refresh()`方法执行的具体流程 * [Servlet整合SpringMVC](./SSM/Spring-ad-MVC.md):Servlet3.0注解开发的特性的使用;web组件自动注册的原理和实现;定制Spring MVC;Servlet3.0的异步请求 * [SpringMVC原理](./SSM/Spring-ad-MVC02.md):前端控制器、处理器映射器、处理器适配器的工作;参数解析;拦截器;异常处理 ### MyBatis **MyBatis使用** * [MyBatis快速入门](./SSM/MyBatis-01.md):MyBatis的基础开发流程(映射文件UserMapper.xml、核心配置文件SqlMapConfig.xml) * [MyBatis的dao层接口实现](./SSM/MyBatis-02.md):通过统一mapper映射文件和dao层接口,省去dao层具体实现类的编写 * [Mapper映射文件深入](./SSM/MyBatis-03.md):动态sql语句的拼接(if标签、foreach标签、返回自增主键) * [MyBatis核心配置文件深入](./SSM/Mybatis-04.md):properties加载配置文件;typeAliases别名映射;typeHandlers类型处理器;plugins插件(如分页助手);environments数据源环境;mappers映射文件 * [MyBatis多表操作](./SSM/MyBatis-05.md):多表联合查询结果的封装 * [MyBatis注解开发](./SSM/MyBatis-06.md):简单的增删改查操作;多表查询:一对一、一对多、多对多 **MyBatis详解** MyBatis封装了JDBC的驱动注册、建立连接、解析和预编译SQL的功能,通过读取配置文件的方式创建基于用户配置的数据源、事务管理器等组件,最终通过一系列工厂方法向用户返回SqlSession对象。同样也会扫描所有mapper配置文件,通过动态代理机制代理了用户编写的Mapper类。 SqlSession面向的是一次Java程序与数据库间的会话,内部组合了各种配置组件,并进一步封装了处理参数生成动态SQL和解析SQL执行结果的步骤。Mapper的代理对象通过执行SqlSession中定义的方法完成数据库操作。在此基础上提供了池化数据源、事务管理器配置、基于拦截器的插件配置以及缓存等支撑功能。 * 配置文件解析、Mapper代理 * SQL动态解析和参数及结果集处理 * 配置化组件、插件、缓存等支持 * [MyBatis原理](./SSM/MyBatis-more-1.md): * MyBatis 的初始化基本流程及SqlSession的执行逻辑 * 解析xml配置文件,创建 DataSource, TransactionManager 及 SqlSesion * 通过 MapperRegistry扫描并加载mapper映射文件,利用动态代理创建Mapper类 * 调用Mapper类的方法时通过匹配相应的MapperMethod最终执行SqlSession中的相应方法 * 对数据源、事务、插件及缓存的支持 * 池化数据源是非池化数据源的动态代理类,建立和关闭连接时都会通过连接池完成相应操作 * JDBC事务管理机制调用Connection的相应方法实现对事务的管理 * Executor执行时加载拦截器执行链,插件通过拦截相应的方法实现代理操作 * 一级缓存对应SqlSession,默认开启;二级缓存对应Mapper,需在相应SQL中开启缓存 * [MyBatis 实现](./SSM/MiniBatis.md): * 代理Mapper类:Proxy动态代理 * 封装JDBC各个流程:读取配置文件生成Configuration对象;配置数据源;Executor执行SQL > * Example:SSM框架整合 > * [SSM整合](./SSM/SSM.md): > * [pom.xml](./SSM/final/pom.xml):设置打包方式;编译使用的JDK版本;依赖坐标 > > * [web.xml](./SSM/final/web.xml): > * 监听器:加载spring核心配置文件; > * 过滤器:spring提供的字符编码过滤器; > * Servlet:SpringMVC前端控制器 > > * [applicationContext.xml](./SSM/final/applicationContext.xml): > * 组件扫描:提供注解开发途径,排除对controller的扫描 > * 注入MyBatis及响应配置文件:jdbc配置文件;注入数据源dataSource;注入sqlSesionFactory并加载MyBatis核心配置文件;注入mapper实现类 > > * 织入事务:注入平台事务管理器;配置事务增强advice;AOP织入事务 > > * [spring-mvc.xml](./SSM/final/spring-mvc.xml):组件扫描;配置mvc注解驱动;注入内部资源视图解析器;开放静态资源访问权限 > > * [sqlMapConfig.xml](./SSM/final/sqlMapConfig.xml):配置别名 > > * [AccountMapper.xml](./SSM/final/AccountMapper.xml):sql语句以及resultMap ### Spring Boot * [Spring Boot 入门](./SSM/SpringBoot-01.md):SpringBoot项目快速搭建;yml配置文件的读写;读取配置项;profile;配置文件的加载顺序;整合其他框架(Junit;Redis;MyBatis) * [Spring Boot 进阶](./SSM/SpringBoot-02.md): * Spring Boot 自动配置的原理 * 自动加载相关注解:@ComponentScan / @Import / @Enable * 条件加载 @Conditional * 自定义starter类 * SpringBoot事件监听 * SpringBoot启动流程分析 * SpringBoot监控(actuator / admin) * [Spring Boot starter](./SSM/SpringBoot-starter.md): * 自动装配原理 * 自定义starter ### MyBatis-Plus * [MyBatis-Plus入门](./SSM/MyBatis-plus-01.md):MP整合SSM框架;通用CRUD * [配置](./SSM/MyBatis-plus-02.md):MP配置;条件构造器 * [高级](./SSM/MyBatis-plus-03.md):ActiveRecord;配合Oracle;插件 ## 架构设计 * [笔记-从0开始学架构](./Architecture/arc_from_0.md) ## 分布式/微服务 [架构演进](./DistributedSystem/架构演进.md) * **微服务**:微服务架构风格,就像是把一个单独的应用程序开发成一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API 这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署,这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。简而言之,拒绝大型单体应用,基于业务边界进行服务微化拆分,每个服务独立部署运行。 * **分布式/集群**:分布式系统是若干独立计算机的集合,这些计算机对于用户来说像单个系统 分布式系统 (distributed system) 是建立网络之上的软件系统。分布式是指根据不同的业务分布在不同的地方。集群指的是将几台服务器集中在一起,实现同一业务 * **远程调用(RPC)**:在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称之为远程调用。SpringCloud中使用HTTP+JSON的方式来完成远程调用 * **负载均衡**:为了使每一个服务器都不要太忙或者太闲,我们可以负载均衡调用每一个服务器, 提升网站的健壮性 * **注册中心**:A服务调用B服务,A服务不知道B服务当前在哪几台服务器上有,哪些正常 的,哪些服务已经下线,解决这个问题可以引入注册中心 * **配置中心**:每一个服务最终都有大量配置,并且每个服务都可能部署在多个服务 器上,我们经常需要变更配置,我们可以让每个服务在配置中心获取 自己的配置。 配置中心用来集中管理微服务的配置信息 * **熔断/降级**:在微服务架构中,微服务之间通过网络来进行通信,存在相互依赖, 当其中一个服务不可用时,有可能会造成雪崩效应,要防止这种情况,必须要有容错机制来保护服务 * **API网关**:在微服务架构中,API Gateway 作为整体架构的重要组件,抽象服务中需要的公共功能,同时它提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流监控,日志统计等丰富功能,帮助我们解决很多API管理的难题 * 分布式锁 * [1](https://mp.weixin.qq.com/s?__biz=Mzg3NjU3NTkwMQ==&mid=2247505097&idx=1&sn=5c03cb769c4458350f4d4a321ad51f5a&source=41#wechat_redirect) * [Byte dance](https://mp.weixin.qq.com/s/-N4x6EkxwAYDGdJhwvmZLw) * [Ali](https://mp.weixin.qq.com/s/JzCHpIOiFVmBoAko58ZuGw) * [官方文档](https://redis.io/docs/manual/patterns/distributed-locks/) * [辩论](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html) ### 注册中心 Nacos #### 6.1.1 RPC技术-Dubbo 实现分布式环境下各个服务组件间的协作 * [Dubbo](./DistributedSystem/Dubbo.md):安装、入门与配置;dubbo-admin监控软件 * [Dubbo深入](./DistributedSystem/Dubbo-2.md):Dubbo高可用机制;Dubbo原理 #### 6.1.2 注册中心-Zookeeper 作为分布式应用程序的服务注册中心协调分布式服务 * [Zookeeper](./DistributedSystem/Zookeeper.md):数据结构模型;节点的操作;实现分布式锁;集群搭建 #### 6.1.3 消息队列-RocketMQ * RocketMQ * [核心功能](./DistributedSystem/RocketMQ/RocketMQ-01.md):安装与集群搭建;消息的基本发送与消费模式;顺序、延时、批量、过滤、事务消息的生产和消费 * [RocketMQ应用案例](./DistributedSystem/RocketMQ/RocketMQ-02.md):为减少用户等待时间,订单取消时发送消息至MQ,监听器负责异步处理余额、优惠券、商品库等信息 * [高级功能](./DistributedSystem/RocketMQ/RocketMQ-03.md):消息存储;高可用机制;负载均衡;消息重试;死信队列;消费幂等 * 源码分析: ### 6.2 Spring Cloud 微服务 #### 6.2.1 Spring Cloud * [SpringCloud-01](./DistributedSystem/SpringCloud01.md):微服务架构;Eureka注册中心;Ribbon负载均衡;Nacos注册中心 * [SpringCloud-02](./DistributedSystem/SpringCloud02.md):Nacos配置管理;Feign远程调用;Gateway网关 #### 6.2.2 容器化技术Docker * Docker: * [CentOS7上安装Docker和DockerCompose](./DistributedSystem/Centos7安装Docker.pdf) * [Docker实用篇](./DistributedSystem/Docker实用篇.md):Docker架构;Docker中镜像、容器、数据卷的基本操作;Dockerfile自定义镜像;Docker-Compose;Docker镜像仓库 * [Linux主机上通过docker启动服务](./DistributedSystem/linux上通过docker启动服务.md):MySQL,Redis #### 6.2.3 消息队列RabbitMQ * [RabbitMQ](./DistributedSystem/RabbitMQ.md):Publisher, Exchange, Queue, Listener组件;SpringAMQP和队列模型(Basic Queue, Work Queue, Fanout, Direct, Topic) #### 6.2.4 搜索引擎Elasticsearch * Elasticsearch * [ES使用快速起步](./DistributedSystem/ES-01.md):倒排索引;ES、Kibana的安装;ES索引库及文档的基本增删改查操作;RestClient * [ES查询及结果集处理](./DistributedSystem/ES-02.md):DSL查询文档(全文、精确、坐标及复合查询);搜索结果处理(排序、分页、高亮);RestClient查询文档 * [其他应用](./DistributedSystem/ES-03.md):数据聚合;自动补全;ES与MySQL间的数据同步;ES集群 ### 6.3 其他框架 #### 6.3.1 shiro安全框架 * [shiro](./DistributedSystem/shiro.md): ## 7. 项目实战 * [黑马健康项目](https://gitee.com/jy-liu6277/itheima_health): * 服务端使用SSM + Dubbo + Zookeeper的分布式架构 * 使用Spring_security框架进行权限控制 * Redis存储用户登录信息代替session解决分布式中数据共享的问题 * 通过FreeMarker页面静态化技术减少数据库查询操作 * Apache POI 实现对excel表的操作 * echarts实现数据可视化