- 博客(118)
- 收藏
- 关注
原创 Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Logback 是 Log4j 创始人设计的另一个开源日志组件,作为 Log4j 的改良版本,它具有更快的执行速度、更丰富的配置选项以及更好的性能。其中,logback-core 是其他两个模块的基础模块,logback-classic 是 Log4j 的一个改良版本,并且它完整实现了 SLF4J API,这意味着你可以很方便地在使用 SLF4J 的项目中使用 Logback。不过,与其他专门的日志框架相比,它的功能相对较为基础,配置和扩展性方面可能稍显不足。在这个示例中,使用了 SLF4J 的。
2025-03-31 20:54:46
408
原创 JVM的核心结构和垃圾回收机制还有引用类型
内存溢出是指程序在申请内存时,没有足够的内存空间供其使用。内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
2025-03-26 21:02:16
756
原创 解决hash冲突的办法有哪些?HashMap用的哪种?
当发生哈希冲突时,新的键值对会被添加到对应链表的末尾(在 Java 8 及以上版本中,为了保持插入顺序,会在链表头部添加,但最终可能会转换为红黑树)。具体来说,哈希表的每个位置都指向一个链表,当发生哈希冲突时,将新的键值对添加到该链表的末尾。建立一个公共的溢出区,当哈希表中某个位置发生冲突时,将冲突的键值对存储在溢出区中。开放定址法的基本思想是,当发生哈希冲突时,按照某种固定的方式在哈希表中寻找下一个空闲的位置来存储发生冲突的键值对。例如,当发生冲突时,探测的位置为。当发生冲突时,探测的位置为。
2025-03-25 17:21:00
318
原创 什么是Java序列化?什么情况下需要使用序列化
Java序列化是指将Java对象转换为字节序列的过程,这样做的目的是为了能够将对象的状态存储起来或者传输到其他地方。反过来,把字节序列恢复成Java对象的过程就叫做反序列化。要使一个Java对象可序列化,其类需要实现接口。这个接口是一个标记接口,没有定义任何方法。通过实现这个接口,Java虚拟机(JVM)就知道这个对象是可以被序列化的。
2025-03-25 17:17:56
536
原创 Spring Bean的生命周期(完整流程)
作用:在 Spring 配置文件(如 XML 配置文件)或使用注解(如@Component@Service等)定义 Bean 的元信息,包括 Bean 的类名、作用域、依赖关系等。示例@Service// 类的具体实现作用:可以通过注解或在 XML 配置中指定属性来定义自定义的初始化方法。示例// 自定义初始化操作作用:可以通过注解或在 XML 配置中指定属性来定义自定义的销毁方法。示例// 自定义销毁操作。
2025-03-22 10:35:21
619
原创 简述Mybatis的插件运行原理,以及如何编写一个插件?
MyBatis 在创建这些核心对象时,会判断是否存在针对该对象的拦截器,如果存在,就会使用 JDK 动态代理为该对象创建代理对象。当调用核心对象的方法时,实际上是调用代理对象的方法,代理对象会在方法执行前后插入拦截器的逻辑。当调用核心对象的方法时,请求会依次经过每个插件的拦截器,每个拦截器可以对请求进行预处理、执行目标方法、后处理等操作,然后将请求传递给下一个拦截器,直到所有拦截器都处理完毕。通过以上步骤,你就可以编写一个简单的 MyBatis 插件,并将其集成到 MyBatis 项目中。
2025-03-21 20:59:38
404
原创 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
MyBatis 可以执行一对一、一对多的关联查询,下面为你详细介绍实现方式及区别。
2025-03-21 20:54:57
433
原创 AJAX的理解和原理还有概念
你想问的可能是,它并不是一门新的编程语言,而是一种在无需重新加载整个网页的情况下,能够与服务器进行异步通信并更新部分网页的技术。
2025-03-19 20:39:42
946
原创 HashMap的理解和原理
HashMap的核心结构是一个数组,数组中的每个元素被称为一个桶(bucket)。每个桶可以存储一个链表或一棵红黑树,用于处理哈希冲突。当一个键值对被插入到HashMap中时,首先会根据键的哈希值计算出它应该存储在数组中的位置(桶的索引)。如果该位置已经有其他元素(即发生了哈希冲突),则会根据具体情况将新元素添加到链表或红黑树中。HashMap通过哈希函数和数组、链表、红黑树的结合,实现了高效的键值对存储和查找。在大多数情况下,HashMap。
2025-03-17 21:02:49
488
原创 垃圾回收机制的作用和他的原理
垃圾回收机制是 Java 自动内存管理的核心,通过可达性分析、分代策略和多种算法的组合,高效回收不再使用的内存。理解其原理有助于优化 JVM 参数(如)、排查内存泄漏问题,以及设计更高效的 Java 应用。
2025-03-15 11:59:38
362
原创 JVM的各种细节
内存溢出是指程序在申请内存时,没有足够的内存空间供其使用。内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
2025-03-14 20:39:15
880
原创 垃圾回收机制是什么 ?JVM 核心结构?
jvm的垃圾回收机制是GC(Garbage Collection),也叫垃圾收集器。GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。2. 软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)1. 强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)3. 弱引用:在GC时一定会被GC回收。
2025-03-13 11:32:55
314
原创 线程的死亡状态
线程的死亡状态(Terminated State)是线程生命周期中的最后一个阶段,表示线程已经完成执行或被强制终止,无法再恢复运行。方法可以强制终止线程,但该方法已被弃用,因为它可能导致数据不一致或资源泄漏(如未释放的锁、未关闭的文件句柄等)。方法中抛出未捕获的异常(Uncaught Exception),线程会因异常终止而死亡。块中释放资源(如数据库连接、文件流等),确保线程死亡后资源正常回收。捕获异常,避免因未处理的异常导致线程意外终止。语句或方法体结束),线程会自然死亡。处于死亡状态的线程不能通过。
2025-03-12 20:55:23
165
原创 怎么理解线程是什么?
线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程可以并发执行不同的任务,共享进程的资源,如内存空间、文件句柄等。
2025-03-11 20:31:01
355
原创 Array和ArrayList有什么不一样?
Array(数组):数组是 Java 语言内置的数据结构,是一种存储相同类型元素的连续内存空间。在创建数组时,需要明确指定其数据类型和大小,这使得数组在内存中占据的空间是固定的,就像一排预先设定好数量的停车位,每个停车位只能停放特定类型的 “车”(即元素)。ArrayList:ArrayList 是 Java 集合框架中的一个类,属于动态数组。它是基于数组实现的,但提供了更高级的功能和更灵活的使用方式。ArrayList 就像是一个可以根据需要不断扩建的停车场,不需要在创建时就确定最终的大小。
2025-03-10 20:35:35
777
原创 什么是依赖注入DI,依赖注入的方式有几种,各是什么?
依赖注入是一种设计模式,它是控制反转(Inversion of Control,IoC)的一种具体实现方式。在传统的编程中,对象通常会自己创建或管理其依赖的对象,而在依赖注入模式下,对象的依赖关系由外部容器负责创建和注入,对象本身只负责使用这些依赖,这样就将对象的创建和使用分离开来,提高了代码的可维护性、可测试性和可扩展性。举个简单的例子,假如有一个类需要使用类来进行用户数据的操作。在没有使用依赖注入时,可能会自己创建对象:而使用依赖注入后,的依赖对象。
2025-03-06 11:47:44
1303
原创 Spring 中哪些情况下,不能解决循环依赖问题?
3.单例代理 Bean 通过 setter 注入:代理 Bean 在初始化时可能已经被包装,提前暴露的是代理对象,而 setter 注入时可能需要目标对象,导致循环依赖问题。2.构造器需要对象完全初始化,而循环依赖中对象 A 和 B 互相依赖对方的构造参数,导致无法实例化,所以无法解决。多例 Bean 每次请求都会创建新实例,Spring 不会缓存它们,因此无法提前暴露引用,导致循环依赖无法解决。3.单例的代理 Bean 通过 Setter(塞得) 注入的情况,不能解决循环依赖问题。
2025-03-05 20:38:32
347
原创 MyBatis的一级、二级缓存
通常,在查询多、增删改少,且用户对查询结果实时性要求不高的场景中,可利用 MyBatis 二级缓存减少数据库访问,提升访问速度。
2025-03-04 20:31:21
341
原创 Spring 中哪些情况下,不能解决循环依赖问题?
在 Spring 框架里,循环依赖是指多个 Bean 之间相互依赖形成一个闭环。Spring 利用三级缓存机制能解决大部分单例 Bean 的循环依赖问题,但在某些特定情形下,循环依赖问题依旧无法解决,下面为你详细阐述这些情况。
2025-03-03 20:19:51
802
原创 Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?
循环依赖指的是多个 Bean 之间相互依赖,形成一个闭环。例如,Bean A 依赖 Bean B,而 Bean B 又依赖 Bean A。在创建 Bean 的过程中,如果没有合适的处理机制,就会出现创建 Bean 时陷入无限循环的问题。
2025-02-28 20:47:19
414
原创 如何理解线程安全问题
线程安全是指当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。简单来说,就是在多线程环境下,代码能够正确地执行,不会出现数据不一致、数据丢失、程序崩溃等问题。
2025-02-27 14:33:14
390
原创 Spring Bean的生命周期
包含了 Bean 定义的各种信息,如对应的 Class、作用域(scope,如 singleton、prototype )、是否延迟初始化(lazy)、依赖关系(depend on)、是否为自动注入候选者(autowire candidate)、是否为主要候选者(primary)等。注解标注的方法 ),Spring 容器会调用这些方法,释放 Bean 占用的资源,如关闭数据库连接、释放文件句柄等,完成 Bean 的销毁。,进行合并操作,确保最终使用的是完整且正确的 Bean 定义信息。信息进行进一步处理。
2025-02-26 19:31:06
952
原创 Spring MVC的执行流程步骤
Spring MVC 执行流程中的每个步骤都可以进行定制和扩展,开发者可以根据具体的需求,在不同的环节插入自定义的逻辑,如拦截器、自定义的 HandlerAdapter、ViewResolver 等,以实现更灵活和强大的功能。
2025-02-25 20:31:02
518
原创 Spring和MyBatis原理和核心
Spring 和 MyBatis 是 Java 开发中非常重要的两个框架,以下是它们的原理和核心:resultMapifchoosewheresetSqlSessionselectOneselectListinsertupdatedeleteSqlSession。
2025-02-24 20:30:50
886
原创 什么是Spring IOC
Spring中的IoC(Inversion of Control,控制反转)是Spring框架的核心之一,它用于解耦应用程序中的各个部分,使得对象的创建和依赖关系不再由程序代码直接控制,而是交由Spring容器来管理。在Spring中,IoC是通过Bean容器实现的,通常是通过配置文件(XML配置)或者注解来定义和管理Bean。下面,我们分别从XML配置和注解配置两个角度详细讲解Spring的IoC机制。Spring的XML配置方式是最传统的IoC配置方式,通过XML文件来定义和管理Bean。Spring容
2025-02-22 08:35:07
565
原创 Spring AOP的原理是什么
通过动态代理、织入时机的选择以及切点和通知的定义,Spring AOP 能够在不修改目标对象代码的情况下,灵活地为目标对象添加横切关注点的功能,实现了业务逻辑和切面逻辑的分离,提高了代码的可维护性和可扩展性。
2025-02-22 08:30:21
866
原创 Spring中事务的传播行为有哪些?
在 Spring 框架里,事务传播行为用于定义在嵌套事务场景下,新事务与现有事务之间的交互方式。Spring 定义了 7 种事务传播行为,这些行为由枚举类提供。
2025-02-20 11:14:11
859
原创 springboot的双亲委派
这个模型规定,当一个类加载器加载一个类时,它首先将加载请求委派给父类加载器处理,只有当父类加载器无法完成这个加载请求时,才由子类加载器自身来加载该类。回退加载:如果引导类加载器无法加载该类,则回退到它的子类加载器(扩展类加载器),尝试加载,依此类推。类加载请求:当一个类加载器(子类加载器)收到类加载请求时,它首先不会自己尝试去加载这个类,而是将请求委派给它的父类加载器。类加载:引导类加载器尝试加载该类,如果加载成功,则返回该类的 Class 对象。
2025-02-19 20:45:29
295
原创 索引的理解
可以快速定位到范围内的数据。使用联合索引:通过联合索引可以减少索引的数量,同时提高查询效率。B树索引:最常用的索引类型,适用于范围查询和精确查询。范围查询:B树索引和B+树索引支持范围查询,可以通过索引快速定位范围内的数据。覆盖索引:如果查询的列都在索引中,可以直接通过索引返回结果,避免回表操作。索引的存储开销:索引会占用额外的存储空间,需要合理规划索引的数量和大小。空间索引:用于地理空间数据的索引,支持空间查询,如点、线、面的查询。优化索引:根据查询计划优化索引,例如调整索引列的顺序或添加新的索引。
2025-02-18 18:42:56
225
原创 Spring
通知(Advice):切面在某个特定连接点(Joinpoint)上执行的动作,包括前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)、异常通知(After - throwing Advice)和最终通知(After - finally Advice)。Spring 是一个开源的轻量级 Java 开发框架,它为企业级 Java 应用开发提供了全面的解决方案,极大地简化了 Java 应用的开发过程,提高了开发效率和代码的可维护性。
2025-02-17 20:24:22
311
原创 多线程的理解
线程池维护了一个线程队列,当有任务到来时,从线程池中获取一个空闲线程来执行任务,任务完成后,线程不会被销毁,而是返回线程池等待下一个任务。常见的线程池实现有 Java 中的 ThreadPoolExecutor 类,通过合理配置线程池的参数,如核心线程数、最大线程数、队列容量等,可以优化线程池的性能,提高系统的并发处理能力。例如,在一个图形界面应用程序中,一个线程可以负责处理用户界面的交互,另一个线程可以负责数据的加载和处理,这样可以避免界面卡顿,提升用户体验。为了解决这个问题,需要进行线程同步。
2025-02-15 19:34:13
346
原创 MySQL 支持的事务隔离级别
幻读是指在一个事务中,多次执行相同的查询,却得到不同的结果,因为在查询期间其他事务插入了新的数据。例如,事务 A 查询某条件下的数据列表,事务 B 在该条件下插入了新数据并提交,当事务 A 再次查询时,会发现多了一些数据。引发的问题:解决了脏读问题,但在同一事务中多次读取相同数据时,可能会因为其他事务的提交而得到不同结果,产生不可重复读(Non - Repeatable Read)问题。例如,事务 A 先读取了某条数据,然后事务 B 修改并提交了这条数据,当事务 A 再次读取时,得到的数据与第一次不同。
2025-02-14 20:18:21
405
原创 详细的讲解mybtis中动态标签有哪些和他的作用
MyBatis 提供了丰富的动态标签,这些标签能让开发者根据不同的条件动态生成 SQL 语句,极大地增强了 SQL 语句的灵活性和可维护性。
2025-02-13 10:55:44
276
转载 vue2与vue3的区别
Composition API 是 Vue3 引入的一种新的编程方式,它允许开发者将相关的逻辑和状态组织在一起,而不是像 Vue2 那样分散在组件的 data、methods、computed 等选项中。Vue3 在保持 Vue2 优点的基础上,进行了大量的优化和改进,为开发者提供了更加灵活、高效和强大的开发体验。而 Vue3 采用了 Proxy 和 Reflect API,能够监听对象的所有操作,无论是属性的读取、设置,还是对象的增删,都能被 Proxy 捕获并处理。Vue3 在性能方面进行了多项优化。
2025-02-13 08:35:37
775
原创 一条sql执行流程
SQL 查询的执行过程分为解析、查询重写、查询规划、查询执行和结果返回五个主要步骤。排序(Sort)和分组(Group):如果查询要求对数据进行排序(ORDER BY)或分组(GROUP BY),执行器会在获取数据后进行这些操作。连接(Join):如果查询涉及多个表,执行器会根据选择的连接算法(如嵌套循环连接、哈希连接)对这些表的数据进行连接处理。词法分析:首先,SQL 语句被分解为单独的词法单元(tokens),如关键字、表名、列名、操作符等。语义分析:如果语法检查通过,系统会进行语义分析。
2025-02-11 20:56:44
465
原创 vue2存储数据方法
localStorage:可长期存储数据,除非用户清楚localStorage信息,否则数据会一直存在。在浏览网页时我们有些时候需要记住一些用户选择的信息,比如登陆时我们如果选择了记住密码,那么我们下次进入该网页时就会有你上次的登陆信息。vuex存储的数据会在页面刷新后被移除,但本地存储的数据却不会。sessionStorage:短期存储数据,用户关闭标签页后或直接关闭浏览器后数据会清空。在网站开发中,我们可能会遇到左边是列表,右边显示内容的页面,当我们切换页面再返回的时候,需要记住我们上次选择的列表项。
2025-02-10 17:03:52
257
原创 深入学习Spring
通知(Advice):切面在某个特定连接点(Joinpoint)上执行的动作,包括前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)、异常通知(After - throwing Advice)和最终通知(After - finally Advice)。Spring 是一个开源的轻量级 Java 开发框架,它为企业级 Java 应用开发提供了全面的解决方案,极大地简化了 Java 应用的开发过程,提高了开发效率和代码的可维护性。
2025-02-07 09:02:56
383
原创 深入学习索引
可以快速定位到范围内的数据。使用联合索引:通过联合索引可以减少索引的数量,同时提高查询效率。B树索引:最常用的索引类型,适用于范围查询和精确查询。范围查询:B树索引和B+树索引支持范围查询,可以通过索引快速定位范围内的数据。覆盖索引:如果查询的列都在索引中,可以直接通过索引返回结果,避免回表操作。索引的存储开销:索引会占用额外的存储空间,需要合理规划索引的数量和大小。空间索引:用于地理空间数据的索引,支持空间查询,如点、线、面的查询。优化索引:根据查询计划优化索引,例如调整索引列的顺序或添加新的索引。
2025-02-07 09:01:44
333
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人