- 博客(34)
- 收藏
- 关注
原创 Spring静态工具类中注入 Bean 的原理与实现
ApplicationContext 不能通过 @Autowired 注入,因为它本身不是容器中的 Bean。ApplicationContextAware 是 Spring 专门提供的回调接口,用于让 Bean 获取容器引用。是最小可行方案。静态变量作为桥梁,将 ApplicationContext 暴露给静态上下文,从而在静态方法中获取任意 Bean。Hutool 的 SpringUtil已经封装好了这个功能,可以直接使用。
2026-06-22 20:26:01
63
原创 Maven System Scope 依赖在 Spring Boot 打包后类找不到的问题排查与解决
问题原因解决方案本地正常,服务器报错systemscope 不传递在最终模块显式声明依赖手动塞 jar 到 fat jar 无效Spring Boot 类加载器不加载嵌套 jarMaven 打包时正确引入只配置无效当前模块未声明依赖同时显式声明system依赖jar-in-jar 无法加载JVM 类加载器不递归扫描确保 jar 在顶层核心知识点Mavensystemscope 依赖不传递Spring Boot fat jar 的类加载机制不支持 jar-in-jar。
2026-06-17 15:37:17
235
原创 MyBatis 一级缓存导致序列值重复问题排查与解决
在同一个 SqlSession 中执行相同的 SQL(相同的语句和参数),MyBatis 会直接从缓存返回结果,不再查询数据库。会清空整个 SqlSession 的一级缓存,可能会影响同事务内其他需要缓存的查询。不同的 SqlSession 拥有独立的一级缓存,所以每次都能从数据库获取最新值。不会导致序列值浪费,因为序列值在数据库层面已经自增,清空缓存只是让 MyBatis 重新查询而已。但 MyBatis 的一级缓存并不关心 SQL 的语义,它只把。:防止本次结果存入缓存,但无法清理缓存中已有的旧数据。
2026-06-17 15:26:15
335
原创 mybatisPlus分页组件3.5.15版本报错解决方案
在引入mybatisPlus版本是3.5.15,你引入分页组件会报PaginationInnerInterceptor这个类找不到的错误,因为这个类移到别的jar包了,你需要额外引入jsqlparser这个包,完成的pom是。
2026-02-24 21:41:27
235
原创 说下Mysql的MVCC机制
首先我个人理解的幻读分为两种情况,事务A查询某个范围的数据,(注意是范围,具体某条就是重复读的问题了),事务B这时在这个范围插入了数据并提交了事务,那么事务A这时再次查询这个范围,数据条数对不上了(产生了幻觉),这个我称之为幻读的读问题;弄清MVCC机制首先要先了解下undo log,undo log用于事务回滚的,事务提交后,按理说不用回滚了,可以删了,但是它不会删,这就是留给MVCC用的,但是insert 的undo log会删,这个影响不大,因为它创造了数据,不会有并发的问题(写、写肯定时互斥的)。
2026-01-25 02:24:17
387
原创 Mysql的redo log和undo log
事务有四种特性:原子性(A),一致性(C),隔离性(I),持久性(D),那么其中持久性就算靠redo log来完成的,原子性就是靠undo log来完成的。by way: 事务的隔离性由锁机制实现。一致性靠什么?我的理解是原子性、隔离性、持久性这三个特性的目的就是一致性。
2026-01-24 23:16:32
828
原创 JMM中的工作内存实际存在吗?
好的,简单介绍一下CPU三级缓存。你可以把它想象成一个**“学霸的速记本”体系**,离大脑(CPU核心)越近,速度越快,但容量越小。## 核心比喻:图书馆借书- **主内存(RAM)**:学校的大图书馆,书很多但走过去要 **100-200 纳秒**。- **L3 缓存(三级缓存)**:系里的小资料室,存放常用书,走过去要 **30-40 纳秒**。- **L2 缓存(二级缓存)**:你小组的共享书架,更快更小,需要 **10-15 纳秒**。
2026-01-22 15:35:26
767
原创 JAVA面试-框架篇
在项目中,我遇到过几种导致事务失效的场景:如果方法内部捕获并处理了异常,没有将异常抛出,会导致事务失效。因此,处理异常后应该确保异常能够被抛出。如果方法抛出检查型异常(checked exception),并且没有在注解上配置属性为Exception,那么异常发生时事务可能不会回滚。如果事务注解的方法不是公开(public)修饰的,也可能导致事务失效。
2026-01-21 17:59:42
280
原创 Redis的多级缓存
有了OpenResty就可以使用nginx的本地缓存功能,如果是一台nginx服务器,性能肯定受影响的,所有可以组成集群,前面再加一台nginx服务器,作为反向代理用。如果有知道的,有好的解决方案麻烦告知。为了尽可能的减少tomcat或者mysql的压力,我们引入了多级缓存,其核心思想就是在每一级都添加缓存,尽可能减少调用的链路,比如nignx中添加缓存,nginx直接访问redis(这样能跳过tomcat了),nginx访问tomcat的进程缓存(一般就是java的本地缓存了),最后才是访问数据库。
2026-01-15 00:31:48
405
原创 保持redis和数据库一致性(双写一致性)
问:在保证redis数据和数据库数据一致的方案中,如果需要强一致性,采用redisredisson的读写锁,在读数据使用读锁,写锁来锁更新数据库的操作,但是一般读数据的时候可能数据正好过期了,那么读的操作是不是要去查数据库,并写到redis缓存中,那么这个写是要再次加锁吗?在实际应用中,除非有严格的强一致性要求,否则可以考虑使用**最终一致性**方案(如异步更新、延迟双删等),这样在性能和一致性之间能达到更好的平衡。| **定时刷新** | 简单,缓存命中率高 | 数据可能过期 | 允许短暂不一致 |
2026-01-11 11:18:18
849
原创 java生成和加密SQLCipher数据库
其实很简单,主要看createEncryptedDatabase方法。sqlite数据库在创建连接的时候,如果数据库文件(文中的dbPath)找不到就会创建一个新的db文件,加密的话就是连接加上key=你的密码。连接成功后就会产生新的一个带加密的数据库文件。主要是依赖,依赖不对,是不行的,无法加密。最近有个需求是将照片导入到sqlcipher数据库,并且加密。开始用deepseek写代码,但是加密的方法网上很难找或者需要收费,seepseek也半天解决不了。经过苦寻,获取了解决方案,其实很简单。
2025-11-28 16:07:22
298
1
原创 本地jar导入到本地仓库和远程仓库
像我这个就是一个第三方处理word文件的jar包,远程库没有这个文件,groupId、artifactId、version这些其实是定义好的,只是下载不到了,如果你不知道这些或者你自己写的jar包,可以自己命名,关键scope要填system,然后systemPath路径要对。这样你的项目就可以使用这个jar包了。但是这样不太好,应该把jar包交给maven仓库管理,这样别的项目也能用这个jar包了,也不用项目里有个jar包,这就需要将jar包上传到maven本地库,然后推送到远程库。
2025-08-14 17:44:51
987
原创 ollama的安装及加速下载技巧
ollama的安装可以从官网下载,地址:和官网一样。下载好了,点击安装,安装好了,打开cmd 输入ollama会显示如下,代表安装成功。
2025-06-03 22:43:48
1116
原创 微服务中引入公共拦截器
DispatcherServlet是springmvc的核心类,使用ConditionalOnClass,即判断当前有没有引入springmvc的依赖来判断是否引入MvcConfig 这个配置类,网关没有springmvc的依赖,这样这个配置类就不会生效。但是注意如果某个微服务启动报错,可能是你的某这个微服务没有引入springmvc的依赖,比如网关微服务,网关不需要springmvc的依赖,也不需要这个拦截器,这样所有引入common-service依赖的微服务都添加了这个拦截器。
2025-05-31 19:29:09
658
原创 idea同个工程启动多个服务
1、右击要复制的服务,选择copy Configuration。输入 -Dserver.port=8083。点击Modify options。记住不要输入错了,点击ok。选择添加虚拟机启动参数。
2025-05-22 15:47:14
1028
原创 面试踩过的坑
ps:问的是:int a = 3;if(a==3){},比较的是值还是内存地址。这个忘了,想到另一个概念整数常量池,是自己想多了,和整数常量池的问题记混了,看到a==3,就想着3不会在内存中新建。傻了,这里再说下在方法中int a = 3。a和3(基本类型)都是保存在栈中的,引用类型对象才会在栈中存堆的内存地址。所以==比较基本类型时只能比较值,没有什么内存地址给你比较。下面代码//自动装箱:等价于 Integer.valueOf(3)
2025-04-26 00:10:05
2215
原创 JVM学习笔记
通过arthas工具的classloader -t 可以查看类加载器的父子关系个人感觉先说第二点比较好,且第二点说之前,说下java(在jdk8和8之前)中的默认类加载有三个,分别是启动类加载器,拓展类加载器,应用程序加载器。上一章节说了类加载器,它把字节码文件加载到了内存(运行时数据区)中,这一章节介绍下运行时数据区按线程共享不共享分了2块区域:共享的 有堆和方法区(jdk8后叫元空间)程序计数器、java虚拟机栈、本地方法栈为什么学习运行时数据区呢(应用场景)?
2025-04-23 16:16:58
1019
原创 Synchronized底层原理和优化
synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致共享数据不安全,而synchronized关键字就可以用于代码同步 。 本文主要介绍Synchronized的原理和优化。要弄明白原理,得先明白2个东西,一个是java对象的内存布局(重点关注mark word),还有一个Monitor。 在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padd
2025-04-18 19:50:54
765
原创 MYSQL优化
拓展:Alibaba《Java开发手册》索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。一般指的是联合索引,比如create index indexname on t1 (a,b,c)查询的时候:select * from t1 where b='1' and c ='2';没有使用到A,导致失效。
2025-04-05 20:09:42
926
原创 git如何增量导出修改的文件
git diff-tree -r --no-commit-id --name-only bb20fb1c70c826761770389c64c1f4b90253b7d8| xargs tar -rf V3.tar
2025-03-28 14:02:16
385
原创 MyBatis中的#{}为什么可以防止sql注入,${}却不行
简而言之就是使用#{}底层使用的setString方法;setString中干了一件事,如果你输入了单引号',那么它会在它前面加上\转义符。这样不管你输入什么就是个纯字符了。这个知识点是一直知道的,但是原理一直不懂,今天用deepseek问了下,也没给出详细答案,只说了#{}是预编译。预编译就可以,最终不还是要用参数替换?原文比较详细,可以点进去看。
2025-03-14 22:56:28
287
转载 spring boot无数据库连接启动
用spring boot 搭建的项目,在配置文件不连接数据库启动项目会报错。原因在于spring boot默认会加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration类,DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataS...
2020-04-23 00:20:03
1993
原创 linux一个文件插入到另一个文件指定行
需求:将我部生成的一个文件aa_yyyyMMdd.log(其中yyyyMMdd是前一天的日期)与另一个部门生成的文件bb.txt合并到一起,另一部门文件有头和尾加正文,要求我方文件插入到别的部门的文件中,其中头和尾内容不变,正文放到一起。百度得到如下解决方案:sed可以实现从一个文件读入写入另一个文件的指定位置,sed -i '2r a2.txt' a1.txt ,将a2.txt文件内容插...
2019-12-11 16:34:18
7356
4
转载 linux中更改tomcat产生日志的可读权限问题
修改部署在tomcat项目上生成日志的权限问题描述:当用非root权限部署tomcat并运行项目时,其他非root用户无法读取项目的日志文件,项目日志文件对其他非root用户无读权限。解决:修改umask值。新文件的文件默认权限是根据操作系统的umask值得设置来决定的,但如果通过umask命令修改或在用户的.bash_profile中设置umask值是不会生效的,因为在tomcat的启...
2019-10-25 15:23:45
2003
原创 oracle数据迁移
最近老大要我做几张流水表的数据迁移,要求每天定时清理A表180天前数据,把它先导入历史表B表中(B表结构和A表一致),然后删除a表180天前数据。思路:先写一个迁移的存储过程,在建立一个oracle的job(定时任务)来定时执行 :create or replace procedure PB_CLEAR_TEST_1( in_keepday number, --清理多少天前数...
2019-06-17 21:18:43
1142
转载 git 一个分支完全覆盖master
1.1 git push origin develop:master -f把本地的 develop 分支强制(-f)推送到远程 master但是上面操作,本地的 master 分支还是旧的,通常来说应该在本地做好修改再去 push 到远端,所以我推荐如下操作1.2 git checkout master切换到旧的分支1.3 git reset --hard develop ...
2019-04-03 17:34:58
2988
原创 AIX系统java环境配置
在当前用户的根目录下 vi .profile 编写一下内容export JAVA_HOME=/usr/java5 (/usr/java5换成你要配置的java安装路径)export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 参考 htt...
2018-10-11 18:50:08
4000
转载 ps -ef |grep 输出的具体含义
比如:[root@localhost ~]# ps -ef | grep ApacheJetspeedroot 18887 18828 0 08:09 pts/0 00:00:00 grep ApacheJetspeed字段含义如下:UID PID PPID C STIME TTY TIME CMDroot 18887 ...
2018-09-13 14:49:52
442
原创 java中关于进制的表示
今天看了这样一个题目:public class Demo1 { public static void main(String[] args) { Demo1 d = new Demo1(); d.a(); } public void a() { int i=012; System.out.println(i); }}问输出什么结果: 我想当然的认为是12,觉得0就是来扰乱人的,但就拿到ec...
2018-04-13 09:48:04
917
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅