自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 @Transactional注解不起作用解决办法及原理分析

Transactional失效场景介绍第一种Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用。例如以下代码。定义一个错误的@Transactional标注实现,修饰一个默认访问符的方法/** * @author zhoujy * @date 2018年12月06日 **/@Componentpublic class Te...

2018-12-09 00:21:50 38523 7

原创 分析spring boot中几种常见的依赖注入问题

最近有空总结一下之前在使用spring boot时遇到过的几种依赖注入时的坑,如果了解spring内部的处理过程,使用起来总是感觉有种迷糊。在分析场景前,需要大概了解一下spring对于bean的实例化过程是需要先注册BeanDefinition信息然后才进行实例化,在org.springframework.context.support.AbstractApplicationContext#r...

2018-09-25 00:15:11 22402 1

原创 spring boot@EnableXXXX注解编程模型分析

@EnableXXXX编程模型在spring boot中,@EnableXXX注解的功能通常是开启某一种功能。根据某些外部配置自动装配一些bean,来达到开启某些功能的目的。光说很抽象,要具体分析。@Enable模型的实现方式基本有3种。一个基本的@Enable注解的模型如下。@Target(ElementType.TYPE)@Retention(RetentionPolicy....

2018-09-15 13:42:49 1697

原创 深入分析RestController与Controller

@RestController和@Controller注解我们都知道RestController默认都只提供Rest风格接口返回值,针对不需要返回页面的Controller都采用RestController进行注解,下面根据源码简单分析一下两者处理上的区别。@RestController源码如下。@Target(ElementType.TYPE)@Retention(Retent...

2018-09-03 12:31:41 18520 2

原创 深入分析Spring MVC

Spring MVC基本概念顾名思义,需要了解m、v、c三个部分的概念,是熟悉和分析springmvc处理过程的首要条件。M部分M指的是model,也就是模型。在springmvc中的职责就是在后端进行页面的最后渲染时提供页面所需要的数据,这里所说的数据不仅仅是后端返回的业务数据,还包括模板引擎中的内置变量和工具类可以总结如下。spring框架中的model(业务数据) M...

2018-09-02 02:38:04 2475

原创 https传输协议加密原理分析

https加密流程https是一种加密传输协议,基于非对称加密算法和对称加密算法的协作使用。为什么不使用单一的加密算法?单一使用对称加密 1. 拦截客户端报文,伪造秘钥 当客户端初次向服务器请求秘钥时,报文可能被黑客截获,黑客伪装服务器向客户端返回一个黑客生成的秘钥,当客户端使用该虚假秘钥发送报文时,黑客就可以解密客户端发送的报文信息。 2. 拦截服务器报文,截获秘钥 当客...

2018-06-28 21:29:04 8881

原创 redis缓存一致性问题解决方案

使用缓存来存储热点数据是应对高并发的常用手段之一,通过使用缓存,大大减轻了数据库的压力,同时减少了响应请求的时间。但是引入缓存之后,随之而来的问题就是当DB数据更新时,缓存中的数据就会与db数据不一致,这时候就需要对缓存的数据进行更新或者淘汰缓存,这篇文章就是分析各种处理缓存一致性问题的解决方案。先更新DB还是操作缓存更新DB和操作缓存两个动作之间,明显缺乏原子性,有可能更新DB完成,但是操...

2019-03-18 22:39:19 19980 7

原创 mysql调优--从哪几个方面入手

简介一般涉及mysql调优,可以从几个方面入手,分别是硬件、mysql系统配置、表结构优化、sql语句及索引。下面简单分析一下每个方面我们能够做什么,sql语句和索引是我们调优最常见的手段,在其他文章有记载,这里主要分析其他三个方面。硬件我们业务上常见场景数据库数据量大每次需要访问的数据量较小客户端与数据库交互频繁数据离散程度高并发程度高这种时候选取能力强劲的cpu,以及能够...

2019-02-17 17:06:04 2244

原创 脏读、不可重复读、幻读和快照读、当前读

快照读和当前读快照读(snapshot read),读取历史数据,不是最新数据简单select操作,select **当前读(current read),读最新数据select ** lock in share modeselect ** for updateinsertupdatedelete脏读假如有以下表结构create table test(...

2019-02-16 14:30:12 1703

原创 深入了解mysql--gap locks,Next-Key Locks

Next-Key LocksNext-Key Locks是在存储引擎innodb、事务级别在可重复读的情况下使用的数据库锁,官网上有介绍,Next-Key Locks是行锁和gap锁的组合。行锁是什么我们都很清楚,这篇文章主要简单分析一下mysql中的gap锁是什么。innodb默认的锁就是Next-Key locks。GAP锁gap锁,又称为间隙锁。存在的主要目的就是为了防止在可重复读的事...

2019-02-14 23:49:19 12291 15

原创 mysql调优--根据explain结果分析索引有效性,正确使用索引

定位低效率sql对于mysql性能优化,除了宏观层面的网络、设备等优化,sql语句的优化是极为重要的一环,需要想办法找到对应的执行效率低的sql语句进行优化。慢查询日志慢查询日志是定位低效率sql的手段之一,通过以下命令,设置开启慢查询日志。#显示是否开启了慢查询日志show variables like 'slow_query_log'; #开启慢查询日志set global sl...

2019-02-14 21:57:44 4058

原创 mysql调优--了解mysql索引结构

对于mysql调优来说,简历合适的索引是极其重要的一部,因此,有必要了解mysql中索引的相关知识。这里记录一下mysql 中关于索引的常见的基本知识。innodb和myisam存储结构我们工作中常见的mysql存储引擎包括innodb和myisam,两种存储引擎的数据存储结构不一样,最终两者的索引结构也是不一样的。innodbmyisam.frm 表定义文件 ....

2019-01-31 22:24:09 299

原创 JVM调优--JVM垃圾回收的基本知识

记录关于GC不得不知道的知识点~~什么是安全点、安全域?当一个线程挂起或者一段代码,引用关系不会发生变化,那么就是进入安全域,该线程满足GC安全要求当java程序需要进行一次GC的时候,通知线程进入安全区域,如果线程早已经在安全域,该线程通过安全检查;如果线程还在运行当中,那么接下来线程将会选择一个安全点停下。安全点一般是方法调用、循环调用和异常跳转。设置安全点现在一般是主动式中断,设置中...

2019-01-29 22:34:24 235

原创 JVM调优--常用JVM监控工具使用

在实际工作中,在进行jvm调优或者分析内存泄露、溢出等问题时,熟练掌握JVM常用的监控工具能够帮助更快地定位问题所在,目前记录一下使用过的常用的jvm监控工具以及其使用、和对应分析过程。查看jvm使用的垃圾回收器在开始了jvm调优或者内存问题分析时,我们首先要了解的就是JVM使用垃圾回收器是什么,才能结合监控工具,做出正确的结果分析。那么如何查看JVM运行时使用的垃圾回收器是什么?如果在...

2019-01-23 23:43:16 13640 2

原创 ReentrantLock实现原理分析

java.util.concurrent包中的工具实现核心都是AQS,了解ReentrantLock的实现原理,需要先分析AQS以及AQS与ReentrantLock的关系。这篇文章中分析了ReentrantLock#lock与ReentrantLock#unlock的实现,对于Condition的实现分析,另外文章再讲,基本上大同小异。ReentrantLock实现核心–AQS(Abstra...

2019-01-10 23:24:13 13244 1

原创 Nginx学习笔记--高可用Nginx架构:keepalived+nginx

Nginx作为对外暴露的访问入口,必须具有高可用性,才能保证能够正常提供服务。单机Nginx服务的情况下,一旦出现宕机,将会导致需要Nginx路由的服务不可用访问,因此,保证Nginx服务的HA(high availabitlity),也就是高可用性。keepalived+lvs+nginx如何保证Nginx高可用?keepalived是一个集群高可用的轻量级解决方案,关于他的介绍不多做描述,...

2019-01-09 23:06:32 1488

原创 Nginx学习笔记--nginx基本操作

nginx是一个反向代理服务器,可以利用它所许多事情,最常见的就是利用nginx做服务器端的负载均衡,访问认证,限流,静态数据缓存等。下面看一下nginx的基本操作。基本的虚拟主机nginx既然是一个方向的代理服务器,那么其访问代理配置方式是必须要了解的。在nginx.conf配置文件中的http节点中,进行配置。基于ip的虚拟主机http { include mime...

2019-01-01 23:27:40 421

原创 Nginx学习笔记--安装与基本操作

安装步骤从nginx官网下载对应版本的压缩包,解压缩进入压缩包根目录,执行命令./configure假如linux中没有安装pcre和zlib库的话,将会报错,需要安装这两个库,在ubuntu环境下,使用以下命令安装apt-get install libpcre++-devapt-get install zlib1g-dev安装完成之后执行 ./configu...

2019-01-01 23:27:06 189

原创 redis集群+JedisCluster+lua脚本实现分布式锁

在这片文章中,使用Jedis clien进行lua脚本的相关操作,同时也使用一部分jedis提供的具有原子性set操作来完成值和过期时间的同时设置。使用lua脚本根本原因也是为了保证我们两个redis操作之间的原子性,使分布式锁更加可靠。JedisCluster相关代码配置在博主的实现例子中使用redis集群实现分布式锁,所以在开始分布式锁实现之前需要进行JedisCluster的相关配置。博...

2018-12-24 16:42:51 8842 3

原创 spring boot整合kafka+注解方式

spring boot自动配置方式整合spring boot具有许多自动化配置,对于kafka的自动化配置当然也包含在内,基于spring boot自动配置方式整合kafka,需要做以下步骤。引入kafka的pom依赖包<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka --&...

2018-12-19 00:19:18 22115

原创 spring boot整合redis集群,连接虚拟机redis集群,Unable to connect to 127

spring boot整合redis集群最近的一个个人项目中使用到redis集群,redis集群的搭建环境使用同一台虚拟机,创建集群的命令是redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-r...

2018-12-16 19:54:52 27455 1

原创 基于JWT验证原理解决分布式系统session一致性问题

session一致性问题在集群或者分布式系统中,用户登录后的,由于服务端是集群环境或者分布式环境,如何保证用户每次与服务器交互都是使用原来的session或者实现单点登录,这里就涉及session一一致性的问题。解决session一致性问题可以从两种思路实现,一种是session服务端存储,一种是session客户端存储。session服务端存储服务端存储session,需要保证用户请求过...

2018-12-15 22:40:27 2770 1

原创 idea进行debug的时候调用栈只显示一个

在debug调试时发现,查看调用栈信息时,只显示了一层,不知道在哪里搞错了配置,如下所示。调试时查看调用栈这个是少不了的,因此百度了很久,但也也找不到信息,最后无意间点了,下图中的图标,终于恢复正常,这个图标是折叠来自依赖包的调用信息,方便我们平时调试的,但是看源码的时候记得不能折叠,不然真是看得一脸懵逼。...

2018-12-07 10:01:39 11823 1

原创 spring源码阅读--@Transactional实现原理

@Transactional注解简介@Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚。@Transactional注解可以帮助我们把事务开启、提交或者回滚的操作,通过aop的方式进行管理。通过@Transactional注解就能让spring为我们管理事务,免去了重复的事务管理逻辑,减少对业务代码的侵入,使我们开发人员能够专注于业务层面开发...

2018-12-07 00:33:31 58742 25

原创 spring源码阅读--aop实现原理分析

aop实现原理简介首先我们都知道aop的基本原理就是动态代理思想,在设计模式之代理模式中有介绍过这两种动态代理的使用与基本原理,再次不再叙述。这里分析的是,在spring中是如何基于动态代理的思想实现aop的。为了方便了解接下来的源码分析,这里简单化了一个流程图分析aop的基本实现思想。so,基于上面的流程,一步步分析spring源码中的aop实现方式。采用一个简单的aop例子,利用基...

2018-12-04 22:34:05 8529 2

原创 spring源码阅读--IOC容器初始化之Bean实例化、依赖注入原理

在spring容器初始化过程中,在进行了BeanDefinition注册,processor应用等一系列处理之后, 接下来需要对非懒加载的Bean进行初始化处理。容器中的Bean实际初始化的过程在AbstractApplicationContext#refreshAbstractApplicationContext#finishBeanFactoryInitializationDefa...

2018-11-28 20:22:16 1728 2

原创 spring源码阅读--IOC容器初始化之Beandefinition注册

经过这阵子对于spring源码的学习,对于spring框架的一些常见概念的实现原理有一定的了解,例如spring核心容器模块、spring aop的实现原理、spring mvc的实现原理、spring声明式事务实现原理等有一定的了解,在此记录下来自己的一些阅读源码经验。spring是一个非常庞大的框架,其中包含许多模块。但是任务模块的基础,都是spring的核心容器模块,所以最先了解的源码部分...

2018-11-26 23:37:21 415

原创 spring boot下mybatis配置双数据源

最近项目上遇到需要双数据源的来实现需求,并且需要基于spring boot,mybatis的方式来实现,在此做简单记录。单一数据源配置单一数据源配置的话并没有什么特别的,在spring boot框架下,只需要在配置文件内添加对应的配置项即可,spring boot会自动初始化需要用到的bean。配置信息如下。这里使用的是德鲁伊的数据源配置方式#datasource配置spring.dat...

2018-11-18 11:44:06 2356

原创 spring源码阅读--下载与编译

这里简单介绍如何下载编译spring源码项目,并且导入到idea或者eclipse中。首先是下载spring的源码压缩包,可取去github上面下载,地址:https://github.com/spring-projects/spring-framework,可以通过下载压缩包的方式或者git的方式下载。这里通过压缩包方式进行,下载后解压。安装gradle。spring源码需要使用gr...

2018-11-10 11:01:13 1001

原创 设计模式之装饰器模式、观察者模式

装饰器模式装饰器模式类似于一种特殊的适配器模式,两者非常相似,但是却有因为应用场景不同所以要区分清楚。适配器模式装饰器模式一般来说适配器类跟原来的逻辑类没有关联,两个类可以没有层级关系,也可以有。适配后旧逻辑调用可以通过组合或者继承的方式调用。模式上是特殊的适配器模式,装饰器需要实现与原来类的相同接口has-a\is-a关系都可以满足is-a关系着重于适配原...

2018-11-05 22:47:42 528

原创 设计模式之适配器模式与委派模式

适配器模式适配器模式很多时候是为了避免修改老代码造成系统不稳定而进行的一种编码思路,使用适配器进行适配逻辑之后,在调用原来的老代码,保证程序原有功能不受影响。举个例子,假如有一台显示器,接口是vga接口,那么我们如果有个输出信号的hdmi信源想要在这显示器上显示就要转接头做适配,但是原来的显示器不用做任何改装。适配器模式就是类似这样的功能、。代码说明一下问题。定义一个显示器。只能接收VGA...

2018-11-02 00:47:55 884

原创 设计模式之策略模式与模板模式

策略模式策略模式比较类似于一个计算有多种计算过程来获得结果,我们把每种计算方式封装为一个策略,把策略作为可选择参数来决定使用什么计算方式。代码示例定义策略接口,表示dofight计算过程。public interface FightStrategy { public void dofight();}定义实现策略类,表示各个不同的计算过程。public class Xiaoq...

2018-11-01 22:28:52 1767 1

原创 设计模式之代理模式

代理模式是应用最广泛的设计模式之一,例如spring中的aop就是代理模式的实践。通常在java中使用比较广泛的是动态代理模式,其中实现方式比较常用的是jdk动态代理和cglib动态代理。jdk实现动态代理利用jdk实现动态代理代码比较简单,需要注意的是基于jdk的动态代理是必须基于接口才可以的,代码如下。定义接口。public interface Action { public...

2018-11-01 00:48:09 1361

原创 设计模式之单例模式

单例模式是Java中常用的设计模式之一,从系统启动到系统终止,保证一个类仅有一个实例,并提供一个访问它的全局访问点。例如spring中的bean默认都是单例模式。单例模式的实现方式有多种,一般以下几种饿汉式-变量初始化,饿汉式-静态块初始懒汉式-同步锁,懒汉式-双重检查锁,懒汉式-内部类延时加载登记注册式饿汉式饿汉式是保证线程安全的单例模式实现,在类加载的时候就进行单例对象初始化,...

2018-10-30 23:39:31 220

原创 设计模式之工厂模式

简介工厂模式属于设计模式的一种,主要目的是解决用户与产品之间的问题,向用户隐藏构建产品的复杂过程,使得产生对象能够批量、标准化。在spring中大量应用。代码结构可能分为三种模式:简单工厂模式工厂方法模式抽象工厂模式简单工厂模式类似于一个工厂,只有一条生产线,这条生产线可以生产A产品也可以生产B产品,主要靠传递的参数来区分生产何种产品。结构如下图,这种模式的缺点是参数的正确性可能...

2018-10-29 23:37:52 150

原创 Mybatis源码分析导读图

主要过程以及结构mybatis源码主要分析过程有两个Mapper代理对象获取过程Mapper代理对象工作过程上面图中黑线表示Mapper.xml在程序启动时的解析过程;红线表示执行过程获取一个Mapper代理对象的过程;粉线表示Mapper代理对象是如何执行sql的处理过程。模块职能分析SqlsessionFactoryBean:主要职能是Sqlsession的工厂bean;配置...

2018-10-28 23:12:18 618 1

原创 快速搭建redis5.0集群

redis主从集群搭建redis简单主从结构如上图所示,主从结构的redis由主节点负责读写操作,从节点负责读操作,这里做搭建介绍,具体工作原理不分析。下载安装redis压缩包解压压缩包,进入redis-5.0文件夹,运行命令./make install安装redis安装完成进入redis-5.0/src文件夹,执行./redis-server 指定配置文件 即可启动r...

2018-10-25 20:20:56 30685 6

原创 Mybatis源码分析

基于Spring boot来分析Mybatis Mapper类生成过程以及自动配置过程,需要对spring boot的自动配置有一定的了解。#Mapper自动装配原理开门见山,先分析一下Mybatis源码代码入口,可以从Mybatis自动装配入手。使用mybatis的自动装配终会引入这么一个依赖:mybatis-spring-boot-autoconfigure.这个包可以作为跟踪入口。来...

2018-10-14 20:52:35 929

原创 ThreadLocal分析理解

ThreadLocal简介ThreadLocal一般用于存储线程级别变量,存储的变量是绝对的线程安全。用的比较多的场景就是存储线程级别变量来传递某些参数,并且注意的是不能滥用。某些情况下不适合用方法参数时,才考虑使用ThreadLocal,并且需要清楚ThreadLocal何时设置值,何时回收。如何保证线程安全?java.lang.ThreadLocal#setpublic void se...

2018-10-13 15:25:30 180

原创 深入分析HashMap原理(基于JDK1.7)

数据结构简介jdk1.7的HashMap的基本数据结构是数组与链表的组合方式。如下图所示(图片来源于网络)。重要属性介绍 final float loadFactor;//用于计算阈值,默认0.75 int threshold;//主要用于判断是否需要扩容的阈值//计算方式threshold = (int) Math.min(capacity * loadFactor, MA...

2018-10-09 23:38:28 209

空空如也

空空如也

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

TA关注的人

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