自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序员阿康

源码面前,了无秘密。

  • 博客(54)
  • 收藏
  • 关注

原创 SpringCloud | 深入解析SpringCloud中的父子容器

概述在引入 SpringCloud 的项目中会多次创建 Spring 容器,本篇从源码角度深入分析具体哪些点会创建 Spring 容器,以及这些容器之间的区别与联系。本文介绍的Spring相关容器是基于SpringCloud项目。容器大致分为三层:BootStrap Spring 容器:由SpringCloud 监听器创建,用来初始化 SpringCloud 上下文Spring...

2019-01-27 01:00:42 2917 4

原创 SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)

概述Spring 的核心思想即是容器。整个容器运行时,外部看似风平浪静,内部实则一片汪洋大海。Spring 容器刷新的过程严格遵守开闭原则,内部对修改关闭,对扩展开放。可以这么理解:把 Spring 容器理解为一个钥匙环,上面挂满了钥匙,每个钥匙理解为一个扩展接口。钥匙的顺序是固定的,可理解为接口的调用顺序固定,对修改关闭。每个钥匙可以用来做不同的事情,可理解为扩展接口的实现不同,对扩展开...

2019-01-09 13:24:15 5791 4

原创 SpringBoot2 | BeanDefinition 注册核心类 ImportBeanDefinitionRegistrar 源码分析 (十)

概述本篇来介绍一个Spring强大的扩展接口:ImportBeanDefinitionRegistrar,该接口主要用来注册beanDefinition。很多三方框架集成Spring 的时候,都会通过该接口,实现扫描指定的类,然后注册到spring 容器中。比如 Mybatis 中的Mapper接口,springCloud中的 FeignClient 接口,都是通过该接口实现的自定义注册逻辑。...

2018-12-27 11:23:47 7410

原创 SpringBoot2 | SpingBoot FilterRegistrationBean 注册组件 | FilterChain 责任链源码分析(九)

微信公众号:吉姆餐厅ak学习更多源码知识,欢迎关注。SpringBoot2 | SpringBoot启动流程源码分析(一)SpringBoot2 | SpringBoot启动流程源码分析(二)SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)SpringBoot2 | SpringBoot Environment源码分析(四...

2018-12-15 20:57:45 12680 5

原创 SpringBoot2 | Spring AOP 原理深度源码分析(八)

概述AOP(Aspect-Oriented Programming) 面向切面编程。简单来说,就是将影响对象行为的一些公共方法抽取出来,做成公共部分即为切面。使用方式就不用阐述了,本系列主要是对源码进行深度分析和总结。UML图Spring Aop 自动装配核心类 UML图:源码springboot 自动装配肯定还是从spring.factories开始:# Auto Config...

2018-11-25 16:11:11 18419 11

原创 SpringBoot2 | 条件注解 @ConditionalOnBean 原理源码分析(七)

条件注解是Spring4提供的一种bean加载特性,主要用于控制配置类和bean初始化条件。在springBoot,springCloud一系列框架底层源码中,条件注解的使用到处可见。本篇就来探讨一下比较常用的一个调节注解:@ConditionalOnBean。可能不少人在使用该注解时会遇到不生效的情况:@ConditionalOnBean依赖的 bean 明明已经配置了,但就是不生效。@C...

2018-11-17 00:15:12 14305 7

原创 SpringCloud | SpringCloud Feign的前世今生【源码深入分析】

概述springCloud feign主要对netflix feign进行了增强和包装,本篇从源码角度带你过一遍装配流程,揭开feign底层的神秘面纱。主要包括feign整合ribbon,hystrix,sleuth,以及生成的代理类最终注入到spring容器的过程。篇幅略长,耐心读完,相信你会有所收获。Feign架构图一些核心类及大致流程:大体步骤:1、注册FeignClie...

2018-10-13 11:21:22 4088 1

原创 SpringBoot2 | SpringBoot监听器源码分析 | 自定义ApplicationListener(六)

概述我们都知道Spring源码博大精深,阅读起来相对困难。原因之一就是内部用了大量的监听器,spring相关的框架,皆是如此,spring security,springBoot等。今天来看下springBoot监听器的应用。因为springBoot是对spring的封装,所以springBoot的监听器的应用主要是在启动模块。源码springBoot监听器的主要分为两类,运行时监听...

2018-09-21 18:33:31 6948

原创 SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)

概述springBoot为我们提供了自动化装配的功能,简单方便。可以像使用插件一样,对各个组件自由组合装配。只需引入定义好的 starter 即可。有点类似于java的SPI机制,只不过SPI机制是为了解决项目与项目之间的解耦,而starter方式实现了模块化完全解耦,实现热插拔功能。今天就来自定义一个自动化装配的实现,自定义starter。自定义starter首先定义一个配置类模块:...

2018-09-20 19:52:20 10196 6

原创 SpringBoot2 | SpringBoot Environment源码分析(四)

版权声明:本文为博主原创文章,转载请标明出处。SpringBoot2 | SpringBoot启动流程源码分析(一)SpringBoot2 | SpringBoot启动流程源码分析(二)SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)一、概述Environment是 spring 为运行环境提供的高度抽象接口,项...

2018-09-17 15:32:32 10816 1

原创 SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)

在上一篇博客中分析了springBoot启动流程,大体的轮廓只是冰山一角。今天就来看一下springBoot的亮点功能:自动化装配功能。 先从@SpringBootApplication开始。在启动流程章节中,我们讲述了SpringBoot2大致的启动步骤,并进行了源码详解。但是在刷新容器这块并未展开,refreshContext(context);简单的一行代码,背后却做了太多...

2018-09-07 17:02:06 21242 6

原创 SpringBoot2 | SpringBoot启动流程源码分析(二)

继续上一篇博客的启动流程分析。 在上一篇SpringBoot | SpringBoot2 | SpringBoot2启动流程源码分析(一)中我们提到springBoot启动流程大致有以下7点:第一步:获取并启动监听器第二步:构造容器环境第三步:创建容器第四步:实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误第五步:准备容器...

2018-09-03 16:01:43 22380 5

原创 SpringBoot2 | SpringBoot启动流程源码分析(一)

概述:前阵子看到了SpringCloud社区的一个开源项目,主要是对服务发现增强的功能。研究项目的时候发现代码简练,优雅,最主要是spring ioc和aop特性应用的得心应手。若非对源码有深入研究,不可能写出这么优秀的开源项目。另外在现有的springboot专栏中,大多数博文旨在应用,对一些中间件的整合之类,源码分析的博客数量有限。鉴于以上两方面,该系列应运而生。该系列主要还是Spri...

2018-08-31 15:29:58 129037 32

原创 SpringSecurity | spring security oauth2.0 配置源码分析(二)

继上一篇《SpringSecurity | spring security oauth2.0 配置源码分析(一)》简单的分析配置之后,今天从源码的角度来分析配置是如何生效的,Oauth2.0如何和 Spring Security 整合的。 1)先看下Spring Security中 HttpSecurity配置:在上一篇配置讲解中,我们提到了oauth2两个注解配置: //配

2018-01-03 18:50:33 1505 2

原创 SpringCloud | FeignClient和Ribbon重试机制区别与联系

在spring cloud体系项目中,引入的重试机制保证了高可用的同时,也会带来一些其它的问题,如幂等操作或一些没必要的重试。 今天就来分别分析一下 FeignClient 和 Ribbon 重试机制的实现原理和区别,主要分为三点: 1)FeignClient重试机制分析 2)Ribbon重试机制分析 3)FeignClient和Ribbon重试机制的区别于联系

2018-01-03 12:03:29 7597 2

原创 SpringSecurity | spring security oauth2.0 配置源码分析(一)

概述:在微服务发展迅速的今天,认证授权独立成微服务已是一种趋势,不仅承担着整个系统访问入口的认证和授权,还要易于扩展,能更好的接入第三方服务。而当今Oauth2协议在认证授权领域大行其道,算是功能比较完整的权限协议标准了。spring security oauth2的整合方案应该广为应用,该系列博客就来分析其机制原理。 oauth2的配置繁琐复杂,但是只要搞懂每个类的作用,整体来看,并不

2017-12-23 17:26:54 4252

原创 SpringCloud | Feign如何整合Ribbon进行负载均衡的?

Ribbon是SpringCloud框架进行负载均衡的脚手架,贯穿springCloud项目中所有的http服务调用。Ribbon针对RestTemplate负载均衡已经提供了完整实现,网上很多的ribbon demo也是分析restTemplate如何负载均衡的。而我们都知道,feignClient已经默认使用了ribbon,feign是如何利用ribbon的负载均衡的呢?带着疑惑看了一遍代...

2017-12-19 19:40:51 21223 6

原创 重写spring bean的几种方式

概述工作中会经常会需要重写jar包中的一个类,开源的jar包或者是其他项目提供的share包,比较通用的做法是下载源码下来,修改后重新打包。但是很多时候我们只是重写一个类,下载源码打包太过繁琐,而且有可能别人的share没有提供源码下载。可以通过下面几种方式重写:1、直接同包路径,同报名,进行替换这种方式简单粗暴,前提必须是同包路径,同类名。可以直接覆盖掉jar包中的类,spring项目会...

2019-09-17 09:51:04 7099 1

原创 SpringBoot 生成带水印pdf | 中文字体问题

概述生成pdfSpringBoot部署方式以jar包方式运行,在获取字体的时候获取不到,因为在服务器上读取的字体路径为jar包中的路径:file:/root/startup/za-minos-ms.jar!/BOOT-INF/classes!/如上图,这种路径是无法正确读取文件的,所以合理的解决方案是通过流读取,然后在服务器上创建新的文件。读取和创建新文件的代码:/** * Crea...

2019-07-30 18:48:21 3863

原创 SpringCloud Sleuth 实现业务逻辑日志包含 Span 和 Trace信息

概述SpringCloud Sleuth是Spring Cloud的核心组件之一,实现了一种分布式链路跟踪的功能。在调用链层级很深的分布式系统中,为定位问题提供了很大便利。Sleuth 大致的原理是自定义了一个拦截器:TraceFeignRequestInterceptor,该拦截器继承了 Feign 的拦截器接口:RequestInterceptor,所以在服务与服务直接调用时,可以进行一些...

2019-05-21 16:02:04 4666 2

原创 Netty系列 | 再谈NIO

三大组件

2019-05-16 18:49:20 388

原创 再谈序列化

JDK序列化jdk序列化会生成二进制文件类似于class文件,(Java中的calss文件是16进制文件)是经过编译器预处理过的一种文件,是Java的执行文件存在形式,它本身是二进制文件,但是不可以被系统直接执行,而是需要虚拟机解释执行。所以打开之后并不是我们说的二进制0或1。如果是0或1了,那就不需要JVM进行解释执行了,所以我们常说java是半编译半解释型的语言。jdk序列化生成的二进...

2019-05-13 17:31:26 279

原创 基于 SpringBoot2 和 Netty 实现一个简易的RPC通信框架

概述大致的流程:实现客户端 代理类处理逻辑 :InvocationHandler扫描被代理接口,生成代理类,注入 spring 容器根据调用的接口,找到指定的实现类,并完成调用。代码1)NettyRpcInvocationHandlerpublic class NettyRpcInvocationHandler implements InvocationHandler { ...

2019-04-03 17:11:55 2004

原创 Java | Java 线程模型 | 用户线程 | 内核线程

概述在以前的操作系统中,没有线程的概念。进程是资源分配和调度的最小单元。引入线程的概念以后,线程则是资源调度和分配的最小单元。线程又分为用户线程和内核线程。用户线程:语言层面创建的线程,比如 java语言中多线程技术,通过语言提供的线程库来创建、销毁线程。内核线程:内核线程又称为守护线程 Daemon线程,用户线程的运行必须依赖内核线程,通过内核线程调度器来分配到相应的处理器上。线程模型...

2019-03-28 18:06:00 1653

原创 java | BitMap原理解析

概述在一些数据量比较大的场景中,做一些查重、排序,一般的方法难以实现。数据量过大,会占用较大的内存,常用的处理方式有两种:BitMap(位图法)和布隆过滤。本篇针对以下题目来看一下如何用位图法来实现:10亿个正整数,给定一个数值,如何快速排定该数值是否在10亿个正整数当中?位图法的思想类似于hash寻址,首先初始化一个int数组,每个元素对应32位比特,将10亿个元素分别读入内存,对int数...

2019-03-26 11:11:09 16245 5

原创 Spring Cloud Config 动态刷新实现机制

首先 spring cloud config 动态刷新功能相关类是整合在 spring-cloud-context包中,包括 RefreshEndpoint 以及配置类。通过以下变量来确定是否开启,默认为true。@ConditionalOnProperty(value = "endpoints.refresh.enabled", matchIfMissing = true)Refresh...

2019-03-07 11:38:51 19659 8

原创 Spring Cloud Ribbon 核心类

2019-02-28 20:07:55 431

原创 Idea debug模式下出现 "Connected to the target VM, address: '127.0.0.1:55606', transport: 'socket'"

如题,一个很坑的错误。不在debug模式下启动,项目运行没有问题。在debug模式下运行,出现"Connected to the target VM, address: '127.0.0.1:55606', transport: 'socket'"网上有解决方案,说和测试类中方法的大写有关。然而,我换了一个全新的项目,启动时也有同样的问题。这种情况基本上就告别idea了(更换新版本...

2019-02-26 18:45:23 64956 10

原创 Java | Jdk动态代理源码分析

大致核心类:执行时序图源码分析未完待续。

2019-01-26 22:07:36 323

原创 Spring | Spring AOP 增强框架 Nepxion Matrix 详解

概述在 SpringBoot2 | Spring AOP 原理源码深度剖析(八)一文中,介绍了 Spring AOP 的多种实现机制,原理大同小异。本篇来继续介绍一款开源的 AOP 框架:Nepxion Matrix,该框架致力于对 Spring AOP 的扩展和增强,灵活而且易用。代码:https://github.com/Nepxion/MatrixMatrix框架主要对Spring做了...

2018-12-02 22:25:12 1138

原创 Spring | Aop核心 | Cglib源码详细解析

概述很多时候在编译时期不能决定具体的对象类型,无法生成所需要的字节码。只能在运行时期,根据传入的实例,来生成字节码。这就是动态代理要解决的问题。Cglib是一个强大的高性能的字节码生成工具包。底层通过字节码增强处理框架 ASM,来生成字节码并装载到JVM。脚本语言Groovy也是使用ASM来生成或修改Java的字节码。Spring Aop中的代理生成方式采用了jdk动态代理和cglib...

2018-10-27 23:37:05 4778

原创 SpringBoot2 | SpringBoot2 Hikari数据源配置

概述SpringBoot2中默认的数据已经更改为hikari,据说性能很高,有兴趣的可以进行测试。配置之前在做springBoot1.5升级到springBoot2.0时,发现数据源出错,看了下官方文档,才发现,默认数据源已修改。使用方式在pom.xml中引入依赖: <dependency> <groupId>org.springframewor

2018-10-11 13:16:09 33024 3

原创 Java | SPI机制 | ServiceLoader源码分析

问题最近学习dubbo源码的时候,接触了spi机制。如果不了解这的话,dubbo源码或许看起来你会迷惑。那么什么是SPI机制呢?实际项目中又是怎么使用的呢?背景当我们开发项目中如果需要第三方的服务支持,可以直接写死到代码里面,指定具体实现。但这种方式耦合太强,不利于切换到其它服务,好的方法是写一个配置文件指定服务的实现方,这个时候java的spi机制就能发挥作用了。比如我们经常用的数...

2018-09-20 18:36:30 359

原创 Java | httpClient请求put方法

概述目前很多公司项目大多是微服务开发,接口规范一般会采用restful格式,所以请求方式不局限于post和get,还有put和delete。所以在用httpClient请求的时候,会遇到请求方式的问题,因为非微服务项目只有post和get两种请求方。所以这里做了一个简单的封装。支持post put分别对应的 K-V、json方式:/** * 发送 POST 请求(HTTP),K...

2018-09-19 19:30:34 13231 2

原创 Java | 开发规范 | 唯品会开发手册(二) | 集合篇

Rule 1. 【推荐】底层数据结构是数组的集合,指定集合初始大小推荐底层数据结构为数组的集合包括 ArrayList,HashMap,HashSet,ArrayDequeue等。数组有大小限制,当超过容量时,需要进行复制式扩容,新申请一个是原来容量150% or 200%的数组,将原来的内容复制过去,同时浪费了内存与性能。HashMap/HashSet的扩容,还需要所有键值对重新落位,消...

2018-08-10 14:42:09 1019

原创 Java | 开发规范 | 唯品会开发手册(一) | 并发篇

Rule 1. 【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯1)创建单条线程时直接指定线程名称Thread t = new Thread();t.setName("cleanup-thread");2) 线程池则使用guava或

2018-08-06 14:06:46 1439

原创 Java | JVM虚方法调用那些事

概述在以前面试过程中,会遇到一些这样的面试题:说一下java语言 静态绑定 和 动态绑定的本质区别? 这道题听起来好像没怎么接触过,换个问法可能就很清晰了:重载和重写的实现原理和区别。具体来分析以下这两点: 方法调用 方法表方法调用java是一种半编译半解释型语言,也就是class文件会被解释成机器码,而方法调用也会被解释成具体的方法调用指令,大致可以分为...

2018-08-02 20:00:45 2049

原创 Java | ConcurrentHashMap 实现缓存类(阿里面试题)

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I...

2018-08-01 17:58:20 5629 10

原创 Java | 多线程 | ThreadLocal结合线程池的正确使用方式

1)问题:才发现,写这篇博客之前,自己一直在以一种错误的姿势在用threadLocal对象。但我不信就我一人姿势不对。 场景就是threadLocal在项目中使用时,出现取值错误的情况。原因是 threadLocal在多线程环境下使用不当,花了不少时间排查,因为在不该出问题的地方出了问题,最终还是排查到线程池上。之前一直没有问题,或许是因为并发不高。最终今天还是遇到了问题(出来混,迟早是要还...

2018-07-27 17:03:10 8924 8

原创 Java | 多线程 | 史上最全Java多线程面试题及答案(持续更新中)

1、Synchronized和Violatile的本质区别? 1)Synchronized底层实现依赖于jvm的监视器monitor,对编译后的代码指令加锁。所以会出现阻塞情况。而Violatile底层实现则是借助于寄存器,也就是工作内存,在读取Violatile变量时,jvm会告诉寄存器,该变量的值需要同步到主内存,不会出现阻塞的情况。 2)线程池安全主要涉及两个方面:原子...

2018-07-25 18:42:26 1528

空空如也

空空如也

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

TA关注的人

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