- 博客(127)
- 收藏
- 关注
原创 Jdk动态代理 & Cglib动态代理
总结:jdk代理对象实现了与实际对象一致的接口,重写了这个接口的所有方法。当调用代理对象的代理方法时,执行的就是处理器的invoke方法。这个invoke方法里可以通过反射调用到实际方法。JDK代理基于接口、JDK代理使用反射调用、JDK代理可以代理接口中的默认方法。
2025-08-30 22:38:12
76
原创 【Spring底层分析】Spring AOP补充以及@Transactional注解的底层原理分析
1、@EnableAspectJAutoProxy,依赖springboot自动装配原理。项目中引入了 Spring Boot 的 依赖比如spring-boot-starter-web,这个依赖间接引入了 spring-boot-autoconfigure 这个JAR包,这个JAR包里的 META-INF下的文件中,定义了一长串自动配置类,其中就包括:当springboot启动后,会扫描这个文件里定义的每个类,当处理到AopAutoConfiguration这个类时,做了以下事:总结:@EnableA
2025-08-29 16:31:46
509
原创 【Java Stream】基本用法学习
由于在公司写代码时,发现有大量地方可以优化为使用stream流的方式写,且更加简洁,因此学习了一下stream的基础语法。Java Stream 是 Java 8 引入的用于处理集合数据的函数式 API,提供了一种高效、声明式的数据处理方式。
2025-07-13 16:59:38
279
原创 【bug修复积累】关于包装类型和基本数据类型的使用
当要进行计算时,如果是null * 100,则会报空指针,因此我们计算时,因尽量使用基本数据类型计算。从mysql查出可能为null,因此用Double接收,要注意xml文件中的returnType也需要是Double类型,以防报错。
2025-07-09 17:51:36
130
原创 【nginx】公司部署项目时引发的nginx简单学习与思考
应用构建可以理解为将应用打包成jar包,jar内置tomcat、所有第三方依赖库、编译后的.class文件。部署实例可以理解为将jar包放到服务器某个目录下,然后启动jar包,jar内置的tomcat也会启动。那么tomcat就会监听端口的所有请求。ok,除了jar包方式,还有容器部署的方式,这个坑后续再补。,这个应用构建是从git上拉取最新项目进行构建的。公司是使用公司内部的开发部署平台进行部署项目的。→ 启动端口监听 → 应用就绪。开发部署平台的使用过程就是需要先。
2025-07-01 15:49:16
449
原创 【redis】过期策略 & 懒惰删除
1、定时删除:定期扫描字典,采用贪心的策略,从字典随机抽20个key,删除其中已经过期的key,如果过期的key超过1/2,那么重复上述步骤。当有大量key同时过期,为了避免无限循环扫描,这一个定时删除的任务的时间上限是25ms,但是即使有这个时间上限,仍然会出现积少成多的卡顿。当移除key的指针引用后,key会被立即删除,但是值对象仍在内存中,并且主线程无法再访问这个值对象。2、惰性删除:当客户访问key时,redis就会对key进行过期检查,如果过期,就会立即删除这个key。让后台线程来执行删除。
2025-06-04 08:12:08
309
原创 mybatis-plus逻辑删、创建时间、修改时间基础知识补充
即使数据库有自动更新,也建议保留 MyBatis-Plus 的。- 当记录更新时自动将该字段设置为当前时间。这样可以保证应用层和数据库层双重保障。- 设置字段的默认值为当前时间。设置为插入时的当前时间(因为。更新为操作时的当前时间(因为。
2025-05-20 11:22:32
297
原创 Mybatis-Plus Update 注意事项
updateById:在调用updateById方法前,应先从数据库中检索出实体,然后对实体进行变更,最后调用updateById进行保存。
2025-05-15 11:25:07
358
原创 关于项目中优化使用ConcurrentHashMap来存储锁对象
关于项目中优化使用ConcurrentHashMap来存储锁对象【应用+底层知识介绍】
2025-05-03 18:26:19
622
原创 【思维导图】并发编程
偏向锁就是当一个线程想要获取锁时,会在对象头中存储这个线程id并且将对象头里的偏向锁标识设置为1,如果下次同一个线程想要再次获取同一把锁时,首轻先判断的就是对象头中的线程id是否与自己的相同,如果相同,则这个线程直接获取锁成功。而如果不同的线程想要获取这把锁,则会将这个偏向锁升级为轻量级锁。乐观锁认为自己在使用数据时不会有其他线程来修改数据,因此在读取数据时不会添加锁,只有修改数据前数据是否有被其他线程修改,如果没有其他线程修改,那么就放心大胆的修改数据,而如果数据被其他线程修改,那么自己就修改数据失败。
2025-01-31 20:53:36
968
原创 【思维导图】java
封装就是使用private修饰属性或方法,这样类的对象就没法直接访问或修改属性,只能通过get/set方法进行访问或修改。封装的好处:降低代码的耦合度,利于维护;通过get/set方法访问属性的时候,可以增加一些额外的逻辑,这是单独访问属性无法做到的。继承就是子类继承父类,子类继承了父类所有的方法和属性。并且子类还可以增加一些自己的属性和方法。继承的好处是提高代码的复用性,比如说一个类想要拥有另一个类的属性和方法,就可以采用继承的方式实现。
2025-01-30 10:40:35
1161
原创 jdk1.7的hashmap为什么会出现死循环问题
如果数组的这个下标位置中有元素且判断出这个元素的key与待插入的元素key相等,那么用新元素的value值替换,结束。需要注意的是线程1和线程2的e都指向了key:3这个元素,e.next都指向了key:7这个元素。假设现在线程1挂起,线程2接着执行transfer方法剩余的逻辑,得到如下新扩容后的数组,因为是头插法,导致7和3的位置颠倒了。由于一个线程使用的是头插法进行迁移数据到新开辟的数组中,使得链表中的数据是颠倒的顺序。线程1自己也开了个扩容后的新数组,但是头插法插入元素仍然是用的上图元素的地址。
2024-11-15 18:00:13
475
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人