自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 解决SpringBoot2.0 集成Redis @Cacheable乱码的情况

在使用SpringBoot1.x的时候,通过简单的配置RedisTemplete就可以了,升级到SpringBoot2.0,spring-boot-starter-data-redis也跟着升起来了,@Cacheable就出现了乱码的情况,可以通过如下配置方式解决 @Configuratio...

2018-07-20 11:12:25 3989 9

原创 《Spring源码深度解析》读书笔记 - bean的加载

基本流程 完成了XML配置文件的解析,接下来就是对bean加载的探索。 //2.从ioc容器中获取bean实例 MyTestBean myTestBean = (MyTestBean) beanFactory.getBean("myTestBean&...

2018-07-13 14:17:44 292 0

原创 《Spring源码深度解析》读书笔记 - 自定义标签的解析

自定义标签使用 可以参考Spring自定义标签示例(亲测可运行) 自定义标签解析 public BeanDefinition parseCustomElement(Element ele) { return this.parseCustomElement(ele, (BeanDe...

2018-07-06 15:33:33 231 0

原创 《Spring源码深度解析》读书笔记 - 默认标签的解析

默认标签的解析是在parseDefaultElement函数中进行的, // DefaultBeanDefinitionDocumentReader.java private void parseDefaultElement(Element ele, BeanDefinitionParse...

2018-07-04 15:15:17 215 0

原创 《Spring源码深度解析》读书笔记 - 容器的基本实现

容器的基本用法 public class MyTestBean { private String testStr = "testStr"; public String getTestStr() { return testSt...

2018-07-02 15:48:48 396 0

原创 《Spring源码深度解析》读书笔记 - Spring整体架构

Spring的整体架构 Spring框架是一个分层架构,包含一系列的功能要素,被分为大约20个模块。 Core Container(核心容器) Data Access/Intergration Web AOP Test

2018-07-02 14:44:09 527 0

原创 MySql优化-索引优化

索引简介 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上 我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引...

2018-06-14 11:55:18 202 0

原创 关于Redis会回收超时key的存储空间的问题?

这里有一个问题需要讨论:如果key超时了,Redis会回收key的存储空间吗? 答案是不会。Redis的key超时不会被其自动回收,它只会标识哪些键值对超时了。 这样做的一个好处在于,如果一个很大的键值对超时,比如一个列表或者哈希结构,存在数以百万个元素,要对其回收需要很长的时间。如果采用超...

2018-06-11 21:15:40 1265 0

原创 【Centos】常用软件安装方法

mysql https://cloud.tencent.com/developer/article/1018423 centos7通过yum安装JDK1.8 http://blog.csdn.net/a360616218/article/details/76736988 nginx h...

2018-06-08 11:17:40 749 0

原创 MySQL优化-基础优化

慢查询日志 如何发现有问题的SQL? 使用MySql慢查日志对有效率问题的SQL进行监控 -- 查看慢查日志是否开启 show variables like 'slow_query_log'; -- 开启慢查日志 set global slow_query_...

2018-06-05 17:50:32 497 0

原创 两个单链表相交的一系列问题

两个单链表相交的一系列问题 【题目】在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数,如果两个链表相交,则返回相交的第一个节点;如果不相交,则返回null。 【要求】如果链表1的长度为N,链表2的长度为M,时...

2018-06-05 16:01:59 224 0

原创 【git】git常用命令

分支相关 查看所有分支(本地分支和远程分支) git branch -a 查看远程分支 git branch -r 查看本地分支 git branch

2018-06-01 14:25:55 144 0

原创 MySql并列排名

业务背景 数据排名是很常用的功能,简单的排名功能可以根据order by来实现,但是如果数据一样,排名应该并列的时候,order by虽然是排序的,但是名次却不是并列的。 我们先通过order by演示一下。 建表 CREATE TABLE `user_score` ( `us...

2018-05-17 15:33:27 5009 1

原创 【Java编程的思想】并发总结

线程安全的机制 线程表示一条单独的执行流,每个线程有自己的执行计数器,有自己的栈,但可以共享内存,共享内存是实现线程协作的基础,但共享内存有两个问题:竞态条件和内存可见性。 synchronized synchronized是一个关键字,既可以解决竞态问题,也可以解决内存可见性问题 ...

2018-05-10 15:54:42 192 0

原创 【Java编程的思想】同步和协作工作类

读写锁ReentrantReadWriteLock 之前介绍了两种锁:synchronized和显式锁ReentrantLock,对于同一受保护对象的访问,无论是读还是写,它们都要求获得相同的锁。但在一些场景中,多个线程的读操作完全可以并行。 在Java并发包中,接口ReadWriteLoc...

2018-05-09 12:08:42 263 0

原创 【Java编程的逻辑】定时任务

Timer和TimerTask 基本用法 TimerTask表示一个定时任务,它是一个抽象类,实现了Runnable,具体的定时任务需要继承该类,实现run方法。 Timer是一个具体类,它负责定时任务的调度和执行,主要方法有: // 在指定绝对时间time运行任务task publ...

2018-05-08 16:17:41 285 0

原创 【Java编程的逻辑】线程池

基本介绍 线程池,顾名思义,就是一个线程的池子,里有若干线程,它们的目的就是执行提交给线程池的任务,执行完一个任务后不会退出,而是继续等待或执行新的任务。 线程池的优点: 可以重用线程,避免线程创建的开销 任务过多时,通过排序避免创建过多线程,减少系统资源消耗和竞争,确任务有序完成...

2018-05-07 15:56:58 306 0

原创 【Java编程的逻辑】异步任务执行服务 Executor和ExecutorService

基本概念 线程Thread即表示要执行的任务,又表示执行的机制。 Java并发包提供了一套“异步任务执行服务”机制,将“任务的提交”和“任务的执行”相分离。 任务执行服务涉及到的基本接口: Runnable和Callable:表示要执行的异步任务 Executor和Execu...

2018-05-03 17:27:22 2070 0

原创 【Java编程的逻辑】并发容器

写时复制的List和Set CopyOnWriteArrayList和CopyOnWriteArraySet,Copy-On-Write即写时复制 CopyOnWriteArrayList CopyOnWriteArrayList实现了List接口,它的用法与其他的List基本是一样...

2018-05-02 15:04:46 132 0

原创 【Java编程的逻辑】原子变量 & CAS & 显示锁

原子变量 在理解synchronized中有使用synchronized保证原子更新操作,但是使用synchronized成本太高了,需要先获取锁,最后还要释放锁,如果获取不到锁还需要等到。这些成本都是比较高的,对于这种情况,可以使用原子变量。 Java并发包中的基本原子变量类型有以下几种: ...

2018-04-27 15:49:37 150 0

原创 【Java编程思想】线程的基本协作机制 与 线程的中断

wait/notify Java在Object类中定义了一些线程协作的基本方法,wait和notify public final void wait() throws InterruptedException; public final native void wait(long ti...

2018-04-24 15:00:29 279 1

原创 【Java编程的思想】理解synchronized

用法和基本原理 synchronized可以用于修饰类的实例方法、静态方法和代码块 实例方法 在介绍并发基础知识的时候,有一部分是关于竞态条件的,当多个线程访问和操作同一个对象时,由于语句不是原子操作,所以得到了不正确的结果。这个地方就可以用synchronized进行处理 ...

2018-04-23 17:54:54 206 1

原创 【Java编程的逻辑】并发基础知识

线程的基本概念 线程表示一条单独的执行流,它有自己的程序执行计数器,有自己的栈。 在Java中创建线程有两种方式:一种是继承Thread,另外一种是实现Runnable接口 public class HelloThread extends Thread{ @Override...

2018-04-20 14:49:37 207 1

原创 归并排序【MergeSort】

归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。 首先...

2018-04-16 23:43:46 116 0

原创 选择排序 【SelectionSort】

选择排序 假设初始的数组是[5,4,7,2] 以从小到大排序为例,我们可以将数组分为两个区域,一个是无序区,一个是有序区,在一开始所有的数据都在无序区。 进行第一轮排序,对无序区的数组[5,4,7,2]进行遍历,记录最小值2,然后将它与第0个元素进行位置交换。此时无序数组[4,7,5],有序...

2018-04-16 23:43:14 116 0

原创 插入排序 【InsertionSort】

插入排序 插入排序的工作方式像排序一手扑克牌。 假设左手的牌是排序好的,桌面上的是未知的牌 1. 开始时,我们的左手为空并且桌子上的牌面向下。 2. 然后,我们每次从桌子上拿走一张牌并将它插入左手正确的位置。 为了找到插入的正确位置,我们将要插入的牌与左手的牌挨着比较,直接找到合适的位置并插...

2018-04-16 23:42:40 112 0

原创 冒泡排序【BubbleSort】

冒泡排序 假设初始的数组是[5,4,7,2] 以从小到大排序为例: 将第0个元素与第一个元素进行比较, 5 > 4, 所以交换位置, 此时[4,5,7,2] 将第1个元素与第二个元素进行比较, 5 < 7, 所以保持,此时[4,5,7,2] 将第2个元素...

2018-04-16 23:41:11 206 0

原创 【Java编程的逻辑】容器类的总结

抽象容器类 用法和特点 容器类有两个根接口,分别是Collection 和 Map ,Collection表示单个元素的集合,Map表示键值对的集合 。 Collection Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也...

2018-04-16 12:03:12 104 0

原创 【Java编程的逻辑】堆与优先级队列&PriorityQueue

完全二叉树 & 满二叉树 & 堆 基本概念 满二叉树是指除了最后一层外,每个节点都有两个孩子,而最后一层都是叶子节点,都没有孩子。 满二叉树一定是完全二叉树,但完全二叉树不要求最后一层是满的,但如果不满,则要求所有节点必须集中在最左边,从左到右是连续...

2018-04-12 15:29:44 327 1

原创 【Java编程的逻辑】Map和Set

HashMap Map有键和值的概念。一个键映射到一个值,Map按照键存储和访问值,键不能重复。 HashMap实现了Map接口。 基本原理 HashMap的基本实现原理:内部有一个哈希表,即数组table,每个元素table[i]指向一个单向链表,根据键存取值,用键算出hash值,...

2018-04-09 13:34:43 164 3

原创 SpringBoot + SpringSecurity 控制授权

授权简介 一般的人会认为,不同的角色登录进同一个系统,根据角色权限的不同,看到的菜单不同就是控制授权。其实并不是的,菜单的是否显示只是前端交互上的一个设计而已,真正需要授权的地方的接口的访问。 普通的系统通常会有两个端,一个是给用户用的业务系统(比如购物商城的买家端),一个是给公司运营人员用...

2018-03-31 15:47:34 8756 5

原创 Shell 简单教程

Hello World 这里我们在Linux环境下进行操作,通过vi来进行编辑。 通过vi创建并编辑一个test.sh文件: #!/bin/bash echo "Hello World !" 该文件的作用是在控制台输出“Hello World !”。 echo ...

2018-03-30 08:52:24 110 0

原创 【Java编程的逻辑】列表和队列

ArrayList ArrayList中有两个方法可以返回数据 public Object[] toArray(); public <T> T[] toArray(T[] a); ArrayList中有一个静态方法asList可以返回对应的List In...

2018-03-29 15:24:25 249 0

原创 SpringBoot + Spring Security OAuth2基本使用

OAuth2.0基本知识 网上关于OAuth2.0的介绍已经很多了,这里就不做过多的介绍,不太了解的朋友可以参考理解OAuth 2.0 Spring Security OAuth2 基本配置 这里依然使用maven来做管理 <dependency&g...

2018-03-28 22:27:20 45580 8

原创 SpringBoot + SpringSecurity Session管理

Session超时管理 在SpringBoot中,可以直接在配置文件中对Session超时时间进行设置 # 默认为30分钟,这里的单位是秒 server.session.timeout = 10 * 60 SpringBoot中默认的Session超时时间是30分钟,通过配置文件设置的...

2018-03-26 21:50:07 10473 2

原创 SpringBoot + SpringSecurity 短信验证码登录功能

实现原理 在之前的文章中,我们介绍了普通的帐号密码登录的方式: SpringBoot + Spring Security 基本使用及个性化登录配置。 但是现在还有一种常见的方式,就是直接通过手机短信验证码登录,这里就需要自己来做一些额外的工作了。 对SpringSecurity认证流程详解有...

2018-03-25 09:50:01 12356 13

原创 SpringBoot + SpringSecurity “记住我”功能实现及相关源码分析

记住我功能的基本原理 之前有讲过,当用户发起认证请求,会通过UsernamePasswordAuthenticationFilter,在认证成功之后,可以调用SpringSecurity提供的RememberMeService,它会生成一个Token并将它写入浏览器的Cookie中,同时这个...

2018-03-24 10:38:51 5931 2

原创 Docker 安装以及常用命令

Docker安装 Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令: yum install docker 安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动: sy...

2018-03-22 14:50:56 264 0

原创 【Java编程的逻辑】 泛型 & 参数限定 & 通配符

类型参数的限定 无论是泛型类、泛型方法还是泛型接口,关于类型参数,我们都知之甚少,只能把它当作Object,但Java支持限定这个参数的一个上界,也就是说:参数必须为给定的上界类型或其子类型,这个限定是通过extends关键字来表示的。 上界为某个具体类 public class ...

2018-03-22 11:26:57 412 0

原创 SpringBoot + SpringSecurity 实现图形验证码功能

生成图形验证码 根据随机数生成图片 将随机数存到Session中 将生成的图片写到接口的响应中 生成图形验证码的过程比较简单,和SpringSecurity也没有什么关系。所以就直接贴出代码了 根据随机数生成图片 /** * 生成图形验证码 * @param requ...

2018-03-21 21:56:12 11900 3

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