自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 资源 (4)
  • 问答 (1)
  • 收藏
  • 关注

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

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

2018-07-20 11:12:25 6160 10

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

基本流程完成了XML配置文件的解析,接下来就是对bean加载的探索。 //2.从ioc容器中获取bean实例MyTestBean myTestBean = (MyTestBean) beanFactory.getBean("myTestBean");跟踪进Spring的源码 public Object getBean(String name) throws BeansExce...

2018-07-13 14:17:44 532

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

自定义标签使用可以参考Spring自定义标签示例(亲测可运行)自定义标签解析public BeanDefinition parseCustomElement(Element ele) { return this.parseCustomElement(ele, (BeanDefinition)null);}// containingBd为父类bean,对顶层元素的解析应设...

2018-07-06 15:33:33 414

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

默认标签的解析是在parseDefaultElement函数中进行的, // DefaultBeanDefinitionDocumentReader.javaprivate void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { if (delegate.nodeNameEqua...

2018-07-04 15:15:17 362

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

容器的基本用法public class MyTestBean { private String testStr = "testStr"; public String getTestStr() { return testStr; } public void setTestStr(String testStr) { this.t...

2018-07-02 15:48:48 548

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

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

2018-07-02 14:44:09 905

原创 MySql优化-索引优化

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

2018-06-14 11:55:18 322

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

这里有一个问题需要讨论:如果key超时了,Redis会回收key的存储空间吗? 答案是不会。Redis的key超时不会被其自动回收,它只会标识哪些键值对超时了。 这样做的一个好处在于,如果一个很大的键值对超时,比如一个列表或者哈希结构,存在数以百万个元素,要对其回收需要很长的时间。如果采用超时回收,则可能产生停顿。坏处也很明显,这些超时的键值对会浪费比较多的空间。 Redis提供两个方式...

2018-06-11 21:15:40 1708

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

mysql https://cloud.tencent.com/developer/article/1018423centos7通过yum安装JDK1.8 http://blog.csdn.net/a360616218/article/details/76736988nginx https://www.cnblogs.com/kaid/p/7640723.htmlgit ht...

2018-06-08 11:17:40 978

原创 MySQL优化-基础优化

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

2018-06-05 17:50:32 752 1

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

两个单链表相交的一系列问题【题目】在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数,如果两个链表相交,则返回相交的第一个节点;如果不相交,则返回null。 【要求】如果链表1的长度为N,链表2的长度为M,时间复杂度请达到O(N+M),额外空间复杂度请达到O(1) 思考其实这道题目是一系列的问题,...

2018-06-05 16:01:59 332

原创 【git】git常用命令

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

2018-06-01 14:25:55 246

原创 MySql并列排名

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

2018-05-17 15:33:27 9325 5

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

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

2018-05-10 15:54:42 265

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

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

2018-05-09 12:08:42 388

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

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

2018-05-08 16:17:41 583

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

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

2018-05-07 15:56:58 412

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

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

2018-05-03 17:27:22 3632

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

写时复制的List和SetCopyOnWriteArrayList和CopyOnWriteArraySet,Copy-On-Write即写时复制 CopyOnWriteArrayListCopyOnWriteArrayList实现了List接口,它的用法与其他的List基本是一样的。 CopyOnWriteArrayList特点: 1. 线程安全,可以被多个线程并发访问 2...

2018-05-02 15:04:46 211

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

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

2018-04-27 15:49:37 309 1

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

wait/notifyJava在Object类中定义了一些线程协作的基本方法,wait和notify public final void wait() throws InterruptedException;public final native void wait(long timeout) throws InterruptedException;一个带时间参数,单位是毫秒,...

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

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

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

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

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

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

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

原创 归并排序【MergeSort】

归并排序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。 首先我们可以思考:如何将两个有序的序列合并,并且合并后依然有序呢? 这个比较简单,我们只需要用两个指针,...

2018-04-16 23:43:46 247

原创 选择排序 【SelectionSort】

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

2018-04-16 23:43:14 275

原创 插入排序 【InsertionSort】

插入排序插入排序的工作方式像排序一手扑克牌。 假设左手的牌是排序好的,桌面上的是未知的牌 1. 开始时,我们的左手为空并且桌子上的牌面向下。 2. 然后,我们每次从桌子上拿走一张牌并将它插入左手正确的位置。 为了找到插入的正确位置,我们将要插入的牌与左手的牌挨着比较,直接找到合适的位置并插入进去。 在实际的实现过程中,我们可以将数组的第0个元素看成是已经排序好的,然后从第二个元素开始进...

2018-04-16 23:42:40 248

原创 冒泡排序【BubbleSort】

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

2018-04-16 23:41:11 362

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

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

2018-04-16 12:03:12 206

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

完全二叉树 & 满二叉树 & 堆基本概念满二叉树是指除了最后一层外,每个节点都有两个孩子,而最后一层都是叶子节点,都没有孩子。 满二叉树一定是完全二叉树,但完全二叉树不要求最后一层是满的,但如果不满,则要求所有节点必须集中在最左边,从左到右是连续的,中间不能有空的。特点在完全二叉树中,可以给每个节点一个编号,编号从1开始连续递增,从上到下,从左到...

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

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

HashMapMap有键和值的概念。一个键映射到一个值,Map按照键存储和访问值,键不能重复。HashMap实现了Map接口。 基本原理HashMap的基本实现原理:内部有一个哈希表,即数组table,每个元素table[i]指向一个单向链表,根据键存取值,用键算出hash值,取模得到数组中的索引位置index,然后操作table[index]指向的单向链表。 存取的时候依据...

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

原创 SpringBoot + SpringSecurity 控制授权

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

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

原创 Shell 简单教程

Hello World这里我们在Linux环境下进行操作,通过vi来进行编辑。 通过vi创建并编辑一个test.sh文件:#!/bin/bashecho "Hello World !"该文件的作用是在控制台输出“Hello World !”。 echo 命令用于向窗口输出文本。 #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。 ...

2018-03-30 08:52:24 183

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

ArrayListArrayList中有两个方法可以返回数据public Object[] toArray();public <T> T[] toArray(T[] a);ArrayList中有一个静态方法asList可以返回对应的ListInteger[] a = {1, 2, 3};List<Integer> list = Arrays.as...

2018-03-29 15:24:25 371

原创 SpringBoot + Spring Security OAuth2基本使用

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

2018-03-28 22:27:20 87899 17

原创 SpringBoot + SpringSecurity Session管理

Session超时管理在SpringBoot中,可以直接在配置文件中对Session超时时间进行设置 # 默认为30分钟,这里的单位是秒server.session.timeout = 10 * 60SpringBoot中默认的Session超时时间是30分钟,通过配置文件设置的单位的是,但是最少设置为60秒 Session 超时处理在之前的系统设计中,如果Sessi...

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

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

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

2018-03-25 09:50:01 18497 15

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

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

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

原创 Docker 安装以及常用命令

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

2018-03-22 14:50:56 343

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

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

2018-03-22 11:26:57 2144

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

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

2018-03-21 21:56:12 15089 5

基于51单片机的出租车计费器

基于51单片机的出租车计费器,包含了程序代码,电路原理图,论文报告,元件清单

2015-08-01

使用百度地图的公交查询

自己做的毕业设置,基于百度地图的公交查询系统,可以显示各种图层,查询公交线路详情,查询路况,查询周边商家等,有详细的代码注释

2015-07-21

8051与protues仿真实例

基于8051+Proteus仿真案例 。包含C程序代码,和protues的硬件连接原理图。是一个学习51单片机的好工具。

2014-01-12

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

TA关注的人

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