自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 Spring 定义 Bean 的三种注解

大多数的人知道, @Component 注解作用在类上,可以将该类添加进spring容器。但少有人知,@ManagedBean、@Named 也能有同样的效果。因为在 spring 源码种看到 ManagedBean、Named 的存在,所以好奇的想体验一下是不是真的有相同的效果。可在 Maven 插件地址 查找对应的 maven 依赖。使用 @ManagedBean 需要使用 jsr-250使用 @Named 需要使用 jsr-330<dependencies> .

2021-04-26 23:13:58 818

原创 spring 之基于XML的方式配置 Bean

Spring 通过 IOC 容器的方式管理 Bean。在本篇,将通过 xml 配置的方式介绍如何配置 Bean。1. 常见的 xml 配置文件头解析<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p=.

2021-03-10 22:56:13 1293

原创 搭建 Springboot 项目的三种方式

万丈高楼平地起,在学习 springboot 项目时,需要先知道,框架是如何搭建成功的。Springboot 项目的项目搭建有三种方式,在线搭建、使用开发工具创建、1. 在线创建官方提供的一个创建方式,先打开 https://start.spring.io/,如下图所示按图中顺序所示,这里要配置的按顺序分别如下:Project:选择为 Maven 项目还是 Gradle 项目。Gradle 在 Android 中使用较多,Java 后端,目前来看还是 Maven 为主,因此这里.

2021-03-01 21:48:15 318

原创 Mybatis 结果集解析的原理

1564

2021-02-25 23:36:30 534

原创 Mybatis SqlSession 的那些事

Mybatis 本身就是 Java类 与 数据库 之间的桥梁。SqlSession 就是不可或缺的一部分。故事的开头,回到使用层面。先来看 sqlSession 的诞生之路。try { //获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSession.

2021-01-18 01:12:16 261 1

原创 Java 解析 xml 的四种方式的使用篇

在使用框架时,基本上都有 xml 文件的配置,那么又是怎么进行解析的呢?XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。首先定义一个公用的 xml 文件,方便后面讲解。<?xml version="1.0" encoding="UTF-8"?><persons> <person id="1"> <name>lee</name> .

2021-01-15 00:29:42 183

原创 Mybatis 中 NodeHandler 的详解析

类似 xml 文件的解析,sql 的解析属于标签对的解析。在故事的开头,我们无非就是想要创建一个 SqlSource,那就从方法开始。@Overridepublic SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType) { XMLScriptBuilder builder = new XMLScriptBuilder(configuration, .

2021-01-14 00:32:04 533 3

原创 Mybatis 中 SqlNode 接口的详解析

sqlNode 如其名,用于存储 sql 的 Node 节点,Mybatis 中可使用 if、where 等标签,也就是说,拥有对应的 Node 节点进行相应的节点进行处理。1. SqlNode 接口就一个简单的 apply 抽象函数,具有 八个直接子类实现类public interface SqlNode { boolean apply(DynamicContext context);}1.1 MixedSqlNode混合的 sqlNode,将多个 sqlNode 集合p.

2021-01-11 00:03:44 1134

原创 Mybatis 中 ${} 与 #{} 的区别

Mybatis 的源码不叫错综复杂,通过问题探究原理,不执著于细节。1. ${} 与 #{} 的区别

2021-01-10 01:13:29 314 2

原创 Mybatis 之 mapper.xml 子节点的详解篇

先占位,还没开写。

2020-12-28 19:23:31 952

原创 Mybatis 之 mybatis-config.xml 子节点的详解篇

双篇同线进行 mybatis-config.xml 文件的解析。还没开写,先占位置。

2020-12-26 01:37:10 439

原创 Mybatis 的脉络梳理02之解析Mapper.xml

上篇讲到 Mybatis 加载 mybatis-config.xml 各种属性的大致过程。那么问题来了,它又是怎么跟 Mapper.xml 文件进行关联的呢?回看 mapper 的配置,正是mybatis-config.xml、Mapper.xml两个xml文件之间的映射。映射分为两类,resource、url 对应的是 Mapper.xml 文件映射,package、class 对应的是 接口映射。1. 俩 xml 的文件映射1.1 通过指定 Mapper.xml 文件映射当前映射通.

2020-12-22 01:13:41 317

原创 Mybatis 的脉络梳理01之解析mybatis-config.xml

Mybatis 最主要的就是 mybatis-config.xml 和 Mapper.xml 这两个 XML 文件。mybatis-config.xml 用于 mybatis 环境的配置,Mapper.xml 用于实体类与数据库之间的交互,使用户避免大量的 jdbc 代码。1. Mybatis 如何解析 mybatis-config.xml 文件既然要知道如何解析,那么就从使用开始。最简单的使用如下:String resource = "mybatis-config.xml";InputSt.

2020-12-21 00:48:43 208

原创 Mybatis 的简单示例

到这里,默认你使用过 Mybatis,且知道什么是 maven 项目。公用的实体类public class User { private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } .

2020-12-17 17:40:27 112

原创 Mybatis 核心配置篇 configuration 属性详解

1. properties(属性)属性有三种配置方式,会按照一定的顺序加载并覆盖,则先加载的优先级更低第一优先:在代码中直接通过 properties 传入 build 方法。第二优先:通过 resource 或者 url 读取到的 properties 文件中属性。第三优先:直接在 properties 内的子标签 property 内定义的属性。<!-- resource 与 url 不能同时配置,否则抛出异常 --><properties resource="d

2020-12-17 01:13:38 817

原创 Mybatis 开路篇之简单使用

1. 先来看原始的连接数据库方式连接数据库总共分为 7 个步骤package cn.cerish.ibatis.primitive;import java.sql.*;public class PrimitiveTest { private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/myb

2020-12-16 16:22:44 91

原创 Java CountedCompleter 与 ForkJoinTask 的代码篇

在看 ConcurrentHashMap 的源码时,BulkTask extends CountedCompleter,CountedCompleter extends ForkJoinTask,那么我们也按照这个继承顺序,一探究竟。1. invoke 看 ForkJoinTask 的各种状态值

2020-12-14 22:57:21 212

原创 java CountedCompleter 源码详解

1. CountedCompleter 的类定义CountedCompleter 继承了 ForkJoinTask,即为一个异步任务public abstract class CountedCompleter<T> extends ForkJoinTask<T> {}1.1 CountedCompleter 的构造函数CountedCompleter 共有三个构造函数protected CountedCompleter(CountedCompleter<?&

2020-12-12 00:14:18 287 3

原创 java 分而治之的框架 ForkJoinTask

Java 提供 Fork/Join 框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务的执行结果得到这个大任务的最终结果。1. ForkJoinTask 的类定义从定义可以看出,ForkJoinTask 实现 Future,Serializable。即 ForkJoinTask 是可异步、可序列化的抽象类任务。public abstract class ForkJoinTask<V> implements Future<V>,.

2020-12-11 23:17:55 922

原创 ConcurrentHashMap 源码分析11完结篇之 merge()、treeifyBin()、untreeify()及线程安全

1. size()获取当前map的元素个数public int size() { long n = sumCount(); return ((n < 0L) ? 0 : (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int)n);}/* 真正获取元素个数的方法 */final long sumCount() { /* 元素个数 = baseCount + c

2020-12-11 00:43:59 484

原创 ConcurrentHashMap 源码分析10函数篇之 Iterator、Spliterator、keySet

此篇相关的类在 02 篇。1. keys()获取 key 值的迭代器public Enumeration<K> keys() { Node<K,V>[] t; int f = (t = table) == null ? 0 : t.length; return new KeyIterator<K,V>(t, f, 0, f, this);}2. keySet()、keySet(V mappedValue)获取 key 值的.

2020-12-10 23:41:31 513

原创 ConcurrentHashMap 源码分析09函数篇之 reduce 详解

与 forEachTask 类似,new 对应的内部类,执行 invoke() 方法,底层调用 compute() 方法。1. reduce 相关函数public <U> U reduce(long parallelismThreshold, BiFunction<? super K, ? super V, ? extends U> transformer, BiFunction<? sup.

2020-12-09 23:59:03 739

原创 ConcurrentHashMap 源码分析08函数篇之 forEach、 search详解

1. forEach(BiConsumer<? super K, ? super V> action)使用 Traverser 类的 advance 方法获取下一元素,遍历直至获取到 nullpublic void forEach(BiConsumer<? super K, ? super V> action) { if(action == null) throw new NullPointerException(); Node<K,V>[] t;

2020-12-09 01:44:08 2195

原创 ConcurrentHashMap 源码分析07之函数篇 get、compute方法详解

1. get()public V get(Object key) { Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek; int h = spread(key.hashCode()); // 获得 hash 值 /* tab 不为 null && tab数组长度 > 0 && tab对应桶位不为空 */ if ((tab = table) != null &

2020-12-07 23:08:26 2682

原创 ConcurrentHashMap 源码分析06之函数篇 移除方法详解

1. remove移除 key 元素对应的节点/* 两个重载函数,区别在于是否指定元素的value值,底层都是调用 replaceNode */public V remove(Object key) { return replaceNode(key, null, null);}public boolean remove(Object key, Object value) { if(key == null) throw new NullPointerExcepti

2020-12-07 00:12:32 1324

原创 ConcurrentHashMap 源码分析05之函数篇 put 详解

前面巨多属性与内部类,看得我云里雾里,结合函数的执行过程,可能就比较容易懂了吧。1. put(K key, V value)指定 key,value,若存在,则替换value值并返回旧值,若不存在,则新建节点值并返回null。public V put(K key, V value) { return putVal(key, value, false);}/* onlyIfAbsent: 若为true,表示旧值不给替换 */final V putVal(K key, V value.

2020-12-06 01:28:37 335 3

原创 ConcurrentHashMap 源码分析04之内部类ReduceTask

1.3.35 ReduceKeysTask@SuppressWarnings("serial")static final class ReduceKeysTask<K,V> extends BulkTask<K,V,K> { final BiFunction<? super K, ? super K, ? extends K> reducer; K result; ReduceKeysTask<K,V> rights, ne

2020-12-02 01:19:42 295

原创 ConcurrentHashMap 源码分析03之内部类ForEachTask、SearchTask

1.3.22 BulkTask处理批量任务,众多子类,基本上包含Task的内部类就是其子类abstract static class BulkTask<K,V,R> extends CountedCompleter<R> { Node<K,V>[] tab; // tab 数组 Node<K,V> next; // 下一节点 TableStack<K,V> stack, spare; // 存储信息

2020-12-02 01:07:07 358 2

原创 ConcurrentHashMap 源码分析02之内部类Traverser、View篇

1.3.8 TableStack<K,V>保存当前正在遍历的数组以及索引信息static final class TableStack<K,V> { int length; // 长度 int index; // 索引 Node<K,V>[] tab; // 数组 TableStack<K,V> next; // next 指针}1.3.9 Traverser<K,V>主要用于遍历操作,有Base

2020-12-01 22:21:25 398

原创 ConcurrentHashMap 源码分析01之类定义、属性、内部类

都知道 HashMap 是线程不安全的。那应该怎么解决呢?除了 Collections 工具类实现(底层重要方法加上Synchronize关键字),就是本文的ConcurrentHashMap,采用了粒度更小的片段加锁方式。1. 类的定义虽然名字中也有 HashMap,但是并没有继承 HashMap。ConcurrentHashMap 继承 AbstractMap,实现 ConcurrentMap、Serializable,即表示是一个可序列化的 Mappublic class Concur.

2020-11-30 23:03:34 145

原创 TreeMap 源码分析04之forEach()、replace()、replaceAll()、buildFromSorted() 及线程安全问题

1. forEach遍历每个节点,执行 action 动作@Overridepublicvoid forEach(BiConsumer<? super K, ? super V> action) { /* null 异常检测 */ Objects.requireNonNull(action); int expectedModCount = modCount; /* 获取第一个节点getFirstEntry(),e 设置为后继节点 successor(e) */

2020-11-30 01:24:01 458

原创 TreeMap 源码分析03函数篇之迭代器、子map

1. keySet()、navigableKeySet()key 值集合,底层都是使用 KeySet 集合public Set<K> keySet() { return navigableKeySet();}public NavigableSet<K> navigableKeySet() { KeySet<K> nks = navigableKeySet; return (nks != null) ? nks : (navigableK

2020-11-29 23:46:25 233

原创 TreeMap 源码分析02函数篇之添加、获取、导航方法

1. 简单函数系列/* 返回元素个数 */public int size() { return size; }/* 是否包含指定的key */public boolean containsKey(Object key) { return getEntry(key) != null; }/* 是否包含指定的value值,从 getFirstEntry()获取首节点(最小节点)开始 */public boolean containsValue(Object value) { /* 查找 e 的后继

2020-11-29 18:11:13 284

原创 TreeMap 源码分析01之类定义、属性、内部类

1

2020-11-29 11:21:35 180

原创 LinkedHashMap源码分析03之函数使用及线程安全

1. 函数使用示例package cn.cerish.container.map.linkedHashmap;import java.util.HashMap;import java.util.LinkedHashMap;public class LinkedHashMapTest { public static void main(String[] args) { HashMap<String, Integer> hashMap = new HashMap&

2020-11-25 18:13:51 2209

原创 LinkedHashMap源码分析02之函数篇

1. get(Object key)获取指定 key 的 value 值,找不到返回 nullpublic V get(Object key) { /* 获取 key节点,为 null 直接返回 null */ Node<K,V> e; if ((e = getNode(hash(key), key)) == null) return null; /* 不为 null 判断 accessOrder,为true 执行 afterNodeAccess

2020-11-25 01:09:27 524

原创 LinkedHashMap源码分析01之类定义与内部类

有了 HashMap,为什么还要有 LinkedHashMap 呢?细心的人可能注意到,HashMap put 的顺序与输出顺序不一致,LinkedHashMap 刚好解决了这一点。1. 类的定义可以看到,LinkedHashMap 继承了 HashMap,即 HashMap 有的特性,LinkedHashMap 都有。public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map&.

2020-11-24 20:08:16 116

原创 HashMap的扩容因子为什么是0.75?为什么链条长度超过8转化为红黑树?

1. 扩容因子为什么是0.75?static final float DEFAULT_LOAD_FACTOR = 0.75f;源码中给出的解释如下:负载因子是0.75的时候,空间利用率比较高,而且避免了相当多的Hash冲突,使得底层的链表或者是红黑树的高度比较低,提升了空间效率。给出的扩容因子过高,提升了空间占用,但 hash 冲突比较严重,影响查找效率。过低查找效率高,但空间占用低,0.75 是进行多次试验后的最佳均衡点。 /* * <p>As a general rule, t

2020-11-24 20:07:27 1750

原创 HashSet 源码分析及线程安全问题

Set 集合最常见的实现类就是 HashSet,就以它为例来讲。1. HashSet 的定义详解定义很简单,继承抽象set,实现接口Set,可复制、可序列化public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable1.1 HashSet 的构造函数HashSet 有五个构造函数,可以指定初始集合,初始.

2020-11-24 14:10:46 2231 2

原创 HashMap 源码分析08之merge()、comparableClassFor()、compareComparables() 及 线程安全问题

1. merge()给定 key、value,若找到 key 对应的节点Node,执行 v = Node.value != null ? remappingFunction.apply(Node.value, value): v,根据 v 是否为 null 判断更新节点还是删除节点找不到 Node 则直接添加新节点(key,value)@Overridepublic V merge(K key, V value, BiFunction<? super V, ? super V,

2020-11-23 01:28:57 270

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除