自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

灵颖桥人的博客

长风破浪会有时,直挂云帆济沧海

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

原创 Nacos 学习笔记之服务启动加载配置

Nacos 学习笔记

2022-12-27 20:02:27 5178 1

原创 Redis SCAN 命令学习

Redis scan 命令学习

2022-10-16 12:50:11 2070

原创 SpringBoot应用Yaml 解析冒号(:)字符串踩坑排查

一、现象【What】某次在配置中心Nacos上配置了一个字符串,采用YAML格式,如下:id: 114:1代码中采用的是@Value注解的形式获取配置:@Value("${id}")代码中预期获取的是字符串:"114:1",但是日志打印出来的却是 6841。二、原因排查【Why】一开始,我以为是Nacos的问题,同事提醒说直接在application.yml文件中这么配置,解析出来的也是 6841,所以可以确定是SpringBoot解析的时候出的问题。我先尝试把114:1,加

2022-05-02 22:36:58 6344 1

原创 Tomcat 线程池最大线程池数量被设置成 5 问题排查

一 现象

2022-03-26 14:51:06 1969 1

原创 com.dangdang.ddframe.job.reg.exception.RegException:java.lang.IllegalStateException:instance must be

异常记录:com.dangdang.ddframe.job.reg.exception.RegException:java.lang.IllegalStateException:instance must be started before calling this method.这个异常的原因多是主线程连接异常中断。比如SpringBoot项目中,要检查启动日志是否有报错:{"log":"控制台-2021-10-26 15:19:03 [main] ERROR org.springframew

2021-11-14 10:21:32 2390

原创 利用Arthas分析优化接口执行时长

背景 最近接手一个项目,里面有个http接口请求超过了100s的时间,居然还有调用方来调用这个接口。。。于是受命优化这个接口的请求时长,就想到了Arthas工具。一、Arthas 简介Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱,使用详见官方文档。二、trace 命令分析接口执行耗时Arthas 中的 trace 命令能够输出方法内部调用路径,并输出方法路径上的每个节点上耗时。trace 命令使用,见文档。由于生产容器运维不给权限安装Artha...

2021-07-30 22:35:29 4097

原创 @SpringBootTest 单测在ApplicationRunner接口执行后执行

@SpringBootTest 单测被阻塞不执行ApplicationRunner 接口、CommandLineRunner 接口。for(; ;){.......}

2021-06-25 22:01:12 979 1

原创 Java Map 的 forEach 函数遍历

入职新公司,查看代码规范的时候,看到一条:“Map 遍历慎用 Map.forEach()”举了一个内网例子:一个 Map<>

2021-06-11 23:17:53 4208 1

原创 nginx proxy_set_body 参数

官方文档介绍:

2021-06-10 16:18:02 2044

原创 Spring AOP 通知执行顺序《三》不同切面相同类型通知顺序

同一切面中的同一类型通知的执行顺序 Spring 官方文档中是这样描述的:当在不同切面定义的两条相同类型通知都需要在同一连接点上运行时,除非另行指定,否则执行顺序是不确定的。 您可以通过指定优先级来控制执行顺序。 通过在切面类中实现 org.springframework.core.Ordered 接口或使用 @Order 注解对其进行注解。 给定两个切面,从 Ordered.getValue()(或 @Order 注解值)返回较低值的切面具有较高的优先级。@Order 注...

2021-05-17 18:24:35 1027 3

原创 Spring AOP 通知执行顺序《二》同一切面相同类型通知

同一切面中的同一类型通知的执行顺序 Spring 官方文档中是这样描述的:当在同一 @Aspect 类中定义的同一类型的两条通知(例如,两个@After 通知方法)都需要在同一连接点上运行时,顺序是不明确的(因为没有办法通过反射来获取javac编译类的源代码声明顺序)。考虑在每个 @Aspect 类中的每个连接点将这样的两个通知方法折叠成一个通知方法,或者将通知方法片段重构成单独的 @Aspect 类,您可以通过 Ordered 接口或 @Order 在切面级别进行排序。测试采用S...

2021-04-17 13:57:41 407

原创 Spring AOP 通知执行顺序《一》同一切面不同类型通知

官方文档Spring官网文档非常详细,关于 AOP的执行顺序描述【Version 5.3.6】:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-ataspectj-advice-ordering推荐看链接文档原文,简单翻译一下: “当多条通知都希望在同一连接点上运行时会发生什么? Spring AOP遵循与AspectJ相同的优先级规则来确定通知执行的顺序。 优先级最高...

2021-04-16 00:40:01 863

原创 http下载服务器本地Excel文件demo

模拟通过 http 下载本地 Excel 数据文件:/** * 模拟下载本地Excel文件 * @param response * @throws IOException */ @GetMapping("/downloadLocal") public void downloadFromLocalFile(HttpServletResponse response) throws IOException { response.setC

2021-04-07 17:01:39 479 1

原创 Java 排序算法之堆排序实现

最大堆的构建:采用直接插入算法,从空堆开始,依次插入各个关键码,时间复杂度为 O(n * log n)。采用筛选法构建堆,可以将时间复杂度降低到 O(n)。筛选法步骤:以最大堆为例,由于最大堆是完全二叉树的一种特殊形式,因此参照完全二叉树的性质,可以将最大堆存储到数组中,用数组下标来表示节点之间的关系。从第一个具有孩子的节点 i =n / 2 -1 开始,如果以这个元素为根的子树已是最大堆,则不需调整,否则需调整子树使之成为堆。继续检查 i - 1,i - 2等节点为根的子树,直到该二叉树的..

2021-04-05 15:12:34 220 1

原创 Java ScheduledExecutorService 使用学习

Java 中的 ScheduledExecutorService 接口用来实现延迟执行或者定时执行的任务。在阅读 RocketMQ 源码(release-4.7.1版本)的过程中,发现很多地方都是使用的 ScheduledExecutorService 来实现定时任务。比如,在 broker 启动过程,BrokerController 类中使用 scheduledExecutorService 执行 broker 启动后的定时任务,比如消息消费偏移量 offset 的持久化定时任务,大致如下...

2021-04-03 00:06:15 10112

原创 cglib 和 Spring AOP 的一些学习思考

我们都知道,Spring AOP 是基于动态代理实现的,实现方式有两种:JDK 动态代理 和 cglib 生成代理类。JDK 动态代理这里不多说,我们都知道 cglib 是基于继承实现对目标类的代理的。本文使用 Spring 版本:5.2.0.RELEASEAOP 自调用问题举一个 AOP 自调用的例子:定义切面和切点:@Aspect@Componentpublic class AopConfig { /** * UserManager中的所有方...

2021-04-01 19:36:53 409

原创 Java将多种字符串格式解析为Date

项目在解析 Excel 的时候,日期数据可能有多种格式:"2020-10-1"、"2020.10.1"、"2020/10/1"、"2020年10月1日"四种格式,需要解析成 Java 中的 Date 类型。方法一:定义好对应的日期格式数组,如“yyyy-MM-dd”、“yyyy.MM.dd”、“yyyy/MM/dd”、“yyyy年MM月dd日”,循环遍历直到解析得到 Date 返回,所有的格式均解析失败则返回 null。实现参考:java 将多种字符串格式 解析为Date格式方法二:换一

2021-03-25 17:29:43 1127

原创 MySQL JSON类型字段的查找与更新

MySQL 提供了丰富的函数用于 JSON 类型字段的查找与更新,详见官方文档。简单记一下使用方法,使用的mysql版本:5.7.28-log:创建一个表 t1,basic_info 字段为JSON类型:CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `basic_info` json DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=

2021-02-01 16:05:47 15993 1

原创 一次生产环境MySQL join 语句调优

前提:在MySQL使用 join 语句时,一定要让小表作为驱动表,而且join的列在被驱动表最好要有索引,否则很容易出现慢SQL。“小表作为驱动表”,MySQL查询优化器会对SQL评估选择最优的执行计划,所以即使你把大表写在前面作为驱动表,MySQL也会优化SQL,实际执行仍然用较小的表作为驱动表。【当然,你可以使用 straight join 强制指定驱动表,这时查询优化器就不会自主选择驱动表了】。来看一下生产环境的一条SQL(这里把表名做了一下处理):<select id="page

2020-11-13 00:16:13 430

原创 MySQL 日期类型小数秒的处理

一、 MySQL 日期类型对小数秒的支持注:本文所使用MySQL版本为 5.7 版本。官方文档:https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html1、小数秒位数精度MySQL 支持小数秒的展示,比如官网的例子m在建表时,指定 DATETIME(6)、TIME(3)的位数:CREATE TABLE t1 (t TIME(3), dt DATETIME(6));需要注意的是,MySQL 对小数秒的精度支持最

2020-11-06 15:20:10 3053

原创 Spring Statemachine 简介

Spring Statemachine 简介 Spring Statemachine是Spring官方提供的一个框架,供应用程序开发人员在Spring应用程序中使用状态机。支持状态的嵌套(substate),状态的并行(parallel,fork,join)、子状态机等等。官网地址:https://projects.spring.io/spring-statemachine/本文使用版本:2.2.0.RELEASESpring Statemachine 项目模块使用 Sp...

2020-10-24 22:15:41 15795 1

原创 Java 枚举对象获取Class对象

背景 在写状态机框架的时候,在状态枚举类型上面加了注解,当通过 getClass() 得到 Class 对象得到注解时,有些情况得不到注解。发现是自己对 Java 枚举了解不够导致,特记录一下。定义一个方法 getStateDescField(S s) :从注解@StateConfig指定的字段名称,获取传入 s 对应的字段值。public static <S> Object getStateDescField(S s) { Class clazz = ...

2020-09-18 00:37:26 3343

原创 Hutool 封装JDK的对称加密AES算法使用

Hutool Hutool 是一个小而全的Java工具类库,提供了很多常用的工具类。官网:https://www.hutool.cn/docs/#/AES封装 遇到一个场景,透出了业务的订单号,该订单号是由年月日+自增ID拼成,如20200916000066。用户查询订单详情时,本应该根据登录用户的id和订单号去数据库中查询,但是因为历史原因(直接用订单号查询了!)以及一些其他的因素,暂时没能这么做。这样就会有数据泄漏问题,因为很容易构造出一个正确的且数据库内存在的这种...

2020-09-16 23:58:06 12999 1

原创 Java中与Serializable接口相关的一些方法执行顺序

自定义 writeObject 方法和readObject 方法如果在实现Serializable接口的类中自定义 writeObject 方法和readObject 方法,则不会调用默认的方法:package serializable;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;i..

2020-09-16 00:19:58 490

原创 JNI 描述符和 Class.forName方法

在手头一个框架开发的时候,遇到了需要处理 JNI 字段或者方法描述符的情况,记录一下JNI描述符(Java Native Interface Descriptors)相关知识。JNI 描述符在Oracle官网上查了一些文档(Java8):https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.3.2https://docs.oracle.com/javase/8/docs/technotes...

2020-09-11 00:39:29 623

原创 MapStruct Map 转换成对象

背景 调用公司影像识别服务接口,返回值都是 Map<String,Object>类型。想把这种 map 结果转为项目中对应的JavaBean如DTO 或者 VO,又不想写很多的 dto.setXxx(map.get("xxx")) 的代码。结果 查阅了一下,MapStruct 目前(1.3.1.Final 及之前)的版本暂不支持直接将 map 转换成 JavaBean,很早之前有人在 GitHub提了这个feature(Please ad...

2020-08-23 21:59:33 11307 8

翻译 MySQL 中的 JSON 数据类型

目录前言 创建 JSON 列Insert 语句JSON_TYPE() 函数JSON值的规范化、合并和自动包装JSON 规范化JSON 合并查找和修改 JSON 值JSON路径语法JSON值的比较和排序在JSON和非JSON值之间转换JSON值聚合官方文档地址【译自】:https://dev.mysql.com/doc/refman/8.0/en/json.html前言 从MySQL 5.7.8开始,MySQL支...

2020-08-16 18:09:14 2415

原创 Java中的Map【十二】ConcurrentHashMap 类

所使用的jdk版本为1.8.0_172版本,先看一下 ConcurrentHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系: 我们知道Java中的 HashMap 是线程不安全的(比如数组table扩容、put 操作多线程下值覆盖等都会导致数据不一致问题),ConcurrentHashMap 就是为了解决这个问题存在的。Java 8 中的 ConcurrentHashMap 和 HashMap 一样,结构设计都和 Java 7 中...

2020-08-15 16:25:44 889

原创 Java Object 的 notify() 方法

我们都知道Java Object 中的 wait()和 notify() 方法可以进行线程间的通信。wait() 方法在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。notify() 方法唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并且根据实现进行选择。线程通过调用其中一个wait方法,在对象的监视器上等待。 这里说的一点就是,调用当前线程 noitfy()...

2020-08-08 16:45:31 8182 3

原创 Java中的Map【十一】TreeMap 类

所使用的jdk版本为1.8.0_172版本,先看一下 TreeMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 TreeMap<K,V> 是基于红黑树的Navigable接口实现的Map。TreeMap 根据key的自然顺序(参见 java.lang.Comparable 接口)或者根据创建TreeMap时指定的比较器(java.util.Comparator)进行排序存放键值映射,具体取决于使用的构造方法。 ...

2020-07-18 19:29:41 610

原创 Spring请求路径带参数URL使用注解的写法

调用外部平台http接口,Post请求,url 为路径带有参数的形式:http://xxxxxx.com/openApi/auth/getUserAuth?version=v1.0使用 Retrofit 框架(本文使用的2.6.2版本)发送Post请求,可以在 @Post 注解中直接带上参数,如下: @POST("auth/getUserAuth?version=v1.0") Call<McgjResponse<UserAuthResponseDTO>>

2020-07-08 23:28:51 3189

原创 Java中的Map【十】IdentityHashMap类

所使用的jdk版本为1.8.0_172版本,先看一下IdentityHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 IdentityHashMap 利用哈希表实现Map接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在IdentityHashMap中,当且仅当(k1==k2)时,才认为两个键k1和k2相等(在正常Map实现(如HashMap)中,当且仅当满足下列条件时才认为两个键...

2020-06-21 13:02:30 972

原创 Java中的Map【九】WeakHashMap类

所使用的jdk版本为1.8.0_172版本,先看一下 WeakHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 WeakHashMap 是基于 弱引用(WeakReference)类型实现的。在WeakHashMap中,对键K的引用是弱引用类型,当某个键不再正常使用,比如只被弱引用关联时,我们知道此时垃圾回收器会回收该键,此时WeakHashMap将自动移除该键对应的映射条目。null 值和 null 键都被支持。...

2020-06-14 19:00:11 445

原创 Java中的引用类型

Java 中的引用类型我们都知道有 强引用、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference),除此之外,今天翻看JDK 8 【jdk1.8.0_172】源码时,还看到一种 FinalReference ,只不过这种引用类型是提供给JVM使用的,自己编程写代码用不上的。java.lang.ref 包 Java 中引用相关的类定义在 java.lang.ref 包中,类图如下: Final...

2020-06-13 12:56:52 275

原创 Java中的Map【八】LinkedHashMap类

所使用的jdk版本为1.8.0_172版本,先看一下 LinkedHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 从上图中我们可以看到LinkedHashMap是HashMap的子类,在继承HashMap的功能之上,LinkedHashMap主要实现了具有可预知迭代顺序的功能。我们知道HashMap中迭代遍历顺序与我们 put 映射的顺序是无关的,而HashMap提供了两种映射迭代遍历顺序的实现,一是映射的放入顺序,另一种是...

2020-06-07 17:30:39 699

原创 Java中的Map【七】HashMap类

所使用的jdk版本为1.8.0_172版本,先看一下 HashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 在JDK 1.7 中,HashMap的底层数据结构使用的是 Entry数组 + Entry链表,如果HashMap中的key值数hashCode都一样(极端hash碰撞情况), 那所有数据就会一直都落在同一条Entry链表上, 此时设计初衷为实现快速查找的HashMap就退化为链表, 操作的时间复杂度成为O(n)。JDK 8 中采用N...

2020-05-23 19:00:23 344

原创 Redis 中的数据类型

Redis 支持的数据类型 Redis 是一个 key-value 的数据结构服务器,key 是字符串。value 支持的数据类型,我们都知道有 String(字符串)、List(列表)、Hash(哈希)、Set(集合)、Sorted Set(有序集合)。除了这些之外,随着Redis 的版本迭代,还有 BitMap(位图)、HyperLogLog、Stream 三种数据类型。Redis 中的 key Redis中的 key 是二进制安全的(因为Redis中的S...

2020-05-17 20:16:47 932

原创 Spring 手动注册bean

一般情况下,我们Spring应用中的bean都是通过注解或者xml注入到容器中的,有些情况下我们可能想手动往容器中注入bean,即编程方式注入bean。 本文所使用源码包版本:spring-beans-5.0.5.RELEASE.如何注册? Spring 中用BeanDefinition接口描述一个bean,Spring容器中用Map<Strin...

2020-05-02 22:31:14 17100 5

原创 Spring @Async 注解的使用以及原理(二)

在上一篇中《Spring @Async 注解的使用以及原理(一)》简单介绍了@Async的使用,本篇简单分析一下它的源码以及实现异步的机制。 我们用spring-context-5.0.5.RELEASE.jar包,先看一下@Async的源码:package org.springframework.scheduling.annotation;import j...

2020-05-01 23:20:45 2407 3

原创 代理模式

代理模式: 代理模式通过代理类控制对象的访问。在实际开发中,我们可能需要控制某个类方法访问,比如在方法调用之前或者之后添加指定的业务逻辑但同时又不想或者无法修改原有的类方法,这个时候就是代理模式登场了。常见的使用场景,如Spring框架中的AOP 就是基于动态代理实现的。 代理模式结构图 --摘自...

2020-04-19 17:44:16 174

空空如也

空空如也

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

TA关注的人

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