自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 Spring Boot 自动配置全流程深度解析

从1. 注解触发:@SpringBootApplication 包含 @EnableAutoConfiguration,通过 @Import引入AutoConfigurationImportSelector(ImportSelector接口的实现类)。2. 收集配置类的方法调用,再通过,借助读取所有 Jar 包META-INF/spring.factories 中对应的配置类。3. 筛选生效类。

2025-08-22 19:39:08 879

原创 Spring 中 @Import 注解:Bean 注入的灵活利器

用法特点典型应用导入普通类简单直接,适合快速注册整合第三方类导入配置类批量注册,适合模块化配置配置类拆分与组合导入 ImportSelector 实现类动态选择,合适条件注册Spring Boot 自动配置导入 ImportBeanDefinitionRegistrar 实现类编程控制,适合复杂注册逻辑自定义注解驱动开发@Import 注解作为 Spring 中灵活的 Bean 注册工具,提供了从简单到复杂的多种 Bean 导入方式。

2025-08-22 18:53:49 885

原创 Spring 循环依赖:从 “死锁” 到 “破局” 的完整解析

想象这样一个场景:小明要组装一台电脑,他需要先有主板才能安装 CPU;而小红负责装主板,却坚持要先看到 CPU 才能确定主板型号。两人互相等待对方的 “半成品”,结果电脑永远装不起来 —— 这就是生活中的 “循环依赖”。当两个或多个 Bean 形成相互依赖的闭环时,就会产生循环依赖。BeanA 需要 BeanB 才能完成初始化而 BeanB 同时也需要 BeanA 才能完成初始化就像两个人面对面站着,都想让对方先迈出一步,最终陷入僵持。

2025-08-21 22:44:59 908

原创 深度解析 Spring Bean 生命周期

本文深入解析了Spring框架中Bean生命周期的完整流程,涵盖从定义到销毁的六大关键阶段。首先通过BeanDefinition加载创建Bean的"蓝图",然后通过构造函数或工厂方法实例化对象,接着进行属性注入(Setter或构造函数方式)。初始化阶段包含Aware接口回调、后置处理器增强、自定义初始化逻辑等步骤。Bean投入使用后,容器关闭时执行销毁逻辑释放资源。文章通过代码示例详细展示了每个阶段的具体实现方式,帮助开发者全面理解Spring容器的运作机制,为复杂场景下的问题排查和自定

2025-08-18 00:01:08 1126 2

原创 MyBatis 全解析:从入门到实战,掌握 Java 持久层框架核心

在 MyBatis 操作数据库的过程中,“加载主配置文件 → 创建 SqlSession → 获取 Mapper” 是核心初始化流程,支撑后续所有数据库操作。​通过 “构建器 → 工厂 → 会话 → 代理” 的分层设计,解耦配置解析、连接管理、SQL 执行等职责,既保证灵活性(可扩展配置、插件),又简化开发(开发者只需关注 Mapper 接口)。SqlSessionFactory 全局单例:减少资源消耗,Spring 整合时由框架自动管理。

2025-08-10 13:41:45 990

原创 实战:MyBatis 中 db.properties 的正确配置与最佳实践

在 MyBatis 框架中,数据库配置的管理方式直接影响项目的可维护性和灵活性。本文将通过具体代码示例,详细讲解如何使用 db.properties 实现数据库配置的解耦管理,并对比传统硬编码方式的优劣。

2025-08-09 20:05:28 401

原创 JVM(Java Virtual Machine,Java 虚拟机)超详细总结

JVM是 Java 程序的运行基础环境,是 Java 语言实现“一次编写,到处运行”概念层面JVM 是一种抽象的计算机规范, 它定义了字节码文件的执行环境,提供了一套虚拟的硬件架构,包括指令集、寄存器组、栈、堆、方法区等。在这个虚拟环境中,Java 字节码可以被解释或编译成机器码并执行, 就如同真实的计算机硬件执行机器指令一样。作用表现。

2025-08-05 19:18:56 1029

原创 AQS原理及流程简述

AQS 的核心逻辑可概括为:“状态判断→资源获取 / 释放→队列管理→线程阻塞 / 唤醒”通过模板方法(acquire/release)定义流程,子类只需实现tryAcquire/tryRelease等抽象方法即可自定义同步逻辑,极大简化了锁和同步器的实现。(“模板方法” 指的是 AQS 框架已经预先定义好了同步操作的整体流程(骨架),而将流程中需要自定义的具体逻辑(如 “如何获取资源”“如何释放资源”)延迟到子类中实现。

2025-07-29 18:46:26 726

原创 Java 并发编程:深入理解 ReadWriteLock 读写锁

读锁(共享锁):允许多个线程同时获取和持有写锁(排他锁):只允许一个线程获取和持有这种设计特别适合 "读多写少" 的场景,能在保证线程安全的同时显著提升并发性能。ReadWriteLock 通过区分读写操作,在保证线程安全的同时,极大地提高了读多写少场景下的并发性能。它是 Java 并发包中一个非常实用的工具,合理使用能显著提升系统性能。与普通的 synchronized 关键字或 ReentrantLock 相比,ReadWriteLock 为特定场景提供了更精细的控制和更高的并发度。

2025-07-22 19:53:49 602

原创 Java ThreadLocal(从原理到实战)

ThreadLocal 被称为线程局部变量,用于在线程中保存数据。由于在 ThreadLocal 中保存的数据仅属于当前线程,所以该变量对于其他线程而言是隔离的,也就是说该变量是当线程独有的变量。ThreadLocal 用于在同一线程间,在不同的类和方法之间共享数据的场景,也可以用于在不同线程间隔离数据的场景。单 ThreadLocal 场景:用 Thread 作键看似可行,但无实际意义(ThreadLocal 本身的设计更简洁、内聚)。

2025-07-22 15:21:06 986

原创 Java线程池简述

线程池是一种管理和复用线程的机制,避免了频繁创建和销毁线程带来的性能开销。运行期间,线程池维护若干个线程,等待任务提交并执行。没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就会分配一个空闲线程执行。如果所有核心线程都处于忙碌状态,线程池会将任务放入工作队列中等待或者创建一个新的非核心线程进行处理。/***/该方法用于接收一个Runnable类型的任务,并安排这个任务在某个线程中执行。

2025-07-21 11:53:58 1126

原创 线程池流程

在线程池中,当任务提交时若线程池已满(核心线程、队列、最大线程均达上限),会触发拒绝策略。:让提交任务的线程(调用者线程)自己执行该任务。这样会减缓任务提交速度,间接给线程池缓冲时间,但可能阻塞调用者的其他操作。:直接丢弃当前提交的任务,不做任何处理,也不抛出异常。任务提交者无法感知任务已被丢弃,适用于可容忍任务丢失的场景。异常,阻止任务提交,由调用者处理该异常。这是线程池的默认拒绝策略,会明确告知任务提交失败。:丢弃队列中最旧的未处理任务,并尝试重新提交当前被拒绝的任务。

2025-07-17 19:31:09 372

原创 深入浅出 Java AtomicInteger:从原理到实战

本文通过一个对比实验,深入探讨了 Java 中的工作原理和使用场景。与传统的同步方式相比,提供了更高效的原子操作,特别适合在多线程环境下对共享变量进行频繁更新的场景。在使用时,我们需要注意 ABA 问题和性能考虑,根据具体场景选择合适的同步方式。掌握的使用,将有助于你编写更高效、更安全的多线程程序。希望本文对你理解 Java 中的原子类有所帮助!如果你有任何疑问或建议,欢迎留言讨论。

2025-07-15 19:13:34 1013

原创 进程具有资源独立性,即进程间并不共享资源;但进程之间又能进行通信,而通信的目的似乎就是为了共享某些资源 —— 应该如何理解呢?

资源独立性是进程的默认状态,是操作系统隔离进程、保证系统稳定的基础。进程间通信是在独立性基础上,为了实现协作而设计的 “特殊通道”,其目的是在不破坏隔离性的前提下,实现有限、可控的信息交换。进程的资源独立是 “常态”,通信是 “特例”—— 正因为资源不共享,才需要通信机制;而通信的存在,正是为了在保持独立性的同时,解决进程间协作的需求。

2025-07-14 19:01:15 349

原创 类型溢出(Java)

类型溢出(Type Overflow)是编程中常见的问题,指变量存储的数据超出了其数据类型所能表示的范围。就像往杯子里倒水,当水超过杯子的容量时就会溢出,计算机中的变量也是如此。

2025-04-02 19:52:33 828

原创 荷兰国旗问题(Java)

这个方法需要注意的就是:当 nums[index] == 2 时,不应该增加 index,因为交换后的 nums[index] 的值可能是 0 或 1,需要再次检查。荷兰国旗问题(Dutch National Flag Problem)要求将一个包含。方法3:快速排序的变种(Partition)根据计数重新填充数组。

2025-04-01 20:45:37 338

原创 Java中的二分查找

这道题应该是最常见的有关二分查找的例题,其中比较重要的点就是:1、静态方法怎么调用非静态方法,代码中的注释也出了答案。这段代码通过遍历二维数组的每一行,并在每一行中使用二分查找来高效地查找目标值。由此可见使用无符号右移运算符“>>>”,即使发生了类型溢出也不影响后续结果的正确与否。通过选择合适的起始点和移动方向,可以确保不会错过任何可能的区域,同时避免不必要的搜索。选择起始点:可以从左下角或右上角开始,因为这两个位置可以同时利用行和列的有序性。关于上面的代码还有另一种写法,并返回目标值的下标。

2025-03-26 20:17:37 840

原创 《ArrayList核心代码阅读》

else {!i < size;i++)return i;} else {i < size;i++)return i;return -1;i >= 0;i--)

2025-02-15 10:35:34 1021

原创 《Integer缓存池》

在Integer类的源代码中,缓存池的实现是通过一个内部类IntegerCache来完成的。以下是IntegerCachestatic {= null) {try {high = h;k++)Integer缓存池是Java中一个重要的优化机制,它通过预先创建并缓存一定范围内的Integer对象,减少了内存开销和对象创建的开销。通过Integer.valueOf(int i)方法,我们可以充分利用这个缓存池,提升程序的性能。理解Integer。

2025-02-14 11:01:57 953

原创 == 和 equals() 的区别

2、引用数据类型如果没有重写 equals() 方法,会默认自动调用父类 Object 类中的 equals() 方法,该方法仍然采用 == 运算符实行内存地址的比较,所以,引用数据类型一般都需要重写 equals() 方法,用于实现值或内容的比较。1、只有引用类型才可以使用 equals() 方法,基本数据类型·不能使用 equals() 方法;java.lang.String类中的 equals() 方法。java.lang.Object类中的 equals() 方法。

2025-02-12 08:37:40 222

原创 Abstract 抽象类

在 Java 中,抽象类是使用 abstract关键字修饰的类。抽象类是一种特殊的类,它的主要特点是不能被实例化,即不能使用new关键字创建抽象类的对象。抽象类是 Java 中面向对象编程的一个重要概念,它提供了一种介于普通类和接口之间的结构。通过抽象类,可以为一组相关的类提供一个共同的基础,同时允许不同的子类以自己的方式实现抽象方法,既实现了代码的复用和共享,又保证了子类实现的灵活性和多样性,使得代码更具可维护性和可扩展性。

2025-01-22 14:12:43 645

原创 Static关键字

被static修饰的成员属于类本身,而不是类的某个特定实例。这意味着可以在没有创建类的对象的情况下访问这些成员。

2025-01-21 19:57:31 793

原创 在Java中什么是异常

异常(Exception)是在程序执行过程中出现的意外或错误情况。可以通过继承Exception(用于检查型异常)或(用于运行时异常)类来创建自己的异常类。这在需要根据特定的业务逻辑定义异常情况时非常有用。

2025-01-20 17:57:00 963

原创 浮点数精度丢失问题

浮点数精度丢失问题:某些十进制小数在二进制中是无限循环小数,如0.1,会导致存储和计算时的精度丢失。设置转换时的精度只能避免无限循环的计算,但无法解决存储位数有限导致的精度丢失。使用高精度计算库(如BigDecimal)可以缓解浮点数的精度丢失问题。总之,浮点数精度丢失是由于存储位数有限导致的,在涉及精确计算时,需要考虑使用高精度数据类型或计算库,而不是仅仅依靠设置转换精度。

2025-01-19 20:30:50 1053 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除