自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM、JRE、JDK之间的联系与区别

JVM、JRE、JDK之间的联系与区别JVM (Java Virtual Machine)​ JVM(Java虚拟机)是一个可执行Java字节码的虚拟机进程,用于解析编译后的字节码文件。 JVM屏蔽了与操作系统平台相关的信息,可以把字节码解释成具体平台上的机器指令执行,这也是Java的能够 “一次编译,到处运行” 的原因。​ 既然JVM是“虚拟机”的意思,那么肯定要体现出来 : 可以把JVM类比为一台只针对Java程序的PC虚拟机,它通过实体计算机仿真各种计算功能来实现,JVM有自己完善的硬件架构,如

2021-12-23 15:39:48 1489

原创 05-Spring环境下AOP运行原理

Spring环境下AOP运行原理​ 前面文章已经分析了SpringAop原生的运行原理,本节将分析使用频率最高场景: Spring环境下的AOP运行原理。本文会涉及到Spring启动期间注入Bean的流程,默认你已经非常熟悉了,本文不再详细赘述相关流程。在SpingBoot项目中使用AOP一般会做如下操作:主启动类上添加@EnableAspectJAutoProxy注解开启SpringAop功能自定义切面并注入到Spring中即可@SpringBootApplication@EnableAs

2021-11-04 14:14:44 220 1

原创 04-ProxyFactoryBean&AspectProxyFactory分析

ProxyFactoryBean&AspectProxyFactory分析​ 上篇使用ProxyCreatorSupport的实现类ProxyFactory结合案例剖析了SpringAop原生方式底层运行原理。之前也提到了ProxyFactoryBean、AspectProxyFactory和ProxyFactory相比只是增加了一些feture, 本节就来剖析下这两个实现类在原生的基础上做了哪些事情。ProxyFactoryBeanpublic class ProxyFactoryBean

2021-10-18 18:17:33 288

原创 03-SpringAop原生使用方式底层运行原理分析

SpringAop底层运行原理分析​ 上篇文章分析了SpringAop中的核心关键类,其实那些关键类就是SpringAop启动期几乎所有的类了。搞懂那些类之间的关系基本上就搞懂了SpringAop代理的过程。本节将基于一个简单案例,以及在之前剖析的关键类基础上分析下一个类被SpringAop增强的完整流程。​ 本文将基于SpringAop的ProxyFactory原生使用方式剖析原理,搞懂ProxyFactory其他两种方式也就搞懂了。因为ProxyFactoryBean、AspectJProxyFac

2021-10-11 08:56:12 216

原创 02-SpringAop源码分析----核心关键类分析

​ 上篇文章分析了SpringAop核心概念及其含义,从本节开始将剖析SpringAop的底层运行原理,由于篇幅较长会分为多个文章进行输出。本节将详细以Proxy为入口使用SpringAop原生使用方式(不集成Spring)案例对底层原理进行剖析。SpringAop代理入口啥是代理入口?使用过SpringAop框架的小伙伴都知道其底层是使用代理来实现的,SpringAop通过某个类可以生成代理对象,这个类就是代理入口。SpringAop提供的代理入口通过翻阅官方文档可以知道SpringA

2021-09-27 10:24:25 207

原创 01-SpringAop源码分析开篇----核心组件剖析

SpringAOP核心组件剖析​ 本文是SpringAop系列文章第一篇,本文将展示该系列文章的大致脉络以及SpringAop的大致介绍。本系列文章默认读者使用过SpringAop以及了解简单的原理。aopalliance (aop联盟)​ AOP联盟项目是几个对 AOP 和 Java感兴趣的软件工程人员之间的联合开源项目。AOP联盟旨在促进和标准化 AOP的使用,以增强现有的中间件环境(例如 J2EE)或开发环境(例如 JBuilder、Eclipse)。 AOP联盟还旨在确保 Java/J2EE

2021-09-22 14:29:52 505 1

原创 服务优雅停机

优雅停机​什么是优雅停机​ 优雅停机指的是Java项目在停机时需要做好断后工作。如果直接使用kill -9 方式暴力的将项目停掉,可能会导致正常处理的请求、定时任务、RMI、注销注册中心等出现数据不一致问题。​ 如何解决优雅停机呢?大致需要解决如下问题:首先要确保不会再有新的请求进来,所以需要设置一个流量挡板保证正常处理已进来的请求线程,可以通过计数方式记录项目中的请求数量如果涉及到注册中心,则需要在第一步结束后注销注册中心停止项目中的定时任务停止线程池关闭其他需要关闭资源等等等​

2020-10-30 11:03:20 3688 3

原创 《ThreadLocal隔离利器--01》

ThreadLocal注:ThreadLocal它并不能解决线程安全问题,它旨在用于传递数据。但是它能成功传递数据比如有个大前提:放数据和取数据的操作必须是处于相同线程。介绍及作用ThreadLocal介绍 : Thread:线程;Local:本地的,局部的;它表示线程局部变量:为当前线程绑定一个变量,这样在线程的声明周期内的任何地方均可取出ThreadLocal方法: public void set(T value) 设置值:把value和当前线程绑定 public T get()

2020-09-08 18:25:33 163

原创 Redis对象结构

Redis数据结构之Redis对象Redis基本数据类型Redis提供了5个基本数据类型 : 字符串对象 (string)、列表对象 (list)、哈希对象 (hash)、集合对象 (set)、有序集合对象 (zset)。这五种基本数据对象都至少使用了之前介绍的一种Redis编码方式。Redis对象Redis中每个对象都由一个 redisObject 结构表示:typedef struct redisObject { //数据类型 unsigned type:4; //数据编码

2020-09-04 17:48:46 224

原创 Redis实现异步消息、延时队列

Redis实现异步消息、延时队列Redis 的消息队列不是专业的消息队列,它没有非常多的高级特性,没有 ack 保证,如果对消息的可靠性有着极致的追求,那么它就不适合使用。庆幸的是Redis5版本推出了Stream数据结构之前团队内部有一个向第三方数据同步的需求,笔者就采用了Redis的方案模拟消息队列(使用定时任务 + 分布式锁方式)进行数据同步。由于数据量不大所以采用了这种方式,如果数据量过大需要衡量Redis内存问题。本篇Mark一下使用Redis作为消息队列的使用异步消息(消息队列) 消息中

2020-09-04 17:27:06 1198

原创 类拼多多砍价业务总结

砍价小程序业务总结前言 产品经理: 有个新需求,要做一个类似拼多多砍价的小程序 我: 给我拍了几天的工期啊? 产品经理:拼多多那么垃圾,3天够了吧?又不是让你做淘宝 我:哦 具体业务背景: 第三方某银行为了推广自己的商城APP拉新用户,计划推出一个砍价小程序。 APP老用户可以发起不同优惠券面值砍价任务拉新用户进行助力,新用户助力后可以获取APP固定面值优惠券一张 老用户砍价成功后可以获取一张相应任务的面值优惠券。 活动期间一个老用户只能发起一个砍价任务 业务需要支持任务

2020-09-02 16:42:36 3106 10

原创 Redis数据过期时间及删除策略

Redis数据过期时间及删除策略Redis数据设置过期时间EXPIRE <KEY> <seconds> : 设置KEY有效期为seconds秒, 单位精度 :秒PEXPIRE <KEY> <seconds> : 设置KEY有效期为seconds毫秒, 单位精度:毫秒EXPIREAT <KEY> <timestamp> : 设置KEY到UNIX时间戳timestamp时间点过期 单位精度:秒PEXPIREAT <KEY&

2020-08-12 21:08:37 945

原创 Redis分布式锁

Redis分布式锁(单Redis实例)注: 本章适用于单Redis实例的分布式锁。而且分为两个版本,分两个版本的原因是因为Redis2.6.12版本之后SET命令才支持 NX、EX等参数以下代码为伪代码版本一 (适用于Redis2.6.12版本之前)//Redis锁名称private static final String REDIS_LOCK_KEY_PREFIX = "lock";//锁有效期private static final String long TIMEOUT = 5000;

2020-08-12 20:54:29 176

原创 聊聊SpringCloud环境下父子容器

聊聊SpringCloud环境下父子容器注: 本文基于 SpringBoot-2.0.4-RELEASE S pringCloud-Finchley.SR1 版本.起因​ Debug Spring web环境时了解到在启动期间创建了两个容器: Spring IOC容器和Web容器,其中Web容器是Spring IOC 的子容器。Debug SpringBoot源码时了解到 SpringBo...

2020-04-29 17:23:32 880 1

原创 《深入理解Spring原理》 06-Spring循环依赖问题探索

Spring循环依赖问题探索注:本文基于Spring4.3.11.RELEASE版本Debug注入Bean的大致流程:AbstractApplicationContext#refresh()方法最后一步 finishBeanFactoryInitialization 会对扫描到Bean进行实例化注入。该方法主要是遍历扫描的Bean然后调用 AbstractBeanFactory#getBea...

2020-04-28 18:10:13 210

原创 SpringCloud Ribbon 设计原理

Ribbon 是netflix 公司开源的基于客户端的负载均衡组件,是Spring Cloud大家庭中非常重要的一个模块;Ribbon应该也是整个大家庭中相对而言比较复杂的模块,直接影响到服务调度的质量和性能。全面掌握Ribbon可以帮助我们了解在分布式微服务集群工作模式下,服务调度应该考虑到的每个环节。本文将详细地剖析Ribbon的设计原理,帮助大家对Spring Cloud 有一个更好...

2019-11-16 17:36:33 1141

原创 《深入理解Spring原理》 05-Spring AOP 底层实现详解

spring家族包含了很多不同领域的模块,spring-aop是开发者比较常用的一个模块,那么本节将基于源码debug方式一起学习spring-aop底层原理。 本文结构如下:扫描xml中配置的bean.将xml配置转为Bean Spring-aop拦截的Bean是如何注入到IOC的 Spring-aop执行流程如下图所示是需要使用到的简单案例,该案例主要功能是使用S...

2019-11-04 16:53:12 384

原创 《深入理解Spring原理》 03-IOC容器初始化之Bean注入详解

Spring可以轻松创建Java企业应用程序,它提供了在企业环境中使用Java语言所需的一切 。要使用Spring 必须要先构建 IOC容器,没有它Spring无法正常工作。本文将详细讲解Spring IOC 初始化机制及学习总结。 如下图所示: 定义了一个Person对象,和一个实现BeanPostProcessor接口的自定义类,本文将以此代码为基础来...

2019-11-03 22:37:04 971

原创 《深入理解Spring原理》 04-Spring利用 “三级缓存” 解决循环依赖

03-IOC容器初始化之Bean注入详解 一文中详解分析了Spring是注入Bean的,以后的文章都会在该文的基础上进行知识面的扩展。废话不多说,本文的结构如下:Spring注入Bean的几种方式 什么是Bean的循环依赖 Spring “三级缓存” 源码方式分析Spring是如何利用 “三级缓存” 解决Bean的循环依赖Step1:Spring注入Bean的几种方...

2019-11-03 13:33:37 9212 1

原创 《深入理解Spring原理》 02-Bean定义详解

Spring前言中已经介绍了Bean组件在Spring中的重要性,本文将详细讲解Bean组件。 Bean组件在Spring中的实现无外乎 : Bean的定义、Bean的解析、Bean的创建 所以本文目录如下: Bean的定义 Bean的解析 Bean的创建 Bean组件设计精髓总结 Bean组件优秀编码学习...

2019-09-27 11:18:18 450

原创 《深入理解Spring原理》 01-Spring前言

该文是《深入理解Spring原理》专栏的第一篇文章,主要介绍该专栏要学习的内容及Spring核心组件之间的关系。1. Spring组件如上图所示,上图展示了Spring家族各个领域的组件,大大小小也有十几个组件。这么多组件,把上图中所有的组件都翻一遍源码也不太现实,而且Spring本身的设计就是比较复杂的。所以本专栏会挑选常用和比较重要的组件进行学习和总结。Spr...

2019-09-26 14:14:20 449

原创 《深入理解Mybatis原理》 05-Mybatis二级缓存详解

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。本文将全面分析MyBatis的二级缓存的设计原理。本文目录结构如下:Mybatis缓存机制整体设计 二级缓存的工作模式 使用二级缓存必须要具备的条件 Mybatis二级缓存设计分析1. Mybatis缓存机制整体设计 如上图所示,当开启一个会话时...

2019-09-23 08:56:23 378

原创 《深入理解Mybatis原理》 04-Mybatis一级缓存详解 及使用注意事项

MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能。本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项。本章目录结构: 什么...

2019-09-17 17:48:00 261

原创 《深入理解Mybatis原理》 03-Mybatis SQL执行流程

本章将以简单SQL查询为例,在前两章初始化基础上讲解Mybatis运行时流程。然后会针对Mybatis运行期核心实现进行详细阐述 本章以下面的简单查询案例进行分析:public static void main(String[] args) throws IOException { InputStream resourceAsStream = Resourc...

2019-09-16 19:33:48 345

原创 《深入理解Mybatis原理》 02-Mybatis数据源与连接池

对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题。本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池。 本文首先会讲述MyBatis的数据源的分类,然后会介绍数据源是如何加载和使用的。紧接着将分类介绍UNPOOLED、POOLED和JNDI类型的数据源组织;期间我们会重点讲解POOLED类型的数据源和其实...

2019-08-23 17:28:48 358

原创 并发环境下,先操作数据库还是先操作缓存?

前言在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,先操作数据库还是先操作缓存呢?先思考一下,可能会存在哪些问题,再往下看。下面我分几种方案阐述。缓存维护方案一假设有一写(线程A)一读(线程B)操作,先操作缓存,在操作数据库。,如下流程图所示:1)线程A发起一个写操作,第一步del cache2)线程A第二步写入新数据到DB3)线程B发起一个读操...

2019-08-20 17:58:31 333

原创 《深入理解Mybatis原理》 01-Mybatis初始化机制

对于大多数开发框架在使用之前都会经历 配置 ----> 初始化 过程,Mybatis也不例外。本章将通过以下几点深入源码详细讲解Mybatis初始化过程。1.Mybatis初始化做了什么2.Mybatis解析XML配置文件创建Configuration对象过程1. Mybatis初始化做了什么?/** * <p> In-Depth St...

2019-08-20 17:25:35 235

原创 一文搞懂 Java 动态代理

Java 动态代理

2019-08-18 14:56:29 866

原创 SpringCloud Feign设计原理

Feign是什么?Feign是一个声明式的Web服务客户端,使得编写web服务客户端变得非常容易。只需要创建一个接口,然后在上面添加注解即可。主要用来进行服务间通信。Feign被广泛应用在Spring Cloud 的解决方案中,是学习基于Spring Cloud 微服务架构不可或缺的重要组件。开源项目地址:https://github.com/OpenFeign/feignF...

2019-08-17 22:14:15 1009 3

原创 深入揭秘《单例模式》

深入揭秘单例模式单例模式是开发中频繁使用的设计模式之一,也是入门设计模式比较简单的一种设计模式。基本上开发者都会使用多种方式写单例模式,并且知道单例模式不同方式的优缺点。实际上,简单的单例模式也有其中的奥妙。注意:本文重点讨论单例模式内部原理1.懒汉式单例模式懒汉式基本写法:/** * 懒汉式 单例模式 * @author jackcheng (jackcheng11...

2019-08-15 18:04:31 172

原创 全面了解位运算

全面了解位运算位运算是我们在编程中常会遇到的操作,但仍然有很多开发者并不了解位运算,这就导致在遇到位运算时会“打退堂鼓”。实际上,位运算并没有那么复杂,只要我们了解其运算基础和运算符的运算规则,就能够掌握位运算的知识。接下来,我们一起学习位运算的相关知识。程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作。注意:本文只讨论整数运算,小...

2019-07-12 12:18:02 1112 2

原创 使用idea集成远程docker部署项目

准备centos7 ,并且安装好docker打开docker配置文件(docker把端口号2375开放,,但是测试用用还可以,正式的就不行。)1.修改配置文件 vim /usr/lib/systemd/system/docker.service 在ExecStart=/usr/bin/dockerd-current 后面加上 -H tcp://0.0.0.0:2...

2018-10-16 13:05:22 18073 10

原创 使用idea创建springBoot Maven聚合工程

我们以一个Gaoxi来命名总项目的名称1。首先创建 主项目---Gaoxi(这个是我们的父模块,只用来写pom) 创建好Gaoxi模块后,将src等没有用的文件全部删除,删除后目录如下:2.修改Gaoxi模块的pom文件: 将package打包方式修改为 pom3.创建其他子模块Gaoxi-user,和...

2018-09-09 16:46:55 13844

原创 Redis分布式解决方案 (consistent hash)

传统的redis分布式算法:         比如现在有一个数据,使用redis存储时,会现将其进行hash计算,然后根据计算的hash值进行取模,根据取模的结果将数据缓存到与结果值对应的redis中。算法如下: 案例1:传统分布式算法     使用传统的redis分布式算法的结果如下:根据取模的结果,将数据存储到相应的redis中 现在由于业务的需求,我们...

2018-07-22 17:23:32 2181

原创 Nginx负载均衡常用策略

Nginx的常用策略:    1.轮询(默认)    2.权重    3. ip hash    4. url hash(第三方插件)    5. fair(第三方插件)) 1.轮询     缺点场景: 比如现在有两台服务器,一台性能比较好,一台性能一般,如果使用轮询的话,可能不能根据服务器的                     性能来分配请求。 ...

2018-07-20 21:06:26 3508

原创 CentOS 虚拟网卡配置

最近在VMware安装CentOS6.5之后,每次从宿主机访问虚拟机的Oracle时,都要修改IP地址,因为没有设置虚拟机的IP,所以每次开机之后虚拟机的IP地址都是随机的,于是研究了下给虚拟机配置静态IP地址,这样以后每次打开虚拟机之后不用修改IP地址直接可以访问Oracle了。 1 虚拟机外部设置1.1 网络适配器模式设置选中虚拟机,右键 -&gt; 设置 -&gt; 网络适配器 -&gt; ...

2018-07-14 14:26:07 6124

原创 CentOS使用yum的elrepo源升级内核

今天想在centos6.5安装docker,在网上查了说centos6.5需要64位的,内核需要升级到3.x以上(centos6.5本来是2.6),终于看到一篇文章是可以的,于是记录下来。了解一下elrepoelrepo是CentOS十分有用的稳定的软件源,与其他软件源不一样的是,这个第三方源主要是提供硬件驱动、内核更新方面的支持,如显卡、无线网卡、内核等等,现在已经支持centos7.x+,更新...

2018-07-07 16:20:46 13721 2

空空如也

空空如也

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

TA关注的人

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