- 博客(405)
- 收藏
- 关注
原创 java中常用的 @JsonIgnore、@JsonIgnoreType、transient关键字修饰字段、@Transient 忽略字段、忽略存储字段等详解
1、通常在一些特殊场景,为了保护某些敏感字段如密码、银行卡号等禁止返回给前端看,所以需要用到属性字段忽略,json序列化方面可以用 @JsonIgnore注解 或 transient关键字修饰字段。【2】@JsonIgnoreType:作用于类,引用该类的单个对象属性会被忽略,但集合列表类的属性不会被忽略(需要注意)【1】transient 修饰的属性字段只针对实体类有效,该字段不会落库。【1】@JsonIgnore:作用于属性字段,则忽略该字段不会被序列化。作用和 transient 关键字相同。
2025-06-28 15:30:00
65
原创 场景问题:如何解决订单重复支付的问题?
在电商订单系统中,会涉及多种支付方式,例如微信支付、支付宝支付、银联支付等。一、如果立即付款按钮有和后端交互,则使用分布式锁,保证支付请求是串行的,只允许拿到锁的请求执行支付动作。未拿到锁的支付线程给予提示“此订单已在支付中”即可。2、保证回调线程串行化,第一个回调线程必然会成功并且更新订单状态,而第二个回调线程做幂等校验发现该订单已支付成功,则直接发起退款即可。1、既然都支付成功了,那必然都会有回调动作,关键就在于回调动作,可以利用分布式锁保证此订单的支付回调动作是串行化和幂等性的。
2025-06-28 10:00:00
34
原创 Spring中过滤器 RequestContextFilter 和拦截器 HandlerInterceptor 有什么区别以及适用场景
在Spring系列中,RequestContextFilter(过滤器)和 HandlerInterceptor(拦截器)是处理HTTP请求的两个核心组件,但它们在执行时机、功能定位上有所不同。请求 → 过滤器1 → 过滤器2 → DispatcherServlet → 拦截器A → 拦截器B → Controller → 拦截器B → 拦截器A → 过滤器2 → 过滤器1 → 响应。由于在 Servlet 容器层级执行,对所有请求生效,所以要避免复杂逻辑影响性能。【2】精细化控制相关逻辑用拦截器。
2025-06-26 14:00:00
37
原创 Spring应用上下文事件 ApplicationContextEvent 的各个子类(ContextRefreshedEvent、ContextClosedEvent)等监听以及触发时机
应用上下文事件(ApplicationContextEvent)机制,用于监听应用上下文各个阶段触发不同事件,从而处理一些特殊逻辑或架构设计。3、常用的应用上下文事件为:ContextRefreshedEvent、ContextClosedEvent。【1】ContextRefreshedEvent:应用上下文初始化完成或上下文刷新完成立即触发。【2】ContextStartedEvent:应用上下文启动触发。1、可以通过实现应用上下文接口,监听应用上下文事件。
2025-06-26 10:30:00
143
原创 Redis集群原理是什么
2、自动故障转移:当主节点出现故障时,哨兵会选举一个从节点晋升为主节点,并让其他从节点指向新的主节点。4、动态扩展:可以方便地向集群中添加新的节点,通过重新分配哈希槽,将数据从现有节点迁移到新节点上,实现集群的水平扩展,提高集群的存储和处理能力。2、故障转移:当某个主节点出现故障时,集群会自动检测并通过选举机制从其他正常的从节点中选择一个晋升为主节点,以保证集群的高可用性。3、节点通信:节点之间通过 gossip 协议进行通信,互相交换集群的状态信息,包括节点的存活状态、哈希槽的分配情况等。
2025-06-21 15:00:00
351
原创 Spring使用装饰器 TaskDecorator 实现 ThreadPoolTaskExecutor、@Async、CompletableFuture 异步任务线程之间上下文副本变量传播
在实际工作中,异步线程是最常用的技术之一,但当执行新的异步线程时会丢失主线程中的上下文信息,如:MDC、SecurityContext、RequestContextHolder.getRequestAttributes()等,基本上只要是通过 ThreadLocal 存储的线程副本信息,Spring默认都不会自动传递到新线程。【1】使用 TaskDecorator、复合多装饰器写法、ContextPropagatingTaskDecorator、以及手动传播,都可以实现异步线程切换传播上下文副本。
2025-06-21 10:30:00
57
原创 java中下载文件或导出文件到response的输出流中,文件名称乱码的文件解决方案
1、自定义导出的文件名称,需要进行url编码如此,下载后可以获取到指定的文件名
2025-06-20 15:30:00
81
原创 java上传文件把客户端传入的 MultipartFile 的输入流转为(写入) File 文件对象
【代码】java上传文件把客户端传入的 MultipartFile 的输入流转为(写入) File 文件对象。
2025-06-20 10:30:00
124
原创 java自带的常用队列 ConcurrentLinkedQueue、LinkedBlockingQueue、PriorityBlockingQueue 介绍
在一些特殊场景中,比如并发量较高的场景,需要对海量请求进行流量削峰,此时采用jdk自带的队列来作为缓冲就是个不错的选择,这里介绍一下java中常用的队列,可以理解为本地队列。【1】优先级阻塞队列,主要特点:无界、可选根据优先级排序(自然顺序或Comparator,默认自然顺序正序)、阻塞、线程安全。【1】链表阻塞队列,主要特点:无界(可选有界)、先进先出、阻塞和非阻塞可选、线程安全。【1】并发链表队列,主要特点:无界、先进先出、非阻塞、线程安全。【2】适用场景:对先进先出顺序有要求、灵活选择阻塞或非阻塞。
2025-06-19 15:00:00
131
原创 mybatis plus构造sql脚本无法识别关键字字段,解决方案
使用 mybatis plus 构造的脚本中如果有关键字,例如 desc、force 等或其他关键字,如果关键字不转义的话,执行会直接报错。
2025-06-19 10:30:00
186
原创 Spring事务同步器(TransactionSynchronizationManager)+ 事务钩子函数的使用案例
在实际开发中,通常会有这样的需求,主线程执行业务逻辑后需要发送异步消息到MQ或者需要执行异步线程任务,此时可能主线程的事务还没提交,就会导致在异步任务中查询不到主线程写入库的数据,因此这里需要使用Spring提供的事务同步器和事务钩子函数来解决这个问题。【2】声明式事务中也可以使用 TransactionSynchronizationManager.isSynchronizationActive() 判断当前线程是否有事务,有事务则注册事务同步器执行事务回调函数,将异步任务放在回调钩子函数中执行即可。
2025-06-11 15:30:00
92
原创 windows电脑解决笔记本搜索不到wifi问题
windows笔记本电脑明明打开了wifi功能,却搜索不到wifi,此问题可能是网络适配器被禁用的原因导致,通过以下方法也许能解决,无需重启电脑。1、右键点击网络或wifi图标,打开界面”网络和internet“3、启用WLAN,然后重新打开wifi连接即可。2、选择”高级网络设置“
2025-06-11 14:00:00
545
原创 Java中方法调用参数传递机制的理解和示例验证
在Java中,方法调用参数的传递机制是值传递,对引用类型传递的是引用的副本(不是真正的引用传递),也就是说在被调用方法中对参数引用副本重新赋值不会影响原始引用。【2】如果传递是引用类型,则传入的是原始引用副本(不是原始引用),更改引用副本内容会影响原始引用的值,但重新赋值不会影响原始引用(只在当前方法中生效)【1】重新赋值参数会影响调用方的变量:只有更改对象内容有效,重新赋值引用无效。【1】如果传递是基本类型,则直接传递值的副本,方法内重新赋值不会影响原始值。输出结果:2,3,4。
2025-06-09 14:30:00
150
原创 Java中异步编程 CompletableFuture.allOf()、CompletableFuture.get()、CompletableFuture.join() 的使用案例和适用场景
【2】CompletableFuture.get() 和 CompletableFuture.join():此二者方法都是用于阻塞主线程(调用线程),等待所有任务完成并获取结果。【1】在使用 CompletableFuture.allOf() 组合任务后,通常需要阻塞主线程(调用线程)等待任务完成。【2】优先推荐使用 allOf.join(),此方法可以更灵活的用于链式任务中获取结果。【1】CompletableFuture.allOf():用于组合多个异步任务。
2025-06-09 10:12:13
434
原创 Spring中过滤器 RequestContextFilter 和 OncePerRequestFilter 的区别
在Spring中,RequestContextFilter 和 OncePerRequestFilter 都是处理HTTP请求的关键组件,但它们的职能和使用场景有着不同的区别。【3】实现原理是通过 ThreadLocal 存储 ServletRequestAttributes 的属性值,以供当前整个请求线程生命周期内可以直接访问上下文信息,而无需通过方法参数传递。确保每个请求的过滤逻辑仅执行一次,@Order(1)确保改过滤器逻辑优先执行。【2】适用于请求只需要执行一次过滤逻辑的场景。
2025-05-30 14:30:00
177
原创 Java中删除文件、删除文件所在的目录,递归删除文件夹目录中的文件
一、删除文件、删除文件所在的目录,示例代码。二、递归删除文件夹目录中的文件,示例代码。
2025-05-30 10:00:00
265
原创 java中什么情况会导致 OOM(内存溢出)
OOM(OutOfMemoryError)是 JVM 内存不足无法为新对象分配内存抛出的严重错误,会导致应用崩溃、服务中断、性能骤降等问题。3、ThreadLocal、MDC等线程传递或共享变量使用后没有进行清理。1、代码中出现死循环空转、大量创建大对象等。2、资源未关闭,如:文件流、IO流。
2025-04-17 15:00:00
281
原创 java中什么情况会触发FullGC,如何避免频繁FullGC
2、选择合适的 GC 回收器,推荐(G1GC、ZGC)。避免使用CMS(该回收器已被弃用,且该回收器会导致内存碎片化,从而导致堆内存不足而触发FullGC)FullGC 为全量垃圾回收(完全垃圾回收),是 JVM 性能问题的典型信号,会直接影响应用的稳定性、吞吐量和响应速度。【1】频繁 FullGC(尤其是使用CMS”并发-标记-清除“算法的垃圾回收器)可能导致堆内存碎片化。【2】碎片化导致可用内存不足,即使总内存足够,仍会导致OOM(内存溢出)或触发FullGC。【3】系统整体处理能力降低。
2025-04-17 10:30:00
1098
原创 shardingsphere-jdbc集成Seata分布式事务
【1】shardingsphere-transaction-base-seata-at 的版本最好与 shardingsphere-jdbc 版本一致。(1)事务组名称可以自定义,但要与seata服务端配置文件(seata-server.yml)中配置的事务组名称一致(否则报错),【1】shardingsphere-jdbc 集成 seata 与 单数据源集成 seata 完全是各自独立的方式(不搭嘎)【2】在被调用方的服务中配置 seata 支持的事务传播拦截器,获取调用方传递过来的 TX_XID。
2025-04-16 14:30:00
740
原创 Docker部署安装Seata 2.2.0
【1】mysql-connector-j-9.1.0.jar 传入到 lib 目录下(/seata-2.2.0/seata-server/lib)5、把上述的文件 mysql-connector-j-9.1.0.jar、Dockerfile 分别传入Seata解压后的项目中。【2】apache-seata-2.2.0-incubating-src.zip 为了方便找到脚本、配置文件等。【1】apache-seata-2.2.0-incubating-bin.tar.gz 用来构建镜像。
2025-04-16 10:00:00
251
原创 SpringBoot项目集成Seata 2.0.0
【1】tx-service-group:事务组的主要作用是用于服务发现TC(事务协调器)服务集群,TC管理事务的提交或回滚。如果多个服务用同一个事务组可能会导致TC负载过高、事务管理混乱等问题。【4】必须在集成 seata 服务对应的数据库中创建 undo_log 表,【3】vgroup-mapping:注意事务组映射关系,不能配置错。【1】经测试验证,调用链全局事务可以正常回滚。被调用方正常开启分支事务(本地事务)即可。1、需要提供以下服务。【1】nacos服务。【2】seata服务。
2025-04-10 15:30:00
623
原创 Docker迁移root目录(根目录)至新的目录,可解决因docker目录磁盘空间满了导致容器无法运行、崩溃等问题
1、Docker 的根目录是指 Docker daemon 存储镜像、容器和所有相关文件的地方,Docker服务的默认存储目录位于 /var/lib/docker,如果需要新的目录(更大的磁盘分区或自定义路径)通常需要迁移到空间更大的目录。使用 rsync 将原数据完整复制到新目录(例如新目录为 /home/docker),大概需要等待几分钟时间。2、Docker 会为每个容器创建⼀个单独的目录,该目录包含该容器所需的所有文件系统内容。【2】data-root:对应的目录要确保存在。6、查看是否迁移成功。
2025-04-10 10:30:00
371
原创 windows系统桌面快捷箭头去掉、恢复方式,支持win10、win11
将上述代码放入txt文件中,然后改为bat文件,直接双击执行即可。将上述代码放入txt文件中,然后改为bat文件,直接双击执行即可。一、windows 11。二、windows 10。
2025-04-09 15:30:00
600
原创 SpringBoot配置上传文件临时解析处理目录、临时存储目录
spring.servlet.multipart.location 是 Spring Boot 中用于配置文件上传时临时存储目录的关键属性。它的作用是为 HTTP 多部分请求(文件上传)生成的临时文件指定存储路径。支持 multipart/form-data 类型的 HTTP 请求(例如表单文件上传),确保文件在写入临时目录后能被正确解析和处理。当客户端上传文件时,Spring 会先将文件内容写入磁盘的临时目录(而不是直接加载到内存),避免大文件占用过多内存。【1】确保应用对指定目录有读写权限。
2025-04-09 10:00:00
269
原创 Java设计模式-单例模式
【3】存在的问题:JVM可能对(分配内存空间、初始化对象、赋值)进行指令重排序打乱顺序,导致其他线程在第一次判空时看到 instance!【2】instance = new Singleton():实例化对象分为3个阶段:分配内存空间、初始化对象(调用构造函数)、将变量instance指向内存地址。【1】线程安全:JVM 保证枚举实例的初始化是线程安全的(静态块加载)【3】防序列化破坏:枚举的序列化机制天然保证反序列化时不会生成新实例。【2】防反射攻击:Java 禁止通过反射创建枚举实例。
2025-04-08 15:30:00
208
原创 git项目pull报错Cannot check the working tree for unmerged files because of an error.
一、报错信息:Cannot check the working tree for unmerged files because of an error。检查,防止在权限不明的目录中执行命令。1、Git 2.36+ 引入了。
2025-04-08 10:00:00
619
原创 java中自动转义分割或动态分割文件对象路径【path.split(Pattern.quote(FileUtil.FILE_SEPARATOR))】,分割结果为数组或集合
若直接使用 split(FileUtil.FILE_SEPARATOR) 代码实际会变成 split("\"),导致语法错误。【4】FileUtil.FILE_SEPARATOR 返回的分隔符(如 \ 或 /)在正则中有特殊含义,需转义后才能正确分割:Pattern.quote(FileUtil.FILE_SEPARATOR)【1】建议首先获取文件对象,通过文件对象 file.getPath() 获取文件路径。
2025-04-07 15:00:00
59
原创 MySql 主从复制,常见的问题
【2】master_auto_position 启动GTID自动定位,如果处于1启动状态则主从链路无法设置(master_log_file、master_log_pos)等信息。slave-skip-errors 的取值可查看 Last_SQL_Errno 的值,与之对应。【2】分别重启mysql服务后,在从服务更新主从链路信息(启用 GTID 自动定位)3、配置主服务器,修改my.cnf文件,允许非 SSL 连接(关闭安全连接)【1】master_auto_position 对应的值:1-开、0-关。
2025-04-07 10:30:00
456
原创 集成 shardingsphere-jdbc 常见问题
1、sharding.yml 文件中配置项要求非常严格,注意属性缩进、最好也不要出现汉字(包括注释汉字)、不能配置 shardingsphere-jdbc 不需要的额外其他属性。【2】actualDataNodes:把逻辑表映射到实际表命名规则。语法:数据源逻辑名_序号索引值.逻辑表名称_序号索引值,示例:ds_${0..1}.t_${0..1}【1】t:是逻辑表名称(一般取表前缀),逻辑表和实际表映射。【1】不配置此项加载单表,则会报错。2、违反1规则,可能会报错。
2025-03-29 14:30:00
477
原创 SpringBoot3.x 集成 shardingsphere-jdbc 实现读写分离
【1】jdbc:shardingsphere:classpath:是数据源配置文件路径的前置固定写法,后面sharding-config.yml是刚才创建的数据源配置文件目录和名称。3、打开 bootstrap.yml 文件,添加 ShardingSphereDriver 驱动,以及数据源配置文件的路径。1、在 resources 目录下创建 sharding-config.yml 文件,并添加配置信息。【2】读写库配置、负载均衡规则、分片配置逻辑表等。【3】不同数据源对应的url属性有所不同,说明。
2025-03-29 10:30:00
518
原创 docker部署安装Seata服务
该文件 application.yml 在 seata 项目的 seata\conf\application.yml 目录下,以及配置案例文件(application.example.yml)2、在nacos配置中心,创建 seata-server.properties 或 seata-server.yml 配置文件。【1】脚本可以在我们前面下载的seata项目包的 seata\script\server\db\mysql.sql 找到。【2】SEATA_IP:用于注册中心seata实例的ip。
2025-02-23 15:30:00
271
原创 解决seata服务常见异常问题
【1】docker创建容器时,显示的分配内存即可 -e JVM_XMS=256m -e JVM_XMX=512m。一、错误信息,此问题可能会出现在docker或k8s部署seata服务时出现。【1】看日志信息,很明显无法分配内存。
2025-02-23 14:00:00
194
原创 MySQL中ddl操作或创建索引防止锁表的一些建议或解决方案
【说明】目前没有任何一种办法可以保证在DDL操作下能完全避免锁表。(1)lock的可选项除了 none,还可以使用 shared(共享锁:允许读操作,但会阻塞写操作)【说明】使用 algorithm = inplace 原地算法,减少对数据库性能的影响。(2)在生产环境中对数据量较大的表进行DDL操作,选择在流量较小的时段执行较为合适。【说明】使用 lock = none 明确告诉MySQL在创建索引时不锁表。(1)建议在生产环境中进行任何重大DDL更改,都要在测试环境充分测试验证。
2025-02-17 15:00:00
455
原创 SpringBoot项目中不启动(不添加) @EnableAspectJAutoProxy 注解,AOP功能还生效吗
1、@EnableAspectJAutoProxy 是Spring框架的一个注解,其主要作用是启用AspectJ的自动代理功能,告诉Spring容器,我们希望使用AspectJ的注解来定义切面,并希望Spring容器能够自动为这些切面目标创建代理对象。2、主启动类启动 @EnableAspectJAutoProxy 之后,项目启动时,会扫描所有标注了 @Aspect 的类,并注册到Spring容器中。2、主启动类不启动 @EnableAspectJAutoProxy。
2025-02-17 11:00:00
117
原创 Java中 volatile、atomic、synchronized 关键字的作用
【2】指令重排序是指编译器和JVM为了提高程序执行效率而采用的一种优化手段,但在多线程环境中,它可能会导致程序出现意料之外的行为。【2】在多线程环境中,一个线程对共享变量的修改后如果需要及时地被其他线程看到最新的值。【1】原子性:atomic 类中的操作都是原子的,原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就会在不受其他线程干扰的情况下一直执行到结束。【2】atomic 原子性保证了在多线程环境下,即使多个线程同时尝试修改同一个 Atomic 对象的状态,也不会导致数据不一致的问题。
2025-02-11 15:00:00
71
原创 JMM(Java Memory Model)Java内存模型
1、Java内存模型(Java Memory Model,JMM)是Java虚拟机定义的内存访问规范,用于屏蔽底层硬件和操作系统的内存访问差异,达到内存访问一致性的目的。1、可见性:一个线程对共享变量的修改,能够及时地被其他线程看到。JMM通过规定主内存与工作内存之间的交互操作,使用 volatile 修饰共享变量确保变量的可见性。2、解决多线程环境下共享变量的可见性、原子性和有序性问题,规定了共享变量如何在多线程之间共享。【工作内存】:每个线程独有的一个存储区域,用于存储线程私有数据和共享变量的副本。
2025-02-11 10:30:00
214
原创 Java21虚拟线程的概念和基本使用、以及和传统线程的对比
在 Java 21 中,虚拟线程作为一项全新的功能被引入,与传统线程相比,虚拟线程不仅在内存占用和创建开销上更为轻量,而且能更高效地支持 I/O 密集型应用,极大地提升并发处理能力。1、经验证,虚拟线程性能还是非常强的,但和 Spring 提供的 ThreadPoolTaskExecutor(AsyncTaskExecutor)线程池相比,虚拟线程还是稍逊一筹。首推还是使用虚拟线程,因为虚拟线程属于逻辑层面的线程,和物理机器无关,因此可以随时创建大量的线程也不会占用过多的内存和资源消耗。
2025-01-24 14:15:00
224
原创 Spring AOP 和 AspectJ AOP 的区别和使用场景
如果你需要增强 final 方法、static 静态方法、字段访问、构造器调用等,或者需要在非 Spring 容器管理的对象上应用增强逻辑,AspectJ 是唯一的选择。(2)Spring AOP 是基于动态代理实现的增强,仅支持增强 Spring 容器内管理的 Bean 实例对象,不支持增强 final 和 staic 修饰的方法。1、AspectJ 是通过直接操作字节码来实现的增强,它不依赖于代理对象,能够直接对目标类的字节码进行修改。(3)AspectJ 可以增强非 Spring 容器管理的对象。
2025-01-24 10:15:00
142
原创 SpringBoot 3.x集成 jakarta mail 实现发送邮件
【2】发送者名称需要做转义处理,完整转义示例:String from = "\"" + senderName + "\"" + " " + "<" + senderEmail + ">";【1】mailAccount.setFrom():支持解析格式(双引号包裹名称 + 尖括号包裹地址):"\"发送者名称\" <support@example.com>"3、如上示例只验证了简单内容的邮件,也支持附件、HTML内容、抄送等邮件。MailConfig 类。MailUtil 工具类。验证结果:皆成功收到邮件。
2025-01-20 14:30:00
439
原创 解决:SpringBoot集成mail服务项目启动报错 Failed to instantiate [MailSenderValidatorAutoConfiguration]: Constructo
出于安全考虑,某云服务器默认封禁了TCP25端口出方向的访问流量,无法在某云上的云服务器通过TCP25端口连接外部地址。
2025-01-20 10:00:00
197
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人