自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Mybatis源码分析 15】mybatis整合redis做二级缓存

目录MyBatis二级缓存出现的原因使用mybatis自带的二级缓存mybatis配置文件中settings开启二级缓存@CacheNameSpace使用二级缓存@Cacheable添加缓存@CacheEvict清除指定区域的缓存测试debug打印日志PerpetualCache的实现原理外接第三方缓存pom.xml中添加mybatis-redis依赖resource资源文件夹下配置redis.properties二级缓存的应用场景二级缓存缺点.

2020-07-05 13:45:26 278

原创 【Java 基础 22】死锁、活锁、线程饥饿的区别

目录死锁死锁产生条件避免死锁线程饥饿活锁死锁两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。死锁产生条件资源互斥 不可剥夺 请求与等待 循环等待避免死锁锁排序 超时放弃线程饥饿一直有优先级更高的线程先获取到锁资源,导致其任务一 直无法进展的一种活性故障。比如高并发的环境下使用非公平(Non-fair)的ReentrantLock就容易出现线程饥饿的情况活锁线程一直处.

2020-06-28 22:53:35 197

原创 【Java 基础 21】HashMap、HashTable、ConcurrentHashMap插入新数据,什么时候扩容,怎么扩容(源码分析)

目录HashMapHashTableConcurrentHashMapHashMap插入新数据:检查table是否为null或数据为空(table的初始化发生在第一次put数据时); 计算新数据在table的索引i = (length-1) & hash(key); 判断table索引处是否存在key数据,通过 (k = p.key) == key || (key != null && key.equals(k)); 如果该索引处没有数据,则直接插.

2020-06-27 22:56:27 505

原创 【Mybatis源码分析 14】mybatis连接池源码分析

什么是连接池存储连接的容器为什么要使用连接池由于每次执行sql语句都去创建connection和使用完销毁耗时,使用连接池来管理连接,提高连接的使用率(跟java线程池的概念类似)源码分析mybatis提供三种数据库连接池的选择配置文件的enviroment节点的datasource子标签1. type="POOLED",对应org.apache.ibatis.datasource.pooled.PoolDataSource连接池;2. type="UNPOOLED, 对应o

2020-06-26 21:18:16 346

原创 【Spring源码分析 1】使用Maven配置Spring步骤,Spring的Bean创建以及属性注入的源码分析

目录1. Maven项目配置Spring1.1 pom.xml中导入spring、日志和测试的依赖包1.2 定义实体类1.3 定义spring的配置文件applicationContext.xml(bean标签属性和子标签解释)2. 测试代码3. 源码解析3.1解析bean,生成beanDefinition,注册到beanFactory3.1.1 解析bean工作的关键实现3.1.2 注册beanDefinition工作的关键实现3.2 读取beanFactory..

2020-06-23 00:20:08 958

原创 【Spring源码分析 前言】spring框架的概述、特点、核心技术

spring框架的概述作为一个开源的设计层面框架,解决业务逻辑和其他各层的耦合问题,是一个分层的Java EE/SE一站式的轻量级开源框架,具有高内聚、低耦合的特点。spring框架的特点1. 作为工厂,将对象创建和依赖关系维护交给spring管理2. 支持AOP编程,对某些方法增强3. 支持声明式事务,通过配置完成对事务的管理4. 支持整合Junit4测试,可以通过注解方便测试spring程序5. 方便集合其他优秀框架,比如mybatis,hibernate等spring框

2020-06-06 12:14:59 196

原创 【Mybatis源码分析 13】mybatis核心思想-动态代理,由此梳理一下反射、动态代理及其和静态代理的区别

代理代理类的作用就是隐藏具体的被代理对象,可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。静态代理运行前就定义好了静态代理类和被代理类之间的关系,并且静态代理类和被代理类应该共同实现同一个接口。静态代理实现了目标对象的所有方法,一旦目标接口增加方法,代理对象和目标对象都要进行相应的修改,增加维护成本。动态代理通过代理对象将被代理对象的方法和参数传递给InvocationHandler的invoke方法统一执行。其中涉及三个重要的内容:反射、Pr.

2020-06-03 22:12:43 209

原创 【Mybatis源码分析 12】mybatis的一级缓存和二级缓存,@CachNamespace注解开启mapper接口的二级缓存

1. 一级缓存默认开启,属于SqlSession级别同一个SqlSession执行查询,结果存储在缓存中,下次查询直接从缓存中取,直到进行了插入、修改或删除等操作或手动清空缓存。2. 二级缓存,属于mapper级别1)全局配置文件中settings设置开启二级缓存2)映射文件中使用cache标签3)pojo对象实现Serializable(二级缓存的只读属性设置为false,每次从缓存中拿到查询结果的副本,就是通过对象反序列化得到的,所以要求pojo对象实现序列化接口)mapper.

2020-06-03 00:41:57 765

原创 【Mybatis源码分析 11】多表查询一对一、多对一、一对多、多对多,@One和@Many实现分步查询,fetchType控制延迟加载

当某个字段比较占内存,但不常用时,比如存储一本书book,分很多章节,章节内容不需要在浏览的时候就查询获取到,只需要章节标题标识即可,这中情况下多进行分表存储,采用分布查询的方式获取章节内容。数据库准备:bookbody 记录章节标题(title)和章节内容(booy),book记录章节(chapter)、章节标题(title)、该章节是否免费(isfree)和该章节内容是否下载(loaded)#建表CREATE TABLE bookbody (title VARCHAR(255) NOT N

2020-06-02 17:53:55 699

原创 【Mybatis源码分析 10】多条件组合查询又不想写很多@Select+dao方法,通过SqlProvider实现动态sql增强dao方法的复用性

目录@Select、@Insert、@Update、@Delete指定sql@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider引用SqlProvider类的方法根据参数生成动态sqlSqlProvider实现动态sql源码分析,关键对象ProviderSqlSource@Select、@Insert、@Update、@Delete指定sql数据库准备:假设体育比赛项目报名,添加form表格,记录报名学生的..

2020-06-02 15:07:24 431

转载 【数据库篇 7】INNER JOIN、 LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN

以下内容来自https://www.cnblogs.com/rickons/p/9663039.htmlINNER JOIN 关键字在表中存在至少一个匹配时返回行。LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。FULL OUTER JOIN 关键字只要

2020-06-01 22:15:46 164

原创 【Mybatis源码分析 9】@Param命名参数源码详解

【Mybatis源码分析 8】mybatis的mapper接口中dao方法并没有具体实现类,是怎么通过mapper动态代理运行的中讲到mybatis使用mapper接口方法,通过MapperProxy动态代理去执行MapperMethod的execute方法,从而执行CRUD操作。在MapperMethod对象创建的时候,初始化它的MethodSignature子类的实例成员时,会实例化一个ParamNameResolver参数名解析器,作用时将接口方法的注解描述的sql语句中的参数名解析为接口方法入参

2020-06-01 16:42:30 424

原创 【Mybatis源码分析 8】mybatis的mapper接口中dao方法并没有具体实现类,是怎么通过mapper动态代理运行的

准备工作1. 定义UserDAO接口,提供一个SelectByName抽象方法package DAO;import Entity.User;import org.apache.ibatis.annotations.*;@Mapperpublic interface UserDAO { @Select("select * from manage where name = #{name}") List<User> selectByName(String nam

2020-06-01 14:48:31 551

原创 【Mybatis源码分析 7】mapper.xml获取参数的两种方式源码分析:${}和#{},两种传参方式的差别

【Mybatis源码分析 6】XMLConfigBuilder将Mybatis全局配置文件.xml中设置的节点提取赋给Configuration对象中讲到SqlSessionFactoryBuilder创建SqlSessionFactory对象时,SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resource);将mybatis的全局配置文件中的11个节点提取并处理后赋给Configuration对象,其中就有map

2020-05-31 23:58:34 616

原创 【Mybatis源码分析 6】XMLConfigBuilder将Mybatis全局配置文件.xml中设置的节点提取赋给Configuration对象

mybatis的全局配置文件mybatis的全局配置文件中引用了mybatis-3-config.dtd<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration

2020-05-30 23:58:03 252

原创 【Mybatis源码分析 5】基于Mybatis整合Spring管理Sqlsession使用注解实现CRUD操作

【Mybatis 源码分析 3】基于Mybatis使用注解实现CRUD操作pom.xml中需要添加spring的依赖包 <dependencies> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactI

2020-05-29 22:30:36 227

原创 【Mybatis源码分析 4】Sqlsession进行CRUD操作的实现原理

SqlSession提供select/insert/update/delete方法,在旧版本中使用使用SqlSession接口的这些方法,但是新版的Mybatis中就会建议使用Mapper接口的方法。映射器其实就是一个动态代理对象,进入到MapperMethod的execute方法就能简单找到SqlSession的删除、更新、查询、选择方法,从底层实现来说:通过动态代理技术,让接口跑起来,之后采用命令模式,最后还是采用了SqlSession的接口方法(getMapper()方法等到Mapper)执行SQ

2020-05-28 23:54:55 339

原创 【Mybatis 源码分析 3】基于Mybatis使用注解实现CRUD操作

目录1. 定义数据库接口,定义接口方法,对应mapper.xml中的方法2. 修改myabtis-conf.xml配置文件中mappers映射器中的引用3. 通过Sqlsession对象getMapper方法实例化myabtis-conf.xml配置文件中mappers映射器引用的包下指定的接口对象,通过接口对象调用接口方法进行CRUD操作【Mybatis 源码分析 2】基于Mybatis使用mapper.xml实现CRUD操作使用.xml写sql方法还是比较麻烦的mybati.

2020-05-28 20:20:23 272

原创 【Effective Java 2】Lambda优先于匿名类,方法引用优先于Lambda

匿名类,简单说就是不显式地通过定义类实现接口,直接new接口并实现接口方法得到接口的实例,省去了实现类这一步。public class Test { public static void main(String[] args) { // 匿名类创建接口对象 Fun fun = new Fun() { @Override public int add(int x, int y) {

2020-05-27 23:41:46 174

原创 【Mybatis 源码分析 2】基于Mybatis使用mapper.xml实现CRUD操作

接【Mybatis 源码分析 1】使用maven配置mybatis,之后,我们就可以开始增删查改数据库了。1. mapper.xml映射文件中添加增删查改的sql语句<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.d

2020-05-26 22:33:39 254 1

原创 【Mybatis 源码分析 1】使用maven配置mybatis

创建一个空maven项目pom.xml中导入相关的依赖包。为了帮助程序快速从远端仓库下载依赖包,可以去http://maven.apache.org/download.cgi下载Apache Maven这个软件项目管理及自动构建工具,然后在File->Settings->Build,Execution,Deployment->Maven中替换本地的settings.xml接着在pom.xml中配置mybatis、mysql 数据库连接以及测试用的jar包h.

2020-05-26 21:29:16 611 1

原创 【Effective Java 1】覆盖equals的约定

Object类提供equals方法,所有的类都继承Object类,也继承它的equals方法,判断类的实例是否与另一个实例相等覆盖equals的步骤:1. 使用==操作符检查参数是否为这个对象的引用,如果是,则直接返回true;2. 使用instanceof检查参数是否为正确的类型,如果不是,则直接返回false;3. 经过第二步检查后,确定参数的类型,将参数转换为正确的类型(记住equals的参数是Object类型,在这一步就可以对参数进行类型转换了);4. 对对象的每一个...

2020-05-25 22:20:37 153

原创 【深入了解Java虚拟机 第十二章】Java内存模型

目录Java内存模型主内存与工作主存内存之间交互操作原子性、可见性和有序性先行发生原则(Happens-Before)物理计算机中的并发问题由于计算机的存储设备与处理器的运算速度有着几个数据量的差异,现代计算机系统不得不加入一层或者多层读写速度尽可能接近处理器运行速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要的数据复制到缓存中,让处理器运算能够快速开始,运算结束后将结果从缓存中同步刷新回主存,保证处理器运算不需要等待缓慢的内存读写。高速缓存的存在解决了处

2020-05-25 20:32:08 287

原创 【深入理解Java虚拟机 第十一章】后端编译与优化之-逃逸分析

逃逸分析是为其他优化措施提供依据的分析技术一个对象被定义后,做执行范围内,如果被作为参数传递给其他方法,这种叫做方法逃逸;如果运行被其他线程访问,这种称为线程逃逸。对象的逃逸程度:不逃逸->方法逃逸->线程逃逸。针对对象的逃逸程度的优化手段1. 标量替换对象是一个聚合量,由基本数据类型及reference类型等标量(无法继续分解的最小数据)组成。 如果一个对象不逃逸,就可以将对象拆解成基本数据类型及reference类型等标量,程序执行时可能不创建该...

2020-05-25 17:56:14 301

原创 【深入了解Java虚拟机 第十三章】锁优化-自旋锁和自适应自旋锁、锁消除、锁粗化、轻量级锁和偏向锁

自旋锁【Java 基础 21】Java语言中的线程安全和线程安全的实现方式中提到互斥同步主要面临的问题就是线程阻塞和唤醒带来的性能开销,挂起线程和恢复线程的操作都需要转入内核态完成,这对Java虚拟机的并发性能带来很大的压力,当共享数据的锁定状态只持续很短的一段时间,将其他线程挂起和恢复并不值得,因此虚拟机开发团队设计线程没有获取到锁不立即挂起,而是执行一个忙循环(自旋)等待获取锁。JDK 6之后默认开始自旋锁,可以使用-XX:UsingSpinning参数设置开启/关闭。自旋等待虽然避免了线程

2020-05-24 12:19:14 364

原创 【深入了解Java虚拟机 第十三章】Java语言中的线程安全和线程安全的实现方式

线程安全是以多个线程之间存在共享数据访问为前提的,java语言中各种操作共享的数据分为以下五类:1. 不可变只要一个不可变的共享对象被正确地创建,那其外部的可见状态永远不会改变,永远不会出现在其他线程中数据不一致的状态。不可变对象天生是线程安全的。比如java.lang.String、枚举类型、以及java.lang.Number的部分子类比如Long,Double等、BigInteger,BigDecimal等大数据类型都是不可变的。2. 绝对线程安全不管运行时环境如何,调用者都不需要

2020-05-23 22:53:09 153

原创 【Java 基础 20】Object

package java.lang;import jdk.internal.HotSpotIntrinsicCandidate;public class Object { private static native void registerNatives(); static { registerNatives(); } @HotSpotIntrinsicCandidate public Object() {} //...

2020-05-18 18:08:23 120

转载 【Java 基础 19】Exception 和 Error

以下内容来自https://blog.csdn.net/qq_29229567/article/details/80773970?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecaseException 和 ErrorExcep...

2020-05-15 08:34:50 108

原创 【数据库篇7】Redis

redis .key-value类型的nosql数据库,支持事务,持久性,redis持久化之RDB和AOFRDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。(每隔一段时间将内存中的数据写完本地文件,重启后从本地文件中恢复数据)优点: 1 适合大规模的数据恢复。 2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。缺

2020-05-09 21:36:54 137

原创 【Java 基础 18】Java 集合

Java中的集合主要继承Collection和Map两个根接口,Collection又派生了List,Queue,Set三个子接口,因此Java集合主要分为四类:List,Queue,Set,Map List Queue Set 线程安全 非线程安全 线程安全 非线程安全 线程安全 非线程安全 CopyOnWriteArrayList ArrayList ArrayBlockingQueue

2020-05-09 19:30:51 232

原创 【深入理解Java虚拟机 第三章】 ​​​​​​Java垃圾收集器和内存分配策略

JVM管理的内存中,虚拟机栈、本地方法栈和程序计数器的生命周期和线程的生命周期一致,随着栈帧的出栈实现自动的内存清理,因此JVM中需要GC的内存区域主要在Java堆和方法区。程序所使用的对象和数组填充满Java堆之后,会抛出out of memory异常,程序挂掉,GC机制将不再使用的对象和数组删除,整理内存以便后续使用。GC如何判断对象是否需要被回收需要进行回收的对象的已经不再存活的对象(不再使用),判断对象是否存活的方法有:(1)引用计数(缺点:可能存在循环引用的问题,导致GC无法回收,

2020-05-09 18:50:45 260

原创 【深入理解Java虚拟机 第二章】Java内存区域、对象的创建,内存布局和访问定位

Java内存模型Java内存模型(Java Memory Model, JMM)是一种多线程从主存中读写数据操作规范,目的是解决由于多线程通过共享内存进行通信时,存在的缓存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性。我们先看一下下面两个模型的简图:JMM规定每个线程都有自己的工作内存,拷贝一份主存中感兴趣的共享数据的副本,线程对共享变量的操作都是通过和自己的工作内存数据交换进行的,而不是直接读写主存(看,和CPU

2020-05-09 18:49:45 174

原创 【Java 基础 15】计算机网络的五层协议

五层协议模型中,每个层各自的作用应用层文件传输,电子邮件,聊天软件,视频播放等各种软件应用,常用的协议有 HTTP,FTP,SMTP,DNS,Telent等, 主要的作用是产生和解析数据报文;传输层面向连接的TCP协议和无连接的UDP协议,对数据报文在链路上传输进行控制(传输层建立端口到端口的通信);UDP协议比较简单,没有确认机制,可靠性差。TCP是面向连接的,可靠的,基于字节流的通信协议,相比UDP建立了三次握手和四次挥手的确认机制建立TCP连接:客户端主动给服务端发..

2020-05-09 18:46:59 175

原创 【Java 基础 14】 NIO

传统IO是面向字节流和字符流进行数据的读写操作,NIO(Non-Blockig IO/ New IO , 非阻塞IO)支持面向缓冲区(Buffer)的、基于通道(Chanel)的IO操作(通道表示打开到IO设备(比如文件、socket)的连接,缓冲区负责存储从文件或网络读写的数据),以更加高效的方式(借助选择器(Selector))进行数据的读写。Bufferjava.nio包提供了除Boolean外7种数据类型的缓冲区ByteBuffer\CharBuffer\ShortBuffer.

2020-05-09 18:45:44 140

原创 【深入了解Java虚拟机 第六/七章】 类文件结构和类的加载机制

先举个例子1. 在指定路径下新建一个TestClass.java源文件2. 存放在磁盘的. java源文件 被 javac编译器 编译成 字节码文件.class(注意可能报错编码格式不对,可以指定编码格式:javac -encoding 编码格式 TestClass.java)3. 通过类加载器加载已经编译好的TestClass.class文件URL url = new URL("file:///E:/Projects/project_java/eleven/");ClassLo

2020-05-09 18:44:07 152

原创 【Java 基础 12】Atomic

java.util.concurrent.Atomic包下定义了很多具有原子操作的类先看看Atomic包下常用的AtomicInteger类package java.util.concurrent.atomic;import java.lang.invoke.VarHandle;import java.util.function.IntBinaryOperator;import java.util.function.IntUnaryOperator;public class At

2020-05-09 01:14:20 281

原创 【Java 基础 11】ThreadLocal

源码package java.lang;import jdk.internal.misc.TerminatingThreadLocal;import java.lang.ref.*;import java.util.Objects;import java.util.concurrent.atomic.AtomicInteger;import java.util.function....

2020-05-07 23:19:42 352

原创 【Java 基础 10】CountDownLatch和CyclicBarrier

CountDownLatch源码package java.util.concurrent;import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class CountDownLatch { // 同步锁,继承AQS抽象同步器 private static final class S...

2020-05-05 00:34:11 116

原创 【Java 基础 9】单例模式及其设计方法、DCL、破坏单例模式方法以及防破坏手段

单例模式一个类只允许创建一个实例单例模式应用场景1. 外部资源,配置文件等,比如打印2. 数据库连接池3. 计数器4. 日志工具5. 等Java中单例模式体现1. Runtime2. spring IOC容器3. 等单例模式的优点1. 由于在进程中只存在一个对象,当需要频繁创建和销毁的对象时,单例模式无疑可以节约系统资源,提高系...

2020-05-04 01:15:16 171

原创 【Java 基础8】volatile 关键字

JMM中的可见性问题在多线程环境中,共享变量A(存储在主存)在每个线程的工作内存中有一份拷贝Bi,线程直接读写工作内存中的数据,不同的线程的工作内存中变量之间不可见,这样就可能存在一个问题:工作内存Bi与主内存A同步延迟现象带来的可见性问题Volatile修饰的变量特点1. 多线程之间缓存可见2. 禁止指令重排,保证数据的有序性/一致性Volatile 缓存可见性(...

2020-05-02 00:03:40 248

空空如也

空空如也

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

TA关注的人

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