自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java Lock最佳实践

在进行并发操作时,通常需要加锁操作来保证一致性。Java类库中提供了几种用于替代synchronized的锁,比如ReentrantLock,具体实现可能还有基于Redis等其他形式的锁,在JDK官方文档中,给出了加锁的最佳实践:正确加锁操作Lock l = ...;l.lock();try { // access the resource protected by this lock} finally { l.unlock();}unlock操作放在finally无可厚非,这里主要

2021-09-27 19:16:57 280

原创 Java四种引用类型及常见应用场景

Java具有四种不同强度的引用类型:强引用:被强引用关联的对象不会被回收,一般通过new来构造对象时,就会返回一个强引用。Object obj = new Object()软引用:通过SoftReference来构造,会在内存不足时回收,一般可用于缓存等场景,比如MyBatis中缓存的装饰器就有SoftCache类型。在Class.java中用于保存反射数据弱引用:通过WeakReference来构造,会在下次GC时回收,也可用于缓存场景,MyBatis缓存装饰器WeakCache。线程类

2021-09-26 19:10:19 384

原创 Java8下Collectors.toMap方法当key重复时报错信息错误

现象:在Java 8下,使用Collectors.toMap聚合流数据,如果key重复时,会报错如下:明明是key重复,并且错误信息前缀是Duplicate key,后边却是value1。分析:查看Collectors.toMap源码如下toMap最终是调用了Map.merge方法,传入的mergeFunction是throwingMerger直接抛出异常,日志信息使用的是第一个参数u。传入的mapSupplier是HashMap对象(HashMap::new)。所以最终会调用到HashMap

2021-09-26 10:20:38 6412

原创 MyBatis原理——执行器Executor

目录前言前言在上层接口SqlSession分析中(MyBatis原理——用户交互接口SqlSession)可以看到,它实际上是委托Executor来执行sql的。所以本文来分析下MyBatis的这个组件。首先看下Executor的继承体系:...

2021-01-21 09:33:35 363 1

原创 MyBatis原理——用户交互接口SqlSession

目录概述SqlSession提供的交互方式1. 基于Statement ID2. 基于Mapper接口SqlSession执行分析创建SqlSession的方式SqlSessionManagerSqlSessionTemplate概述正如其名,SqlSession代表着一次SQL会话,是MyBatis提供给用户的顶层接口,用户通过它来访问数据库。源码对该类的注释如下:/** * The primary Java interface for working with MyBatis. * Throu

2021-01-19 21:46:37 363

原创 MyBatis原理——DataSource分析及数据库连接池的实现

目录前言PooledDataSourcePoolStatePooledConnection总结前言前边《MyBatis原理——传统JDBC操作数据库》 提到,在MyBatis中,对于数据源DataSource有两个实现:非池化版本UnpooledDataSource和池化版本PooledDataSource。非池化版本比较简单,和传统通过DriverManager获取数据库连接类似,只不过多了MyBatis的一些包装和校验。下边来记录下池化版本的实现。PooledDataSource简单看一下P

2020-12-25 17:03:44 371

原创 Java SPI机制及在数据库连接中的实现

目录SPI是什么使用场景使用方法数据库连接中的应用Java SPI的不足SPI是什么SPI全称Service Provider Interface。是Java提供的一套用来被第三方实现或者扩展的API,它可以用于框架扩展和替换组件。是一种 “基于接口的编程+策略模式+配置文件” 组合实现的动态加载机制。换句话说,就是框架提供接口,具体实现交给组件提供方。整体机制如下(来源 高级开发必须理解的Java中SPI机制):使用场景正如前边所说,SPI适用于:调用者根据业务需求,启用、扩展、或者替换框架的实

2020-11-10 18:02:41 504

原创 MyBatis原理——传统JDBC操作数据库

目录传统方式操作数据库DriverManger与DataSource传统方式操作数据库传统方式使用JDBC操作数据库主要有以下几步:加载数据库驱动,并注册从DriverManager获取数据库连接从连接创建Statement对象给Statement对象传入SQL语句及参数调用Statement对应的执行方法,操作数据库对于查询语句,返回ResultSet,遍历即可得到所要查询的数据关闭资源举一个简单的例子:假设在本地部署好了MySQL数据库,并有个名为test的数据库,库中有个简单的

2020-11-10 16:52:54 259

原创 《Java Puzzlers》——类

文章目录继承中的同名字段使用类库中类的名字命名问题命名问题续跨包访问方法作用域字段隐藏私有成员同一性名字重用术语表继承中的同名字段问题:class Base { public String className = "Base";}class Derived extends Base { private String className = "Derived";}public class PrivateMatter { public static void main(

2020-09-23 20:54:57 138

原创 MyBatis学习笔记——MyBatis updateByExample方法和updateByExampleSelective方法的区别

使用 MyBatis,通常会使用 MyBatis Generator 插件逆向生成一套接口和.xml映射文件, 来简化数据库SQL操作。在进行数据库的更新时,通常会用到映射出来的mapper的两个更新方法:updateByExample(Record recode, RecordExample example) 和 updateByExampleSelective(Record recode, RecordExample example)。这里记录下两者区别。updateByExample 方法对应的x

2020-09-07 16:09:54 1764

原创 Spring Boot+Vue项目 微博系统(8):记住我功能配置源码分析

这里再多说下,对于记住我功能,同样可以查看RememberMeConfigurer,看看是怎么实现的:public final class RememberMeConfigurer<H extends HttpSecurityBuilder<H>> extends AbstractHttpConfigurer<RememberMeConfigurer<H>, H> { private static final String DEFAULT_REMEM

2020-09-01 09:47:49 493

原创 《Java Puzzlers》——高级谜题

文章目录有毒的括号等价的自反性、传递性和对称性原生类型泛型序列化问题匿名内部类的继承常量表达式随机shuffle的公平性最终章,一些小知识有毒的括号问题:给定一个合法的 Java 表达式,添加一个注解赋值顺序的括号就变成不合法的了。解决方案:补码的不对称性,给最小负数加一个括号就不合法了。等价的自反性、传递性和对称性不符合自反性,例如 Double.NaN == Double.NaN 为 false;符合对称性;不符合传递性,由于整数与浮点数之间的转换有可能会出现丢失精度的问题,所以可能破坏

2020-08-31 20:41:16 203

原创 Mybatis学习笔记——selectByExample方法和selectByExampleWithBLOBs方法区别

使用 MyBatis,通常会使用 MyBatis Generator 插件逆向生成一套接口和.xml映射文件, 来简化数据库SQL操作。在使用 selectByExample(RecordExample example) 进行数据库的查找时,发现长字段(实践时为 description varchar(256))获取结果为 null 。而其他字段则正常,查看该方法对应的xml配置文件如下:<select id="selectByExample" parameterType="cn.novalue.c

2020-08-16 11:16:29 3204

原创 《剑指offer》Java题解

文章目录数组中重复的数字二维数组中的查找原地替换字符串空格从尾到头打印链表重建二叉树二叉树的下一个结点用两个栈实现队列斐波那契数列变态青蛙跳台阶旋转数组的最小数字矩阵中的路径机器人的运动范围剪绳子二进制中1的个数数值的整数次方打印从1到最大的n位数O(1)时间内,删除链表中给定结点删除链表中重复的结点正则表达式匹配表示数值的字符串调整数组顺序使奇数位于偶数前边并保持相对顺序链表中倒数第k个结点链表中环的入口结点反转链表合并两个排序的链表二叉树的镜像对称的二叉树顺时针打印矩阵包含min函数的栈栈的压入、弹出序

2020-08-15 22:16:44 345

原创 面试重点:starter原理以及自己动手实现一个starter

目录前言starter的有关规范结构命名自定义starter新建项目新建starter模块新建autoconfigure模块配置autoconfigure模块前言使用过Spring Boot的同学,都应该对starter不陌生,Spring官方提供了很多starter,对应于不同的应用场景,以下为部分实现:在我们需要某种功能的时候,只需要简单地导入一个starter就可以直接使用。那么为什么只要导入starter就能使用这些功能呢,Spring Boot是如何做到的?下边就通过自己实现一个start

2020-06-05 16:36:02 5467 1

原创 源码分析——Spring Boot是如何实现自动配置的

目录前言自动配置注解加载spring.factories加载配置文件前言一直以来都把Spring Boot看作一个黑盒子来使用,虽然也了解过一些原理,但还是朦朦胧胧的感觉。今天就来学习、记录下Spring Boot的自动配置原理。自动配置注解在新建好一个Spring Boot项目后,会有如下经典启动类:@SpringBootApplicationpublic class BlogApplication { public static void main(String[] args) {

2020-06-03 19:25:31 519 1

原创 Spring Boot+Vue项目 微博系统(7):配置Spring Security实现登录

目录UserDetailsService实现类UserDetails实现类Spring Security配置测试登录UserDetailsService实现类在 security 包下新建一个service 包,新建 UserDetailsServiceImpl类,实现UserDetailsService接口:@Service("UserDetailsServiceImpl")public class UserDetailsServiceImpl implements UserDetailsServ

2020-06-02 22:10:57 724

原创 Spring Boot+Vue项目 微博系统(6):登录功能后端实现之新建用户表,测试访问数据库

目录前言创建用户数据库创建user表程序创建User实体利用Spring Security实现用户登录前言后端的权限框架也有多种选择,比如Shiro、Spring Security,这里选择Spring Security。框架的好处就是它本来就提供了一整套完整的机制,而且还都是基于接口编程,并提供了setter方法,所以对原生框架有任何不满意的地方,只需要实现它的接口,然后自定义自己的实现,并把自己的实现set进框架中即可。这种编程方法也很值得学习。感觉用户管理这个需求从刚学编程就是绕不过去的一关,但

2020-05-30 11:44:34 920

原创 Spring Boot+Vue项目 微博系统(5):Spring Security登录流程源码分析

目录前言Spring Security简介基于内存的用户认证配置测试基于数据库的用户认证原理分析总结题外话前言后端的权限框架也有多种选择,比如Shiro、Spring Security,这里选择Spring Security。框架的好处就是它本来就提供了一整套完整的机制,而且还都是基于接口编程,并提供了setter方法,所以对原生框架有任何不满意的地方,只需要实现它的接口,然后自定义自己的实现,并把自己的实现set进框架中即可。这种编程方法也很值得学习。感觉用户管理这个需求从刚学编程就是绕不过去的一关

2020-05-25 13:34:46 629

原创 Spring Boot+Vue项目 微博系统(4):前后端通信测试

目录前端页面1. Login.vue前端页面前端页面使用element ui组件来创建,打开element ui的官网 https://element.eleme.cn/#/zh-CN/,可以看到这里提供了常用的所有组件,并且每个组件都提供了常用的属性,方法,事件等。以后按照具体的需求,直接拿来用就行了。1. Login.vue我的想法是把登录作为一个路由来访问,所以在Vue项目的view...

2020-05-22 15:51:45 922

原创 LinkedHashMap源码分析及LRU缓存的实现

目录前言HashMap前言网上对用LinkedHashMap实现LRU缓存算法的博客有很多,在这篇文章的最后,我也会基于LinkedHashMap实现一个简单的LRU缓存。如果单看实现的话很简单,但如果只是会实现总会感觉不踏实,其实这里边有很多值得学习的地方。这里我会先从LinkedHashMap的源码入手,通过源码分析它是如何在HashMap的基础上实现Linked的。如果只想看实现可以从目录直接跳转。HashMap要说LinkedHashMap就绕不过HashMap,因为从源码中(甚至是命名中)

2020-05-21 20:21:47 210

原创 Spring Boot+Vue项目 微博系统(3):创建Spring Boot项目

目录新建Spring Boot项目项目结构引入MySQL数据库测试新建Spring Boot项目使用IDEA来创建、开发后端项目,打开IDEA,Create New Project,使用 Spring Initializer来快速创建Spring Boot项目。Group、Artifact 按自己需求创建,这里就是maven的三维坐标,如果以后别人要导入你的项目,就需要这两项来引入。接...

2020-05-20 15:33:56 881

原创 Spring Boot+Vue项目 微博系统(2):构建前端Vue项目

目录前言一、安装Vue CLi二、构建一个前端项目三、启动测试前言前端项目可以借助 Vue CLi 脚手架来构建,个人感觉这东西跟Spring的Spring Initializer差不多,就是基于给定的模板,自己选择配置,然后构建一个基础项目。更多细节可以参考 Vue CLi 的官网 https://cli.vuejs.org/zh/一、安装Vue CLi查看官网可以看到,Vue CLi是...

2020-05-20 15:16:35 1160

原创 Spring Boot+Vue项目 微博系统(1):目录和简介

目录前言项目规划前言一直以来都不善于记笔记、做总结,觉得很麻烦,也不会回头去看,相信不止我一个人这样,大概还是因为懒吧。。。但看各路大佬都强烈建议写博客记录,那就硬着头皮试试吧,希望能坚持下去。。。目前的想法是以一个用于练手的小项目为基础,一步步记录项目开发过程,其中再穿插一些其它的知识。项目规划使用Vue + Spring Boot开发一个微博系统,...

2020-05-20 15:13:56 1489

空空如也

空空如也

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

TA关注的人

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