- 博客(26)
- 收藏
- 关注
原创 Springboot----@Role注解的作用
表明该 Bean 是 Spring 容器内部的基础设施组件(如后置处理器、工具类等),而非用户直接使用的业务 Bean。:若用户尝试定义同名 Bean,Spring 会根据角色优先级决定是否允许覆盖(默认不允许覆盖基础设施 Bean)。:开发 Spring 扩展(如 Starter、自定义后置处理器)时,标记非业务 Bean。:告诉 Spring 该 Bean 是容器运行所需的底层工具,而非用户业务逻辑的一部分。:在调试或排查问题时,能快速区分框架 Bean 和业务 Bean。
2025-04-04 17:07:13
380
原创 自定义注解导入自定义Bean
在Spring框架中,通过自定义注解实现容器启动时自动导入Bean,通常需要结合 @Import。:需要动态生成Bean或根据条件注册Bean(如配置文件、类路径是否存在某个类)。),即可实现Bean的自动注册,极大简化配置流程。创建一个注解,用于标记需要启用自动配置的功能。,Spring Boot会自动加载该配置类。通过Spring Boot的条件注解(如。通过这种方式,用户只需添加一个注解(如。:固定注册某些Bean,无需动态条件。在注册逻辑中动态或静态定义Bean。添加条件注解优化自动注册行为。
2025-04-04 16:52:34
417
原创 ThreadPoolExecutor原理详解
增加线程是通过线程池中的addWorker方法,该方法的功能就是增加一个线程,该方法不考虑线程池是在哪个阶段增加的该线程,这个分配线程的策略是在上个步骤完成的,该步骤仅仅完成增加线程,并使它运行,最后返回是否成功这个结果。线程池运行的状态,并不是用户显式设置的,而是伴随着线程池的运行,由内部来维护。任务拒绝模块是线程池的保护部分,线程池有一个最大的容量,当线程池的任务缓存队列已满,并且线程池中的线程数目达到maximumPoolSize时,就需要拒绝掉该任务,采取任务拒绝策略,保护线程池。
2025-03-29 15:15:19
550
原创 JVM的组成及各部分的作用
JVM通过类加载器、运行时数据区、执行引擎等组件的协作,实现了Java程序的跨平台运行。JVM(Java虚拟机)是Java程序运行的核心环境,负责将Java字节码转换为机器码并执行。:存储类信息、常量、静态变量、即时编译器编译后的代码。:支持本地方法(Native Method)的执行。提供JVM所需的本地库支持(如线程、文件操作)。:存储方法的局部变量、操作数栈、方法出口等。:记录当前线程执行的字节码指令地址。:线程共享,逻辑上属于堆的一部分。:线程共享,是垃圾回收的主要区域。
2025-03-23 15:00:39
866
原创 Java注解的原理
注解属性必须是编译时常量(基本类型、String、Class、枚举、注解或它们的数组)。Java注解(Annotation)是一种为代码添加元数据的机制,其核心原理基于。反射读取注解需要访问方法区元数据,频繁调用可能影响性能(可通过缓存优化)。:通过元注解定义行为 → 编译时/运行时存储 → 工具或反射处理。,其信息会写入类文件的属性表,JVM 加载类时将其加载到内存的。时,JVM 动态生成注解的代理对象。:元数据接口,由编译器生成代理类实现。注解属性值存储在代理类的成员变量中。读取类文件中的注解属性值。
2025-03-22 17:51:12
554
原创 结合类的实例化理解jvm内存模型
理解这一过程有助于诊断内存泄漏(如长生命周期对象持有短生命周期对象的引用)、优化内存分配(如调整堆大小、选择 GC 算法)等问题。理解 Java 对象的实例化过程与 JVM 内存模型的关系,是掌握 Java 内存管理的核心。:根据类信息计算对象大小(包括对象头、实例数据、对齐填充),在堆中分配内存。方法区存储类的元数据,堆中的对象通过类型指针(对象头)关联到方法区的类信息。(对象引用)存储在虚拟机栈的局部变量表中,指向堆中的对象地址。是 JVM 内存模型的动态体现,涉及堆、栈、方法区的协作。
2025-03-22 17:44:18
574
原创 Java反射的原理详解
在 Java 7+ 中,反射的部分功能被优化为 java.lang.invoke.MethodHandle。当类首次被加载时,JVM 会在方法区(元空间)中创建该类的。反射调用需要动态解析类信息,绕过了 JIT 编译器的优化。Java 反射(Reflection)的核心原理是通过。对象可以获取类的所有结构信息(方法、字段、注解等)。通过配置策略文件限制反射操作(如禁止修改私有字段)。:类加载机制、方法区的元数据存储、本地方法调用。(包括字段、方法、构造器、父类等信息)。的实例),作为访问类元数据的入口。
2025-03-22 17:40:29
1120
原创 Go语言中context.Context的
例如,在 HTTP 请求处理中传递用户身份信息、追踪 ID(traceID)等。是 Go 语言中用于管理请求生命周期、传递数据和控制超时/取消的核心工具。通过取消信号终止正在执行的操作,例如取消一个 HTTP 请求或数据库查询。在并发编程中,确保 goroutine 能够正确退出,避免资源泄漏。应该仅用于传递请求范围的数据,而不是作为函数的参数传递。时,需要注意不可变性、键的类型以及及时释放资源。设置请求的超时时间,避免长时间阻塞。的实现是基于树形结构的,每个。以下是一个完整的示例,展示。
2025-03-21 17:37:56
595
原创 MySQL索引最左匹配原则跟条件顺序有关系嘛
是索引使用中的一个核心规则,它决定了查询是否能有效利用复合索引(多列索引)。如果查询条件没有包含索引的最左列,或者跳过了中间的列,MySQL将无法充分利用该索引。,MySQL优化器会根据索引的最左匹配原则自动调整条件的顺序。:条件的顺序不重要,MySQL优化器会自动调整,但必须包含最左列。:如果查询条件中没有包含复合索引的最左列,索引将无法使用。:需要遵循最左匹配原则,确保查询条件包含复合索引的最左列。:范围查询会导致其右侧的列无法使用索引。:确保查询条件包含复合索引的最左列。:将最常用的列放在最左侧。
2025-03-05 10:45:51
375
原创 如何定位线上OOM
1.针对本身资源不够的问题,我们可以通过jmap -heap 进程id 来查看当前应用堆内存使用情况,比如新生代一共多少内存,用了多少内存,老年代一共多少,用了多少等,根据这些信息做出适当的调整。随便点开一个对象,找到GCRoot,右键在‘线程中显示’,就可以找到当前对象在线程中的引用,即可定位到产生该对象的位置。2.如果是申请的对象太多或者内存资源未释放等问题,我们要先定位到对应的代码,修改对应的代码即可。一次申请的对象太多指的是查询数据库时数据列表的查询,每条数据都封装成一共java对象。
2025-02-18 11:27:03
374
原创 MySQL深度分页如何优化
思路:可以在业务层面规避深度分页,仅展示几百页的数据就可以,因为越往后的数据几乎没人能翻到。思路:根据一个唯一的递增列作为一个唯一值,将上一次查出的最大的值作为下一次查询的条件。思路:可以先查出满足记录的主键值,然后根据查出的主键值查询出需要的记录。
2024-12-23 01:00:51
337
原创 Mysql单表存储多少数据要进行分表(B+树存储数据的计算方式)
B+树的每个节点都是由数据页(默认大小时16KB=16384字节),非叶子节点的数据页只存储索引和指针,叶子节点的数据页存储数据。数据页的构成:只有中间的UserRecord用来存储数据。每个数据页减去页头和页尾的开销(大概200字节)以后,有效存储数据的空间大概为:16384-200=16184字节;一行数据所占字节为4*5=20字节所以一个数据页大概能存储16184/20=809条数据。因此,只要知道了B+树一共有多少给叶子节点,就可以计算出能存储多少条记录。
2024-12-08 01:00:52
667
原创 缓存和数据库一致性
好了,总结一下这篇文章的重点。1、想要提高应用的性能,可以引入「缓存」来解决2、引入缓存后,需要考虑缓存和数据库一致性问题,可选的方案有:「更新数据库 + 更新缓存」、「更新数据库 + 删除缓存」3、更新数据库 + 更新缓存方案,在「并发」场景下无法保证缓存和数据一致性,解决方案是加「分布锁」,但这种方案存在「缓存资源浪费」和「机器性能浪费」的情况4、采用「先删除缓存,再更新数据库」方案,在「并发」场景下依旧有不一致问题,解决方案是「延迟双删」,但这个延迟时间很难评估。
2024-12-04 17:34:19
686
原创 使用MQ时是否有必要自定义唯一消息Id
在使用mq发送消息时,最好自定义一个消息id。可以考虑如下场景生产者发送消息到 Broker 超时了,但是 Broker 接收到了消息并执行成功。消息发送者以为失败了,默认执行重试,然后第一次执行成功,重试也成功了。对于 Broker 来说,其实是两个消息,消息 ID 是不同的,造成同一个消息发送了两次,而且有两个不同的消息id,这样后续就无法通过消息id做幂等判断。
2024-12-03 22:39:05
251
原创 MySQL----case的用法
CASE表达式是 MySQL 中一个非常有用的条件判断工具,它可以使得 SQL 查询更加灵活和动态。通过CASE,可以轻松地根据不同的条件对数据进行分类、转换、排序或更新,是 SQL 查询中常见且强大的功能之一。
2024-11-26 14:14:29
4372
原创 cookie的几个组成
但是,HTTPOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;该方法也可用于Web站点的身份鉴别,即在HTTPS的连接建立阶段,浏览器会检查Web网站的。无效时,浏览器并不会立即终止用户的连接请求,而是显示安全风险信息,用户仍可以选择继续访问该站点。持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效。如果没有显式设置这个属性,那么默认的domain是创建cookie的页面的域名。设置Cookie的生存期。
2024-11-25 20:59:35
522
原创 mysql排序函数
无论值是否相同,都分配唯一的序号。RANK():相同的值会分配相同的排名,但会跳过排名(如1和1之后是3)。:相同的值会分配相同的排名,且排名连续(1和1之后是2)。这些排名函数通常和一起使用,用于对不同的分组进行排名。这样,排名会针对每个部门分别进行计算,而不是对整个表进行排序。
2024-11-11 23:09:02
862
原创 Spring三级缓存的作用
二级缓存(Early Singleton Objects):这同样是一个Map类型的缓存,存储的是早期的bean引用,即已经实例化但还未完全初始化的bean。一级缓存(Singleton Objects):这是一个Map类型的缓存,存储的是已经完全初始化好的bean,即完全准备好可以使用的bean实例。因为:因为spring中的bean大多都是单例的,创建好的bean对象要存放在二级缓存中,需要时从二级缓存中获取,而不能每一次都要通过三级缓存中的对象工厂创建一个新对象。
2024-11-09 17:20:29
233
原创 bean的生命周期中实现BeanNameAware、BeanFactoryAware,ApplicationContextAware的作用
是 Spring 中的一个接口,定义如下:java方法接受一个String类型的参数name,该名称即为 Spring 容器中该 bean 的名称。实现接口的主要作用是让 Spring 容器在初始化 bean 之后,能够将该 bean 在容器中的名称传递给它,这对于一些特定的需求非常有用,尤其是在你需要根据 bean 名称动态调整行为时。接口只有一个方法:java。
2024-11-09 17:14:52
1268
原创 声明式feign和继承式feign
如果我们使用feign的继承特性,就不会有上方的情况产生,继承特性就是说,我们弄一个共用的接口,在接口上布置我们的requestMapping注解,规定我们的方法参数。由上方的代码来看,有什么缺点呢,比如我要更改controller的参数,那么我需要改两处地方,一处是自己的controller实现,一处是feign的接口。feign的代码是十分简单的,只要保证feignClint的值是我们要调用的微服务的值,然后其中的postMapping的值和上方controller的一样即可调用到。
2024-10-28 16:03:52
998
原创 HashMap 的 computeIfAbsent 方法
是HashMap中非常有用的方法,能够简化代码并提高性能,尤其是在处理复杂的映射关系时。它通过减少对映射的重复检查和插入操作,使得代码更加整洁。
2024-10-21 14:45:47
686
原创 redisTemplate.executePipelined命令
方法签名参数:一个回调接口,定义了要执行的 Redis 命令。你可以在这个回调中添加多个命令。返回值返回一个List,包含执行命令的结果。结果的顺序与你在回调中添加命令的顺序一致。是一个高效的 Redis 命令批量执行方法,通过管道机制减少网络延迟,提高操作性能。适用于需要进行大量命令执行的场景,能够显著提升应用的性能表现。
2024-10-17 16:34:49
1173
原创 Maven项目的那些事
的配置为 Maven 构建生成的输出文件定义了一个清晰且具有结构性的命名方式,尤其在多模块项目中,这种命名方式可以显著提高文件的可识别性和管理效率。
2024-10-14 14:47:10
185
原创 Dubbo与OpenFeign:如何选择与优劣
在Java开发中,Dubbo和OpenFeign是两个常用的RPC(远程过程调用)框架,它们各有优势和适用场景。选择合适的框架对于项目的稳定性和性能至关重要。本文将深入探讨Dubbo和OpenFeign的优缺点,帮助你更好地理解两者的特性,从而根据实际需求进行选择。
2024-10-09 23:58:28
777
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人