
java
张书康
学海无涯。
展开
-
Java | 获取类中所有的泛型对应的class类型
一般获取具体某个类的class类型,直接调用 getClass()方法或者 .class。但是在一些抽象类 或者 接口中,我们需要获得泛型对应的class类型,以上方法就不再适用。/** * * 通用service,这里有三个泛型 T,D,ID * Created by zhangshukang on 2018/1/8. */public abstract class Abst原创 2018-01-09 18:00:41 · 6729 阅读 · 0 评论 -
Java | SPI机制 | ServiceLoader源码分析
问题最近学习dubbo源码的时候,接触了spi机制。如果不了解这的话,dubbo源码或许看起来你会迷惑。那么什么是SPI机制呢?实际项目中又是怎么使用的呢?背景当我们开发项目中如果需要第三方的服务支持,可以直接写死到代码里面,指定具体实现。但这种方式耦合太强,不利于切换到其它服务,好的方法是写一个配置文件指定服务的实现方,这个时候java的spi机制就能发挥作用了。比如我们经常用的数...原创 2018-09-20 18:36:30 · 415 阅读 · 0 评论 -
SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)
概述springBoot为我们提供了自动化装配的功能,简单方便。可以像使用插件一样,对各个组件自由组合装配。只需引入定义好的 starter 即可。有点类似于java的SPI机制,只不过SPI机制是为了解决项目与项目之间的解耦,而starter方式实现了模块化完全解耦,实现热插拔功能。今天就来自定义一个自动化装配的实现,自定义starter。自定义starter首先定义一个配置类模块:...原创 2018-09-20 19:52:20 · 10368 阅读 · 6 评论 -
Spring | Aop核心 | Cglib源码详细解析
概述很多时候在编译时期不能决定具体的对象类型,无法生成所需要的字节码。只能在运行时期,根据传入的实例,来生成字节码。这就是动态代理要解决的问题。Cglib是一个强大的高性能的字节码生成工具包。底层通过字节码增强处理框架 ASM,来生成字节码并装载到JVM。脚本语言Groovy也是使用ASM来生成或修改Java的字节码。Spring Aop中的代理生成方式采用了jdk动态代理和cglib...原创 2018-10-27 23:37:05 · 5015 阅读 · 0 评论 -
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 · 1262 阅读 · 0 评论 -
SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)
概述Spring 的核心思想即是容器。整个容器运行时,外部看似风平浪静,内部实则一片汪洋大海。Spring 容器刷新的过程严格遵守开闭原则,内部对修改关闭,对扩展开放。可以这么理解:把 Spring 容器理解为一个钥匙环,上面挂满了钥匙,每个钥匙理解为一个扩展接口。钥匙的顺序是固定的,可理解为接口的调用顺序固定,对修改关闭。每个钥匙可以用来做不同的事情,可理解为扩展接口的实现不同,对扩展开...原创 2019-01-09 13:24:15 · 5945 阅读 · 4 评论 -
Java | Jdk动态代理源码分析
大致核心类:执行时序图源码分析未完待续。原创 2019-01-26 22:07:36 · 390 阅读 · 0 评论 -
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 · 20142 阅读 · 8 评论 -
java | BitMap原理解析
概述在一些数据量比较大的场景中,做一些查重、排序,一般的方法难以实现。数据量过大,会占用较大的内存,常用的处理方式有两种:BitMap(位图法)和布隆过滤。本篇针对以下题目来看一下如何用位图法来实现:10亿个正整数,给定一个数值,如何快速排定该数值是否在10亿个正整数当中?位图法的思想类似于hash寻址,首先初始化一个int数组,每个元素对应32位比特,将10亿个元素分别读入内存,对int数...原创 2019-03-26 11:11:09 · 16480 阅读 · 5 评论 -
Java | Java 线程模型 | 用户线程 | 内核线程
概述在以前的操作系统中,没有线程的概念。进程是资源分配和调度的最小单元。引入线程的概念以后,线程则是资源调度和分配的最小单元。线程又分为用户线程和内核线程。用户线程:语言层面创建的线程,比如 java语言中多线程技术,通过语言提供的线程库来创建、销毁线程。内核线程:内核线程又称为守护线程 Daemon线程,用户线程的运行必须依赖内核线程,通过内核线程调度器来分配到相应的处理器上。线程模型...原创 2019-03-28 18:06:00 · 1748 阅读 · 0 评论 -
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 · 13634 阅读 · 2 评论 -
Java | JVM虚方法调用那些事
概述在以前面试过程中,会遇到一些这样的面试题:说一下java语言 静态绑定 和 动态绑定的本质区别? 这道题听起来好像没怎么接触过,换个问法可能就很清晰了:重载和重写的实现原理和区别。具体来分析以下这两点: 方法调用 方法表方法调用java是一种半编译半解释型语言,也就是class文件会被解释成机器码,而方法调用也会被解释成具体的方法调用指令,大致可以分为...原创 2018-08-02 20:00:45 · 2151 阅读 · 0 评论 -
Java | ConcurrentHashMap 实现缓存类(阿里面试题)
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I...原创 2018-08-01 17:58:20 · 5711 阅读 · 10 评论 -
多线程 | AQS | 条件队列 Condition 源码分析
1)条件队列概念:条件队列是当某个条件不满足状态时,挂起自己并释放锁,一旦等待条件为真,则立即醒来。这也是条件队列提供的主要功能。 Object的wait/notify/notifyAll等方法构成了内部条件队列的API,在lock中又是怎么实现的呢? 就是这里要讨论的条件队列 condition。 具体使用示例就不展示了,和 wait/notify/notifyAll 使用场景类似...原创 2018-02-11 21:04:19 · 1009 阅读 · 0 评论 -
SpringBoot | SpringBoot 微服务整合Swagger生成API文档
关于swagger的优点就不描述了,直接来看一下使用示例:1)首先引入swagger依赖: <!--swagger--> <dependency> <groupId>io.springfox</groupId> &am原创 2018-02-12 18:23:37 · 671 阅读 · 0 评论 -
Spring | SpringMVC异步请求源码分析
1)Spring 异步请求使用示例: @RequestMapping(value ="/{id}",method = RequestMethod.GET) public Callable<Contents> getContentById(@PathVariable("id&qu原创 2018-02-12 13:10:11 · 1525 阅读 · 1 评论 -
Spring Cloud | Spring Cloud Consul 重写服务发现逻辑
1)概述Spring Cloud提供了完整的服务注册和服务发现逻辑,但是在devops流行的今天,简单的服务发现逻辑,并不能满足我们的需求,特别是在服务很多的情况下。比如:如果一位开发同学拉取并部署了项目project-a,另一位同学也部署了project-a,也就意味着project-a此时有两套环境。假如一个公司有成百上千个微服务,一个服务就有可能出现很多测试环。如何保证服务调用能...原创 2018-07-10 14:17:33 · 2244 阅读 · 2 评论 -
Java | 多线程 | 史上最全Java多线程面试题及答案(持续更新中)
1、Synchronized和Violatile的本质区别? 1)Synchronized底层实现依赖于jvm的监视器monitor,对编译后的代码指令加锁。所以会出现阻塞情况。而Violatile底层实现则是借助于寄存器,也就是工作内存,在读取Violatile变量时,jvm会告诉寄存器,该变量的值需要同步到主内存,不会出现阻塞的情况。 2)线程池安全主要涉及两个方面:原子...原创 2018-07-25 18:42:26 · 1709 阅读 · 0 评论 -
Java | 多线程 | ThreadLocal结合线程池的正确使用方式
1)问题:才发现,写这篇博客之前,自己一直在以一种错误的姿势在用threadLocal对象。但我不信就我一人姿势不对。 场景就是threadLocal在项目中使用时,出现取值错误的情况。原因是 threadLocal在多线程环境下使用不当,花了不少时间排查,因为在不该出问题的地方出了问题,最终还是排查到线程池上。之前一直没有问题,或许是因为并发不高。最终今天还是遇到了问题(出来混,迟早是要还...原创 2018-07-27 17:03:10 · 9954 阅读 · 8 评论 -
Java | 开发规范 | 唯品会开发手册(一) | 并发篇
Rule 1. 【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯1)创建单条线程时直接指定线程名称Thread t = new Thread();t.setName("cleanup-thread");2) 线程池则使用guava或原创 2018-08-06 14:06:46 · 1522 阅读 · 0 评论 -
Java | 开发规范 | 唯品会开发手册(二) | 集合篇
Rule 1. 【推荐】底层数据结构是数组的集合,指定集合初始大小推荐底层数据结构为数组的集合包括 ArrayList,HashMap,HashSet,ArrayDequeue等。数组有大小限制,当超过容量时,需要进行复制式扩容,新申请一个是原来容量150% or 200%的数组,将原来的内容复制过去,同时浪费了内存与性能。HashMap/HashSet的扩容,还需要所有键值对重新落位,消...原创 2018-08-10 14:42:09 · 1083 阅读 · 0 评论 -
再谈序列化
JDK序列化jdk序列化会生成二进制文件类似于class文件,(Java中的calss文件是16进制文件)是经过编译器预处理过的一种文件,是Java的执行文件存在形式,它本身是二进制文件,但是不可以被系统直接执行,而是需要虚拟机解释执行。所以打开之后并不是我们说的二进制0或1。如果是0或1了,那就不需要JVM进行解释执行了,所以我们常说java是半编译半解释型的语言。jdk序列化生成的二进...原创 2019-05-13 17:31:26 · 329 阅读 · 0 评论