面向单元测试的代码重构

2022-08-06
阅读 9 分钟
2k
单元测试是我们常用的验证代码正确性的工具,但是如果只用来验证正确性的话,那就是真是 “大炮打蚊子”--大材小用,它还可以帮助我们评判代码的抽象程度与设计水平。本文还会提出一个以“可测试性”为目标,不断迭代重构代码的思路,利用这个思路,面对任何复杂的代码,都能逐步推导出重构思路。
封面图

MySQL 索引问题,99%的人会踩坑!

2022-07-23
阅读 5 分钟
1.1k
可以看到它的 possible_keys(此 SQL 可能涉及到的索引) 是 idx_uid_stat,但实际上(key)用的却是全表扫描。
封面图

@Transactional 四种不生效的 case 分析

2022-07-17
阅读 6 分钟
1.9k
在我们工作中,经常会用到 @Transactional 声明事务,不正确的使用姿势会导致注解失效,下面就来分析四种最常见的@Transactional事务不生效的 Case:
封面图

死锁问题排查过程-间隙锁的复现以及解决

2022-07-10
阅读 2 分钟
2.2k
我们在开启多线程对数据库进行操作的时候,先批量对数据进行删除,然后再新增,本来想着是考虑到不走更新,性能会提升,但是执行的时候发现报错,执行的sql等待超时,阻塞了进程,dbcp连接池被打满,数据库表访问不可用。针对这个问题,我们进行了深入的挖掘,逐渐解开了问题的真相。
封面图

Junit4升级至Junit5

2021-09-14
阅读 2 分钟
4.3k
junit5的特性和优点可以参考升级到junit5。其中我最看中的点是,Junit4错过了好多Java8的好多特性。Junit5可以很好得利用java8的特性,代码的表达更加清晰和简洁。
封面图

lombok @Builder踩坑系列 - 构造方法和默认值问题

2021-05-16
阅读 4 分钟
9.6k
@Data和@Builder一起用:我们发现没有了默认的构造方法。如果手动添加无参数构造方法或者用@NoArgsConstructor注解都会报错!
封面图

分布式锁注意点及其实现

2021-04-16
阅读 5 分钟
7.3k
分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。

JAVA面试系列 - 线程池的构造

2021-01-19
阅读 2 分钟
2.1k
概述平时面试候选人,聊到线程池的时候难免会顺带着考察下ThreadPoolExecutor构造函数中各参数的含义,在这里做一个简单的总结。ThreadPoolExecutor构造参数说明其实从源码中的JavaDoc已经可以很清晰地明白这些参数的含义了,下面照顾懒得看英文的同学,再解释一下:corePoolSize线程池核心线程数。默认情况下核心线程会...

JAVA面试系列 - MySQL InnoDB 索引介绍

2020-03-15
阅读 6 分钟
2.2k
InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想...

JAVA面试系列 - Mysql InnoDB 锁机制介绍

2020-03-14
阅读 5 分钟
3.6k
在mysql中,锁机制看起来很复杂,一堆名词:排他锁、共享锁、表锁、间隙锁、意向锁等等,搞的初学者云里雾里。同时锁的相关知识又跟事务隔离级别、索引等概念有千丝万缕的关系,是面试中的常规问题。

Java 8 stream 实战

2019-12-29
阅读 6 分钟
2.1k
平时工作用python的机会比较多,习惯了python函数式编程的简洁和优雅。切换到java后,对于数据处理的『冗长代码』还是有点不习惯的。有幸的是,Java8版本后,引入了Lambda表达式和流的新特性,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读。幸福感爆棚,有没有!

I/O网络模型

2019-12-22
阅读 4 分钟
2.7k
本文从I/O网络模型出发,介绍目前主流的几种网络模型,然后对同步阻塞I/O、同步非阻塞I/O、I/O多路复用的机制和流程做了详细的阐述,最后通过一个生活中的例子加深对这3中网络模型机制的理解。

Spring Boot 多数据源 Redis 配置

2019-12-22
阅读 8 分钟
8.9k
以上配置主要参考 spring 官方配置 RedisAutoConfiguration, LettuceConnectionConfiguration。简单来说:RedisAutoConfiguration注册了2个bean,RedisTemplate和StringRedisTemplate,这两个bean又依赖RedisConnectionFactory的注入,在RedisAutoConfiguration可以看到,RedisConnectionFactory有两个实现,LettuceConn...

redis基础

2019-12-15
阅读 1 分钟
1.8k
Remote Dictionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI 、C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

springboot资源初始化的几种方式

2019-08-25
阅读 4 分钟
14.3k
在实际项目中,我们需要在springboot服务启动后做一些初始化工作,例如线程池初始化、文件资源加载、常驻后台任务启动(比如kafka consumer)等。本文介绍3类初始化资源的方法:

【spring boot 系列】spring security 实践 + 源码分析

2018-06-05
阅读 8 分钟
17.6k
Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面向切面编程)功能,为应用系统提供声明式的安全访问...

【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)

2018-05-27
阅读 13 分钟
39.8k
JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。值得注意的是,JPA 是在充分吸收了现有 Hibe...

【深入浅出spring】Spring MVC 流程解析 -- InvocableHandlerMethod

2018-04-08
阅读 14 分钟
12k
承接【深入浅出spring】Spring MVC 流程解析 -- HandlerAdapter中RequestMappingHandlerAdapter一节,具体分析此adapter调用handler处理并获取ModelAndView的过程

互联网后端知识点整理

2018-04-05
阅读 3 分钟
4.3k
前言 一些问题的整理,平时实际工作中可能会忽视的一些原理性问题,后续会选取一些有意思的点进行详述。 JAVA多线程、并发相关 多个线程同时读写,读线程的数量远远⼤于写线程,你认为应该如何解决 并发的问题?你会选择加什么样的锁? JAVA的AQS是否了解,它是⼲嘛的? 除了synchronized关键字之外,你是怎么来保障线程...

深入消息中间件选型分析

2018-04-04
阅读 9 分钟
3.9k
消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足...

【深入浅出spring】Spring MVC 流程解析 -- HandlerAdapter

2018-04-03
阅读 7 分钟
9.4k
从源码可以看到,17行根据request拿到对象HandlerExecutionChain(包含一个处理器 handler 如HandlerMethod 对象、多个 HandlerInterceptor 拦截器对象)后,就是24行根据handler获取对应的adapter,并在44行调用适配器的handler方法(适配器设计模式可以自行google了解),返回ModelAndView。详细看下getHandlerAdapter这...

【深入浅出spring】Spring MVC 流程解析 -- HanndlerMapping

2018-04-01
阅读 19 分钟
11.3k
本文基于之前的文章【深入浅出spring】Spring MVC 流程解析 继续从源码角度分析 spring MVC 的原理。Spring MVC 的运行流程在上面的文章中已经介绍了,这里详细介绍 url --> handler 的映射过程,即 hanndler mapping

Spring Bean 初始化之InitializingBean, init-method 和 PostConstruct

2018-03-31
阅读 4 分钟
39.2k
Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种:

HTTPS原理解锁

2018-03-28
阅读 6 分钟
3.9k
前言 我们先不了聊HTTP,HTTPS,我们先从一个聊天软件说起,我们要实现A能发一个hello消息给B: 如果我们要实现这个聊天软件,本文只考虑安全性问题,要实现: A发给B的hello消息包,即使被中间人拦截到了,也无法得知消息的内容 如何做到真正的安全? 这个问题,很多人马上就想到了各种加密算法,什么对称加密、非对称...

【深入浅出spring】Spring MVC 流程解析

2018-03-18
阅读 2 分钟
13.7k
其实一年前就想系统地记录下自己阅读spring源码的收获,搞一个深入浅出spring的系列文章,但是因为工作原因,迟迟没有下笔。今天终于可以开始自己一年前的计划了,言归正传,首先开始spring mvc相关的内容。

spring 3.x 升级 spring 4 实践

2018-03-10
阅读 2 分钟
6.9k
为什么升级 spring 4 升级 Spring4 的原因是:想要将老项目从jdk1.6升级之1.8,而Spring 4 以前的版本不兼容 JDK8。 Spring 4 相比 Spring 3,引入许多新特性,这里列举几条较为重要的: 支持 JDK8 (这个是最主要的)。 Groovy Bean Definition DSL 风格配置。 支持 WebSocket、SockJS、STOMP 消息 移除 Deprecated 包...

python中的编码问题

2016-01-24
阅读 2 分钟
7.1k
问题 在平时工作中,遇到了这样的错误: UnicodeDecodeError: 'ascii' codec can't decode byte 想必大家也都碰到过,很常见 。于是决定对python的编码做一个整理和学习。 基础知识 在python2.x中,有两种数据类型,unicode和str,这两个都是basestring的子类 {代码...} 两者的区别,概括来讲,str是字节串,由unicode经...

Hibernate flush理解

2015-12-05
阅读 1 分钟
5.7k
在spring框架没有事务的情况下,通过hibernate的session.save(entity),无法将数据持久化至数据库中,即使强制刷新后(flush())后也同样如此。

Hibernate的延迟加载

2015-11-29
阅读 4 分钟
5.6k
集合属性的延迟加载通过PersistentSet、 PersistentList、PersistentBag、PersistentMap、PersistentSortedMap、PersistentSortedSet作为代理类来实现,代理类中保存了session以及owner属性,owner属性表示了集合属性所属的one侧的实体。