![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 78
每天进步亿点点的小码农
Later equals never
展开
-
EasyExcel的CellWriteHandler注入CellStyle不生效
类里发现确实有覆盖样式的操作,如下图:(ps:原本的2.2.7版本里是没有这个类的)方法,看这个方法名就能看出来,还要对 handler 进行排序和清理,再看下面。, 再排序清理一次,看到这里大概可以猜到了,估计我们自定义的。最近发现原本项目的导出excel功能中,写的那些。,经过排序清理之后,并不在最后,样式估计被后面的。,版本跨度比较大,所以怀疑是升级导致的问题。要解决问题,很简单,只要让我们自定义的。覆盖了,我们看下排序清理后的结果。,这3个逐个看了下源码,最终在。的源码,我们注册自定义的。原创 2024-05-17 18:53:26 · 599 阅读 · 0 评论 -
nacos配置自动刷新源码解析
最近好奇 nacos 是怎么做到配置自动刷新的,于是就去debug跟了下源码,版本是 nacos2.2.1客户端创建RpcClient与服务端建立连接时会添加Handler处理服务端推送的请求,并且启动一个线程不断去监听配置变化当服务端某配置文件里的配置发生变化时,发送通知给到客户端,告知其某配置文件变化客户端收到变更通知,立即把该配置文件内容发送到服务端去对比,服务端返回变化的配置文件然后客户端会再次请求服务端,获取最新的配置内容,覆盖客户端的最后销毁有注解的 bean,重新初始化。原创 2024-02-08 15:21:29 · 1059 阅读 · 0 评论 -
十大排序算法及Java中的排序算法
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(n log n),因此称为非线性时间比较类排序线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序最后总结下 Tim Sort 的整体流程数组长度小于2,直接返回,小于32,使用二分插入排序根据数组长度算出run(连续递增或递减的子数组) 的最小长度minRun开始循环获取run,得到run的长度,如果递减的,将其翻转,如果run的长度小于。原创 2023-09-13 22:15:00 · 388 阅读 · 0 评论 -
Java9-17新特性
由于 SpringBoot 3 最低支持的 JDK 版本是 17 了,加上 JDK 17 是一个 LTS 版本(Long-Term Support,长期稳定可靠的版本),所以还是有必要学习下 JDK 9 - JDK17 的新特性的。写这篇文章帮助自己记忆,也方便后续查阅。JDK 9-17 增加了许多新的特性,对我们的日常开发有很大帮助,JDK 11推出的 ZGC 是一款性能比 G1 还要好的垃圾回收器,JDK 17 也是史上最快的 Java 版本。原创 2023-08-30 19:45:00 · 303 阅读 · 0 评论 -
Java8新特性之——新日期时间 API
线程不安全、命名不清晰不统一、时区处理麻烦所以在 Java 8 中提供了新的日期时间 API,我们重点学习下LocalDateLocalTime三个类LocalDate年月日格式时间类型LocalTime时分秒格式时间类型年月日时分秒格式时间类型LocalDateLocalTime创建:now(),of(),parse()修改:with(),plus(),minus()比较:until(),compareTo(),isAfter(),isBefore(),isEqual()原创 2023-08-29 20:00:00 · 284 阅读 · 0 评论 -
Java8新特性之——Stream API
JDK 8 引入了 Stream API,它是用于处理集合数据的功能强大的库。Stream API 提供了一种更为简洁、灵活和函数式的方式来进行集合的操作和处理。不存储数据:Stream API 并不会在内存中存储数据,它仅仅是对源数据进行操作和处理的管道,当我们对一个集合或数组创建流时,流只是作为一种处理方式存在,并没有实际保存数据。不改变源数据:Stream API 的操作不会改变原始数据源中的元素,所有的中间操作(如过滤、映射、排序)都会产生一个新的流,而不是直接修改原始数据。原创 2023-08-25 22:00:00 · 176 阅读 · 0 评论 -
Java8新特性之——方法引用
实例方法引用(实例对象::实例方法名)静态方法引用(类名::静态方法名)类成员方法引用(类名::实例方法名)构造方法引用(类名::new)数组构造方法引用(类名[]::new)原创 2023-08-24 20:30:00 · 132 阅读 · 0 评论 -
Java8新特性之——Lambda表达式
Lambda 表达式是 JDK8 引入的一种新的编程语法,用于简化函数式接口的实现。Lambda 表达式的出现可以取代大多数匿名内部类,写出更简洁优雅的代码。原创 2023-08-24 20:00:00 · 133 阅读 · 0 评论 -
Java8新特性之——接口的默认方法和静态方法
因为实现类可以不重写接口中的默认方法,所以可以往现存接口中添加新的方法,不用强制那些已经实现了该接口的类也同时实现这个新加的方法,非常棒!在 JDK 8 之前,我们接口里只存在。默认方法可以定义方法的默认实现,使用。此外还可以在接口里定义静态方法,使用。在 JDK 8 版本里,增加了。原创 2023-08-24 10:17:39 · 100 阅读 · 0 评论 -
Lombok的使用及注解含义
Lombok可以通过注解来帮助我们简化实体对象(POJO)的代码书写。原创 2023-08-12 10:01:37 · 1287 阅读 · 0 评论 -
SpringBoot读取配置文件顺序
本文通过源码分析 SpringBoot 加载配置文件目录的顺序,以及 properties、xml、yml、yaml文件的读取顺序。原创 2023-07-30 12:44:36 · 923 阅读 · 0 评论 -
MyBatis-Plus自定义sql注入器
在日常开发过程中,我们可能会发现 MyBatis-Plus 提供的那些自带的 sql 语句无法满足我们的开发需求,想要加一些自定义的 sql,而且要应用于所有的 Mapper 上,需要怎么实现呢?官方文档地址:https://baomidou.com/pages/42ea4a/编写一个自定义 sql 类,要继承类,然后实现其方法来定义 sql 语句并加入到里,也可以重写getMethod方法来修改方法名。ps:这里以。原创 2023-07-29 17:48:40 · 464 阅读 · 0 评论 -
MyBatis-Plus自动填充
我们在建表的时候,所有的表都会有create_id(创建人id)create_time(创建时间)update_id(更新人id)、**update_time(更新时间)**这几个字段,属于是公共字段。在新增数据时:将创建人、更新人设置成当前系统登录人,将创建时间、更新时间设置成当前时间在更新数据时:将更新人设置成当前系统登录人,将更新时间设置成当前时间因为每张表里都有这些字段,而每次我们新增修改数据,都需要更新这些字段,即使是抽出共通方法,代码也很冗余写一个类实现接口,实现其方法和方法。原创 2023-07-27 22:30:00 · 1490 阅读 · 0 评论 -
FactoryBean源码解析
是 Spring 框架中的一个接口,用来创建特定类型的 Bean 对象。实现接口就可以自定义 Bean 对象的创建过程。本身也是 Bean,会在 Spring 中经历 Bean 的生命周期,而由创建的 Bean 不经历 Bean 的生命周期。原创 2023-07-19 18:20:01 · 1019 阅读 · 0 评论 -
Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析
Spring有两种类型的后置处理器,分别是和,这里再贴出我画的 Spring 启动过程,可以看看这两种后置处理器在 Spring 启动过程中位置。总结一下执行顺序先执行了的方法,按照顺序Ordered> 其他;再执行了的方法;最后执行的方法,按照顺序Ordered> 其他;原创 2023-07-06 21:00:00 · 9908 阅读 · 2 评论 -
@Import注解源码解析
本文将对 Spring 如何处理@Import注解的源码进行解析。原创 2023-07-03 23:15:00 · 243 阅读 · 0 评论 -
SpringBoot自动装配原理
Spring Boot 的自动装配(Auto-configuration)是 Spring Boot 框架中一项强大的功能,它可以根据应用程序的依赖和配置自动完成大部分常见的配置工作,减少了开发者在项目中进行繁琐的手动配置的工作。自动装配其实是通过条件化装配、自动配置类、配置属性绑定来实现的条件化装配:Spring Boot 使用条件化注解()来实现自动装配。这些注解基于运行时环境的条件来决定是否需要装配某个组件。自动配置类:Spring Boot 通过在 classpath 下的。原创 2023-06-27 22:40:35 · 5318 阅读 · 0 评论 -
OpenFeign源码学习
1、在SpringBoot项目启动阶段,扫描所有@FeignClient注解标注的接口,为其创建代理对象,把接口中的方法交由 FeignInvocationHandler 处理。2、当客户端调用该代理对象上的方法时,FeignInvocationHandler 会将方法调用转化为http请求,发送给服务端。原创 2023-06-21 23:30:00 · 850 阅读 · 0 评论 -
Java生成数学计算题,并转成exe可执行文件
然后我想着分享给其他家长用,就用Launch4j转exe文件。如果有报错的话,估计是没有设置主清单属性。然后点击小齿轮,填上launch4j。pom文件中要引入itextpdf。需要在pom文件中增加如下代码。安装后运行会出现这样的画面。最后给上我转好的exe文件。在Basic下配置这两个。最后点击运行按钮就可以了。原创 2023-06-21 10:31:41 · 257 阅读 · 0 评论 -
Mybatis插件原理
首先自定义插件要实现 Mybatis 的 Interceptor 接口,然后实现这个接口的3个方法,最后在类上打上 @Intercepts 注解,并用 @Signature 注解标注要拦截的接口名称、方法名称以及参数列表。我们用 Executor 来举例//增加自己的逻辑 log . info("执行器-------自定义处理逻辑");} }原创 2023-06-18 11:08:07 · 365 阅读 · 0 评论 -
Mybatis源码学习
本篇文章只是简单的带大家过一下整个Mybatis的流程,先有个初步的认识,后续有机会,再针对性的剖析细节。原创 2023-06-13 18:19:42 · 1264 阅读 · 0 评论 -
Java8函数式接口Consumer的实际应用
在项目开发的过程中,发现有很多业务,需要对一个大的集合做分批处理,于是利用函数式接口Consumer写了一个共通的处理方法,如下。其中的doSomething是分批后的业务处理方法,自行修改。原创 2023-06-09 17:59:42 · 172 阅读 · 0 评论 -
SpringBoot内置tomcat参数调优,最大连接数、队列长度、最大工作线程数、最小工作线程数
因为看到一道面试题,问SpringBoot默认可以接受的最大并发量是多少,这个问题其实考的是web服务器的配置,因为SpringBoot默认的web服务器是tomcat,于是去了解了一下tomcat的相关配置。原创 2023-05-25 22:41:05 · 2666 阅读 · 1 评论 -
MyBatisPlus批量写入方法saveBatch速度很慢的解决方案
项目组在使用MyBatisPlus的批量插入方法saveBatch时速度缓慢,插入1w条数据,需要近1分钟的时间。原创 2023-05-25 22:39:22 · 5454 阅读 · 0 评论 -
MongoDB如何添加多数据源
由于项目有需求做MongoDB的数据迁移,所以需要配置多个数据源,其实可以通过配置多个 MongoTemplate 来实现。这里需要注意的是,如果配置了自己的转换器,必须要加上12-14行的代码,不然转换器在第二个数据源会失效。然后操作第二个数据源的时候,注入 hisMongoTemplate 就可以了。然后增加第二个数据源的 MongoTemplate 配置。首先在yaml文件中加上第二个数据源的信息。原创 2023-05-23 00:59:13 · 685 阅读 · 0 评论 -
MongoDB的Decimal128类型转换成Java的BigDecimal类型错误
项目组在使用mongo时,报类型转换错误,具体报错如下:org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.bson.types.Decimal128] to type [java.math.BigDecimal]原因是 MongoDB 的 Decimal128 类型无法转换成 Java 的 BigDecimal 类型导致可以原创 2023-05-19 18:38:29 · 605 阅读 · 0 评论 -
Java8新特性之——Optional类
Optional类是Java 8中引入的一个用于处理null值的容器类。它封装了某个类型的值,这个值可以是null,也可以是非null,通过它可以更优雅和简洁地处理包含null值的对象。Optional类的官方描述:翻译过来就是:一个可能包含null值的容器对象。如果值存在,isPresent()方法将会返回true,get()方法将会返回该值。原创 2023-04-09 17:30:00 · 2266 阅读 · 0 评论 -
Java8新特性之——函数式接口(Function、Consumer、Supplier、Predicate)
Java 8中的Consumer、Supplier、Predicate和Function都是函数式接口,它们的主要区别在于它们的输入参数和返回值的类型不同。可以看到,这四个接口的主要区别在于它们的输入和输出类型不同,因此它们在不同的场景下具有不同的用途。如果你需要对一个集合中的每个元素执行某个操作,那么可以使用Consumer接口;如果你需要从一个方法中获取一个结果,可以使用Supplier接口;:接受一个输入参数,并返回一个布尔值。:接受一个输入参数,并返回一个结果。:接受一个输入参数,但没有返回值。原创 2023-04-08 20:54:34 · 745 阅读 · 0 评论 -
Spring源码学习之RestTemplate
看完源码,我们知道,其实RestTemplate封装了原生的HttpURLConnection,采用Restful的理念,更优雅地来完成对HTTP服务的调用,那么什么是Restful风格,网上看到大神的回答用 URL 定位资源,用 HTTP 动词(GET,POST,DELETE,PUT)描述操作。用URL来指定具体的资源,如图片,文字,或者一个服务;用HTTP动词来描述操作;GET:请求服务器端已经存在的资源,通常将Query String查询条件以键值对的编码形式追加到URL中。原创 2023-04-01 09:17:22 · 422 阅读 · 0 评论 -
Git分支管理文档
分享一下,我在项目里是怎么使用git分支管理的。原创 2023-03-28 20:00:00 · 1126 阅读 · 0 评论 -
Spring源码解析之@PostConstruct注解
1、Spring启动,在registerBeanPostProcessors那一步,实例化并初始化了CommonAnnotationBeanPostProcessor这个BeanPostProcessor,并赋值initAnnotationType为PostConstruct.class;原创 2023-03-26 15:00:00 · 493 阅读 · 1 评论 -
xxl-job如何实现分片处理
xxl-job是一款开源、分布式任务调度平台。它基于Java语言开发,提供Web界面和API接口,支持多种任务调度方式,如Cron、API、固定速率等,并具备任务依赖、任务分片、任务路由等高级功能。xxl-job还提供任务执行日志、报警通知、任务失败重试等实用工具,方便用户管理和监控任务。xxl-job的设计理念是简单易用、高可靠、高性能,适用于各种规模的任务调度需求。原创 2023-03-25 10:00:00 · 3169 阅读 · 1 评论 -
Java如何查询线程信息,jps、jstack、jmc、jvisualvm的运用
4、也可以使用jstack pid > 文件名.txt 把线程信息写入到文件里,如jstack 33280 > 33280.log,这样会在当前目录生成一个名叫33280.log的文件,“>”后面也可以跟一个路径+文件名,比如:stack 33280 > D:\33280.log,这样文件会生成到对应的目录。1、打开cmd命令行,进入到jdk的bin目录下,如:D:\Program Files\Java\jdk1.8.0_171\bin。jdk的bin目录下会自带一个jmc.exe的程序,我们直接打开。原创 2023-03-12 11:59:07 · 3168 阅读 · 0 评论 -
SpringBoot项目启动卡死问题调查
发现key1会走第12行和第21行,在21行会调用Lambda表达式等待结果,这时候key2会进来,发现key1已经占住了位置,会走36行的else里,而key2不满足39行和61行的if条件,循环中没有可以跳出的地方,就陷入了死循环。后来我就好奇,为什么就会卡死了呢,为什么不报错,看栈信息,最后应该是卡死在了ConcurrentHashMap的computeIfAbsent方法上,于是就去跟了下源码,找到了调用computeIfAbsent方法的地方,是ConcurrentMapCache的get方法。原创 2023-03-11 16:56:48 · 3457 阅读 · 4 评论 -
为什么重写equals方法时要重写hashCode方法
所以如果只重写equals方法而不重写hashCode方法,就违反了“如果两个对象的equals方法返回true,则它们的hashCode方法必须返回相同的值”的规定,其实在Object类equals方法上的注解中写有写到,我们看下。hashCode方法默认使用的是对象的内存地址作为哈希值,因此在不重写该方法的情况下,同一个类的不同对象的哈希值一定是不同的。如果两个对象的equals方法返回false,则它们的hashCode方法可以返回相同的值,也可以返回不同的值;原创 2023-03-07 21:17:04 · 179 阅读 · 0 评论