
源码分析
文章平均质量分 57
micro_hz
Engineer
展开
-
PDFbox的head is mandatory问题
问题这个是加载字体文件的时候无法找到文件的头信息报出的:搜索大量资料,在stackoverflow找到解决方案:这个是maven资源过滤导致文件异常。原文中文社区没找到,我补充一下。例如外PDDocument如何转换为inputStream流也在社区找到解决方案:...原创 2021-07-14 11:07:46 · 5777 阅读 · 2 评论 -
MybatisPlus自增ID超大自动时间戳生成排查
问题数据库我预期是用自增ID,但是用MybatisPlus动态SQL框架写入,ID是非常大的一个值。分析调用insert是动态生成SQL,id为空。由于动态SQL主要sqlSession执行过程如下图,其中关键到了预编译参数的process方法,此时的id还是null。此时会根据entity去获取表的信息,其中就包含了ID生成规则的定义。其中默认在框架启动的时候定义为idType为ASSIGN_ID的策略。接着就去处理主键。这里用内部的方法填充ID可以看到才去类似雪花算法的生成逻原创 2021-06-02 14:32:40 · 823 阅读 · 0 评论 -
阿里云OSS请求文件跨域问题Access-Control-Allow-Origin
跨域问题网上很多解决方案提示到这里配置但是不生效,一定要勾选Vary:Origin这个选项,请求的时候浏览器记得请求在控制台要清理缓存。原创 2021-06-01 14:05:57 · 2446 阅读 · 0 评论 -
如何使用H2与SpringBoot写DAO单元测试
背景最近在推团队单元测试的标准,其实任何依赖外部调用严格意义上都不算单元测试,但是数据库的SQL的正确性,的确是需要自测保证的,第一个版本就是本地初始化mybatis然后访问远程数据库,但这样容易影响测试数据库,因此本次考虑使用H2内存数据库进行测试。H2分几种模式,其中内存数据库就是应用启动DDL表然后应用结束销毁所有,所以快捷轻量。使用H2 + SpringBoot首先pom文件 <dependency> <groupId>org.myb原创 2021-05-09 22:18:46 · 1078 阅读 · 2 评论 -
yml读取下划线丢失问题
问题在项目中时常需要读取配置文件,例如某个变量会随着环境的不同而不同,在springboot项目中会很容易想到yml的方式。但是最近遇到一个问题,发现下划线被注入的到bean中会丢失下划线,差点引起线上故障,demo如下:@Componentpublic class YmlConfTest { @Value("${id}") private String id;}yml配置文件如下:id : 1_2但是实际运行中发现id注入的是12,而不是预期的1_2,这就导致问题发生。原创 2021-01-23 09:57:30 · 4654 阅读 · 2 评论 -
dubbo与springMVC边界日志快速接入
在项目的测试阶段,系统的边界日志是十分重要的,但是又不想无限制的打印日志,可能仅仅希望在测试环境打开,所以很多时候便于调试,我们会不停的加日志,到了发布之前很容易删除冗余的日志导致线上的磁盘压力过大。图中绿色部分是我们很关注的日志,我们的微服务系统采用的是SpringMVC + dubbo两种方式进行RPC调用,针对这种场景提出两个目标优化点:快速集成日志记录,对业务代码无入侵可以灵活控制环境打印日志文件隔离SpringMVC接口拦截一般记录这种横切面的日志,首先想到的是AOP的方式,的确原创 2021-01-22 15:36:57 · 432 阅读 · 0 评论 -
SpringBoot自动化配置mybatis源码分析
上一篇文章,讲到源码的分析,这次来分析mybatis与spring进行集成的源码。阅读准备首先提出几个问题spring如何是把依赖的mapper接口注入成mybatis的对象的。spring boot是如何加载到mybatis的。Spring骨架接口定义spring里的一些基本概念,要做一个简单的介绍,否则深入到spring与mybatis集成的源码是比较难理解。Spring的类图轮廓,其中BeanFactory是容器的最抽象接口,下面一些接口扩展了接口抽象,继承的层次越多,一般接口的能原创 2020-06-08 17:24:50 · 589 阅读 · 0 评论 -
关于阅读源码的总结
为什么开始阅读其实源码平时也有在看,但是时间比较碎片化,刚好最近需要做内部技术分享在调研技术栈,为了避免枯燥无味,想更贴合平日的项目,spring与jdk基本也没太多新意并且自以为自己没太自信能够讲清楚,另一方面数据库一般又是整个项目的核心所在,所以这次主要从国内最常见的orm框架mybatis作为主要的一个主要的分享内容。由于考虑到整个源码的分析可能篇幅较大,不追求华丽的描述和故弄玄虚,只是想简简单单的讲清楚,所以分多篇文章去分析,每篇文章自己觉得比较重要的点。如何阅读源码源码里一般都是OOP的原创 2020-06-08 11:40:38 · 296 阅读 · 0 评论 -
spring boot集成测试容器重启问题
背景spring boot test的项目中常用的测试框架, 最近在写集成测试的时候发现一个比较奇怪的问题,当我在运行多个测试用例的时候会偶尔重新启动整个容器上下文,由于后期业务逐渐复杂,大量的测试用例需要运行,这个问题直接导致回归测试的效率降低。举个例子:几个类:@RunWith(SpringRunner.class)@SpringBootTest(classes = TestApplication.class)public class BaseApiTest { @Test原创 2020-05-22 23:48:06 · 4795 阅读 · 1 评论 -
Dubbo部署导致上游调用报错问题排查
现象在部署的时候,总会有上游的部分调用请求出错。在流量小的时候这样的报错是能容忍的,但是库存作为核心服务,高并发的极小的流量,它占的绝对值的数量也不小,所以这个问题已经到了不得不解决的地步。开始抓取以下的日志进行分析。原因分析应用启动的日志:启动的时间点为:16:48分,但是准确的服务提供的时间其实并非这个时间点。因为我们在应用层用AOP去拦截了所有请求,看请求日志如下:也就是说27...原创 2019-10-16 19:41:43 · 814 阅读 · 0 评论 -
踩坑PowerMock org.powermock.api.extension.listener.AnnotationEnabler 问题
今天遇到一个powermock的问题:堆栈打印:org.powermock.api.extension.listener.AnnotationEnablerdebug到源代码发现为:Argument should be a mock, but is:class …代码如下:public class MockTest extends BaseTest{ @Spy @Inje...原创 2019-08-21 09:57:18 · 3815 阅读 · 0 评论 -
Java迭代fail-fast异常源码分析
问题今天遇到一个问题,在遍历集合对象的时候同时修改了迭代的对象,导致了ConcurrentModificationException。这是一个比较常见但是又非常隐蔽的错误,特此来总结下这个Java里的fast-fail机制。示范代码 ArrayListMultimap<String, Integer> map = ArrayListMultimap.create(); ...原创 2019-06-16 23:02:51 · 208 阅读 · 0 评论 -
springMVC文件上传源码
springMVC是流行的web框架,它不仅轻量灵活还提供了一系列可扩展的功能,这次我们分析一个http上传请求在spring框架中的处理源码,其实本博客更多是博主自学总结使用,上篇spring源码的博文被推送到首页让博主手从若惊,一方面为自己的努力得到认可兴奋,另一方面则是担忧自己学识浅薄怕误人子弟,分析不一定面面俱到,因此我给自己的规定是尽量到自己不确定的细节不去猜测而更多客观描述,把一个生动具原创 2017-06-03 13:33:40 · 786 阅读 · 0 评论 -
Java线程池并发执行多个任务
Java在语言层面提供了多线程的支持,线程池能够避免频繁的线程创建和销毁的开销,因此很多时候在项目当中我们是使用的线程池去完成多线程的任务。 Java提供了Executors 框架提供了一些基础的组件能够轻松的完成多线程异步的操作,Executors提供了一系列的静态工厂方法能够获取不同的ExecutorService实现,ExecutorService扩展了Executors接口,Executo原创 2017-06-28 23:14:11 · 34129 阅读 · 6 评论 -
Spring容器加载Bean源码分析
关于面向对象中接口的作用spring的核心就是控制反转与依赖注入容器,整个容器内对象的依赖关系被容器管理,而这种具体的依赖关系可以通过很多方式,面向对象设计的设计就是面向接口编程,因为接口是定义规范,接口的具体实现不关心,给调用方使用的只是一个黑盒,而这个黑盒的具体表现就是一个接口,就像我们平时使用的物理接口,我们并不关心接口内的电路构造,我只关心这是哪种接口,我的设备是否可以使用而已。关于spri原创 2017-06-11 12:29:00 · 577 阅读 · 0 评论 -
spring-data-jpa实体继承
spring-jpa中我们要将SQL映射到对象,尤其是在spring boot这种高度自动化的环境下使用,大量的最优目录结构与命名规则可以大大降低配置,约定大于配置贯穿其中。例如我们定义查询dao,继承JpaRepository即可。然后返回的对象,我们可以定义model:@Entity @Table(“user_tab_name”) class User extends BaseUser {原创 2017-07-08 14:54:56 · 5988 阅读 · 0 评论 -
spring boot启动过程
spring已经成为实时上的J2EE标准,spring boot并没有提供太多新的特性,而是发现了大部分的模板配置,没必要重复的配置,而且现在脚本语言大行其道,并且微服务的诞生让更多项目的构建和部署,spring这些大量的配置文件带来很多不必要的工作量。spring boot顾名思义能够自动化的启动一个应用。以spring-boot-starter-web为例,它其实就是引入了一个组合pom.xml原创 2017-08-22 17:25:58 · 548 阅读 · 0 评论 -
Optional源码分析和使用
平时在写代码的时候总要做很多非空的判断,Jdk8提供了一个类Optional可以更优雅的使用非空判断,它的源码并不是特别的多,我们可以线来分析下源码:public final class Optional<T> { // 构造值为null的Optional private static final Optional<?> EMPTY = new Optional<>(); //原创 2017-09-30 16:21:46 · 760 阅读 · 0 评论 -
Java基本类型比较与哈希处理
Java基本类型有byte, short , long ,int ,char , double , float,boolean基本类型的比较看似简单,其实涉及的知识还是比较零散的,在JVM体系中,基本类型是存放在堆栈的栈区,栈对于线程来说是私有的变量。而堆存放的是引用所指向的复杂对象。关于Java的调用传递关于Java的传递网上有很多说基本类型是值传递,引用类型是引用传递。例如看下面的...原创 2018-03-20 21:58:18 · 1450 阅读 · 0 评论 -
记录代码块耗时小工具
背景最近在做一些性能优化的时候,经常遇到一个问题就是如何记录耗时,当然解决方案非常多,但是貌似每一种用起来又不是很顺手。系统层面的耗时可以用AOP去实现,这种无侵入,高内聚的方式非常适合做这种事。但是AOP的支持更多是方法级的切面,对于代码块的监控并不是特别友好。本次想解决的问题就是如何让代码块级的耗时监控变得更简单。第一个方案:最土的办法,就是在代码块执行之前去得到一个系统时间,在结束...原创 2019-06-20 11:03:21 · 611 阅读 · 0 评论 -
springMVC容器加载源码分析
springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理。这里我们来分析下springMVC的源码。 首先,spring提供了一个处理所有请求的servlet,这个servlet实现了servlet的接口,就是DispatcherServlet。把它配置在web.xml中,并且处理我们原创 2017-05-24 15:54:29 · 2312 阅读 · 0 评论