
2025 Java面试系列
文章平均质量分 86
冰糖心书房
Hi:欢迎来到"冰糖心书房",人个目前就职于一家外企业500强公司担任架构师一职,在这里我会着重分享我多年来在Java开发领域的实战经验和心得体会。从企业级项目架构设计、高并发处理到微服务架构的落地实施。
展开
-
Spring 循环依赖是如何处理的?
因为构造器注入要求在创建对象时就必须传入所有依赖,如果存在循环依赖,A 的构造方法需要 B 的实例,B 的构造方法又需要 A 的实例,这会导致无限递归,无法创建任何一个对象。Spring 通过“三级缓存”机制,巧妙地解决了 Setter 方法注入和字段注入的循环依赖问题。Spring 使用“三级缓存”来解决 Setter 方法注入和字段注入的循环依赖。作用域的 Bean 每次获取都会创建一个新的实例,Spring 不会对。Bean 进行缓存,因此无法通过提前暴露的方式解决循环依赖。原创 2025-03-31 16:38:02 · 1225 阅读 · 0 评论 -
Spring 依赖注入是如何实现的?
Spring 依赖注入(Dependency Injection,DI)是 Spring 框架的核心特性之一,它负责管理对象之间的依赖关系,降低了代码的耦合度,提高了代码的可测试性和可维护性。Spring 通过多种方式实现依赖注入,包括构造器注入、Setter 方法注入和字段注入。底层原理是基于反射和。Spring 通过“三级缓存”机制解决了 Setter 方法注入和字段注入的循环依赖问题。原创 2025-03-29 13:19:24 · 698 阅读 · 0 评论 -
Spring FactoryBean 是如何工作的? 它与普通 Bean 有什么区别? 它适用于哪些场景?
是 Spring 框架中一个非常重要的接口,它为 Spring IoC 容器提供了更灵活的对象创建方式。方法,允许我们在开发过程中自定义对象的创建逻辑,从而实现了更灵活的对象创建和管理。是 Spring 框架提供的一种强大的对象创建机制。原创 2025-03-28 10:05:55 · 371 阅读 · 0 评论 -
Spring SecurityFilterChain 的作用
当一个请求到达时,它会依次经过 Filter Chain 中的每个 Filter 进行处理。内部是由一系列预定义的 Spring Security Filter 组成的,这些 Filter 各司其职,共同完成安全处理。是 Spring Security 的核心,它定义了一个安全过滤器链,负责对 HTTP 请求进行全面的安全处理,包括身份认证、权限校验、防止 Web 攻击等。它负责将一系列 Spring Security 提供的 Filter 组织起来,形成一个安全处理流程。注解的类) 中创建一个或多个。原创 2025-03-28 09:41:10 · 904 阅读 · 0 评论 -
MyBatis ResultSetHandler支持哪些结果映射方式? 如何处理一对一、一对多、多对多关系?
在 MyBatis 中提供了强大的结果映射能力,支持多种灵活的结果映射方式,以适应各种复杂的数据库查询结果到 Java 对象的转换需求。提供的这些灵活的结果映射方式,使得 MyBatis 能够处理各种复杂的数据库查询结果,并将数据库数据高效、准确地转换为 Java 对象,满足各种应用场景的需求。最基本的结果映射方式,适用于单表查询,将结果集中的列直接映射到 Java 对象的简单属性。元素的配置,处理一对一关联关系。元素的配置,处理一对多或多对多关联关系。实现了根据数据内容动态选择映射规则的多态映射。原创 2025-03-27 09:59:22 · 306 阅读 · 0 评论 -
BeanFactoryPostProcessor和BeanPostProcessor在 Bean 生命周期中的作用是什么
是 Spring 框架提供的两个重要扩展点,它们在 Bean 生命周期的不同阶段允许开发者对其进行定制。在 Bean 定义加载完成之后、Bean 实例化。, Spring 会根据它们的顺序(在 Bean 实例化、属性填充。,但在 Bean 初始化方法执行。,Spring 会根据它们的顺序(本身以及 Bean 定义 (原创 2025-03-26 11:17:51 · 441 阅读 · 0 评论 -
Spring BeanFactoryPostProcessor 和 BeanPostProcessor有什么用?
都是 Spring 框架中非常重要的扩展点,我们在开发中可以利用 Spring 容器实例化 Bean、配置 Bean 以及初始化 Bean 的过程中进行自定义的干预。是 Spring 框架中两个非常重要的扩展点,它允许我们在开发过程中对 Bean 生命周期的不同阶段进行自定义的干预。的增强版,可以从多个属性源(例如,环境变量、系统属性、配置文件等)中解析占位符。用于属性占位符替换,可以将配置文件中的占位符(例如,主要用于修改 Bean 实例或执行自定义的初始化逻辑。,Spring 会根据它们的顺序(原创 2025-03-25 13:51:17 · 778 阅读 · 0 评论 -
Mybatis 的运行原理?
MyBatis 通过动态代理、反射、类型转换、缓存等技术,实现了 SQL 语句与 Java 代码的解耦,简化了数据库访问操作。、创建执行器、创建语句处理器、创建参数处理器、执行 SQL 语句、创建结果集处理器、结果映射、返回结果、提交/回滚事务、关闭。、获取 Mapper 接口代理对象、执行 Mapper 接口方法、查找。MyBatis 的运行原理可以概括为:加载配置、构建。原创 2025-03-25 10:16:32 · 911 阅读 · 0 评论 -
Spring 如何调用 Bean 的初始化方法和销毁方法?
Spring 提供了多种方式来指定和调用 Bean 的初始化方法和销毁方法,包括。原创 2025-03-24 15:08:57 · 1350 阅读 · 0 评论 -
MySQL InnoDB行锁等待时间是怎么引起的?
InnoDB行锁等待时间是指在 MySQL 的 InnoDB 存储引擎中,当一个事务尝试获取某一行数据的行锁时,如果该行已经被其他事务持有排他锁(Exclusive Lock,X-lock)或共享锁(Shared Lock,S-lock),那么这个事务就必须等待,直到持有锁的事务释放锁为止。InnoDB 行锁等待时间是由多种因素综合作用造成的,诊断和解决行锁等待问题通常需要结合监控、日志分析、SQL 优化和数据库配置调整等多种手段。InnoDB 行锁等待时间会直接影响数据库的并发性能。原创 2025-03-24 10:19:58 · 1316 阅读 · 0 评论 -
MyBatis ResultSetHandler 是如何将数据库返回的结果集转换为 Java 对象的?
的角色,它的核心职责是将 JDBC 驱动程序返回的。进行简单的自动映射。MyBatis 默认只提供了一个。在 MyBatis 中扮演着。(数据库结果集) 转换为。原创 2025-03-24 09:08:23 · 450 阅读 · 0 评论 -
JVM 类加载器之间的层次关系,以及类加载的委托机制
JVM 类加载器之间存在层次关系(启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器),并通过双亲委派模型协同工作。双亲委派模型保证了类加载的顺序和安全性,避免了类的重复加载,并防止了核心类库被篡改。在某些特殊情况下,可能需要破坏双亲委派模型(例如,SPI、OSGi、热部署)。这种层次关系和委托机制是 Java 类加载机制的核心,对于保证 Java 程序的安全性和避免类冲突至关重要。JVM 类加载器之间存在一种层次关系,通常被称为。启动类加载器没有父类加载器,它会直接尝试加载。原创 2025-03-23 17:59:07 · 935 阅读 · 0 评论 -
Spring 如何管理 Bean 的生命周期?
来管理 Bean 的整个生命周期,从 Bean 的创建到销毁的每一个阶段都由容器控制和协调。Spring 提供了多种机制来允许我们在开发过程中介入 Bean 的生命周期,执行自定义的逻辑。Spring 通过其 IoC 容器来管理 Bean 的整个生命周期,从 Bean 的创建到销毁的每一个阶段都由容器控制。等机制,允许我们在开发过程中介入 Bean 的生命周期,执行自定义的逻辑。(仅当容器关闭, 且Bean的作用域是singleton时)Spring 通过其 IoC 容器(、Aware 接口、原创 2025-03-23 15:08:16 · 696 阅读 · 0 评论 -
MyBatis ParameterHandler支持哪些参数类型? 如何处理 # 和 $ 占位符?
因为参数值是直接拼接在 SQL 语句中的,如果参数值包含恶意的 SQL 代码,就可能导致 SQL 注入攻击。的参数绑定机制设置的,而不是直接拼接在 SQL 语句中,避免了 SQL 注入的风险。支持各种不同的 Java 参数类型,并且能够根据不同的参数类型和占位符类型 (,因为数据库可以预编译 SQL 语句,并复用执行计划。特别是在需要传递参数值的情况下,必须使用。会将传入的 Java 参数值 (例如。转换为 JDBC 类型的值,并通过。,理解它们的区别至关重要。) 进行相应的处理。原创 2025-03-23 10:20:19 · 689 阅读 · 0 评论 -
Spring Bean 的生命周期是怎样的?
Spring Bean 的生命周期是指从 Bean 的创建到销毁的整个过程,这个过程由 Spring IoC 容器管理。理解 Bean 的生命周期可以帮助我们在控制 Bean 的初始化和销毁行为,以及在 Bean 生命周期的不同阶段执行自定义逻辑。(仅当容器关闭, 且Bean的作用域是singleton时)原创 2025-03-22 14:04:56 · 594 阅读 · 0 评论 -
MyBatis ParameterHandler 是如何将 Java 对象转换为 SQL 语句中的参数的?
它封装了参数绑定的复杂性,使得 MyBatis 的其他组件 (例如。MyBatis 默认只提供了一个。) 无需关心具体的参数绑定细节。在 Mybatis中。原创 2025-03-22 11:02:22 · 1017 阅读 · 0 评论 -
Nacos 项目是如何实现模块化的?各个模块之间有什么依赖关系?
Nacos 项目采用模块化的方式进行组合,这使得代码结构清晰、易于维护和扩展。这种模块化的设计使得 Nacos 易于理解、维护、扩展和测试,是构建大型复杂系统的有效方法。Maven 负责管理模块之间的编译依赖、运行时依赖,以及第三方库的依赖。Nacos 项目的模块化组织结构清晰地划分了各个核心功能,并通过 Maven 进行依赖管理。模块的通信框架进行网络通信,使用事件框架进行事件处理,使用缓存框架提升性能等。模块提供的服务来完成配置管理和服务管理的功能。模块分别负责配置管理和服务发现的核心功能,原创 2025-03-22 08:29:00 · 811 阅读 · 0 评论 -
Spring 是如何处理构造函数注入、Setter 方法注入、字段注入?
Spring 支持构造函数注入、Setter 方法注入和字段注入三种依赖注入方式。推荐使用构造函数注入(强制依赖、不可变性、易于测试)。Spring 支持三种主要的依赖注入方式:构造函数注入、Setter 方法注入和字段注入。Spring 通过调用 Bean 类的构造函数来创建 Bean 实例,并将依赖的 Bean 作为构造函数的参数传入。Spring 容器会解析 Bean 之间的依赖关系,并确保依赖的 Bean 在需要时被创建和注入。中的信息,通过反射创建 Bean 的实例(通常是调用构造函数)。原创 2025-03-21 16:19:33 · 1034 阅读 · 0 评论 -
MyBatis StatementHandler是如何创建 Statement 对象的? 如何执行 SQL 语句?
StatementHandler充当 MyBatis 和原始 JDBC API 之间的桥梁。原创 2025-03-21 13:45:58 · 638 阅读 · 0 评论 -
MyBatis StatementHandler 是如何与数据库进行交互的?
对象相关的操作,使得 MyBatis 的其他组件 (例如。) 无需直接操作 JDBC API,而是通过。接口的实现类,对应不同的 JDBC。在 MyBatis 中扮演着。MyBatis 提供了以下几种。提供的接口与数据库进行交互。封装了所有与 JDBC。原创 2025-03-21 10:36:57 · 634 阅读 · 0 评论 -
Spring 中如何使用反射创建 Bean 实例?
在 Spring 中,虽然框架内部大量使用了反射来创建 Bean 实例,但通常情况下,我们不需要直接使用反射来创建 Bean。Spring 容器会根据 Bean 定义自动完成 Bean 的创建和管理。不过,了解如何使用反射创建 Bean 实例有助于我们更深入地理解 Spring 的工作原理,以及在某些特殊情况下(例如,自定义。、编写测试代码、动态创建对象等)进行更灵活的操作。原创 2025-03-21 08:59:10 · 402 阅读 · 0 评论 -
Spring 如何创建 Bean 实例的?
这个过程涉及多个步骤,包括 Bean 定义的解析、依赖的处理、实例化、属性填充、初始化等。Spring 创建 Bean 实例的过程主要由。接口及其实现类(通常是。原创 2025-03-20 18:46:38 · 712 阅读 · 0 评论 -
Spring BeanDefinition 它存储了哪些信息?
存储了关于 Spring Bean 的所有配置元数据,包括 Bean 的类、作用域、构造函数参数、属性值、依赖关系、初始化方法、销毁方法、是否懒加载、自动装配模式、名称、别名、是否抽象、是否单例、是否原型、是否主要候选者、方法覆盖等信息。该 Bean 所依赖的其他 Bean 的名称。Spring 会确保在创建该 Bean 之前先创建它所依赖的 Bean。如果 Bean 是通过工厂方法创建的,则指定工厂方法的名称。Bean 的作用域,决定了 Bean 的生命周期和可见性。Bean 的初始化方法名称。原创 2025-03-20 16:20:01 · 914 阅读 · 0 评论 -
Mybatis 有哪些不同的 Executor 实现? 它们有什么区别?
实现类采用了不同的 SQL 执行策略,从而在性能、功能和适用场景上有所区别。MyBatis 默认提供了以下三种主要的。除了这三种主要的执行器,MyBatis 还有一个 CachingExecutor。执行器已经足够使用。如果需要提高性能,可以考虑使用。并不是一个独立的执行器类型,而是一个。MyBatis 提供了几种不同的。接口的实现类,这些实现类被称为。在 MyBatis 中,可以通过。执行器,或者启用二级缓存。在大多数情况下,默认的。原创 2025-03-20 09:58:29 · 627 阅读 · 0 评论 -
MyBatis Executor 的作用是什么?
是 MyBatis 框架的核心和灵魂,它负责 SQL 执行的方方面面,并将底层的数据库操作细节隐藏起来,在开发过程中为我们提供了简洁、高效、可配置的数据库访问接口。, Mappers) 提供了更高层次的、更易于使用的 SQL 执行接口。抽象了底层的 JDBC 操作,为 MyBatis 的其他组件 (如。在 MyBatis 中扮演着至关重要的角色,它是。MyBatis 提供了三种内置的。原创 2025-03-20 09:39:18 · 500 阅读 · 0 评论 -
Spring Framework 中 BeanDefinition 是什么
是 Spring Framework 中一个核心的接口,它描述了一个 Bean 的定义。你可以把它看作是 Spring IoC 容器中 Bean 的“蓝图”或“配置元数据”。它包含了 Spring 容器创建、配置和管理 Bean 所需的所有信息。是 Spring 中描述 Bean 的核心接口。它包含了创建、配置和管理 Bean 所需的所有元数据。在 Bean 实例化和属性设置完成后调用的方法。来创建 Bean 的实例,并管理它们的生命周期。该 Bean 所依赖的其他 Bean(通过。原创 2025-03-19 19:29:33 · 682 阅读 · 0 评论 -
JVM 的类加载机制原理
文件加载到内存中,并将其转换为 JVM 可以使用的 Java 类型。类加载过程包括加载、链接(验证、准备、解析)和初始化几个阶段。类加载器遵循双亲委派模型,保证了类加载的顺序和安全性。文件(包含 Java 字节码)加载到内存,并对其进行校验、解析、初始化,最终转换为 JVM 可以直接使用的 Java 类型的过程。JVM 的类加载机制是指 JVM 将。JVM 的类加载机制负责将。原创 2025-03-19 14:24:53 · 1035 阅读 · 0 评论 -
MyBatis 配置文件解析使用了哪些设计模式
MyBatis 配置文件解析过程中,主要运用了以下几种设计模式。原创 2025-03-19 12:19:41 · 867 阅读 · 0 评论 -
MyBatis 如何管理和查找TypeHandler?
MyBatis 需要管理大量的 TypeHandler,并能够根据需要快速找到合适的 TypeHandler 来进行类型转换。当 MyBatis 需要进行类型转换时 (例如设置 PreparedStatement 参数,获取 ResultSet 结果),会通过。来存储 TypeHandler,以便根据不同的查找条件进行高效检索。TypeHandler 可以通过多种方式注册到。查找合适的 TypeHandler。子元素来注册 TypeHandler。方法手动注册 TypeHandler。原创 2025-03-19 10:19:46 · 1184 阅读 · 0 评论 -
MyBatis MapperRegistry 的作用是什么? 它是如何管理 Mapper 接口的?
就像一个人才中介,它管理着所有注册的 Mapper 接口 (人才),并能够根据需要,为开发者提供 Mapper 接口的代理对象 (人才代理),让开发者可以通过操作代理对象来间接执行数据库操作 (管理人才来完成工作)。它确保 MyBatis 能够正确地将 Mapper 接口与对应的 SQL 映射配置关联起来,并在运行时为 Mapper 接口创建代理对象,使得开发者可以通过调用 Mapper 接口方法来执行 SQL 操作。属性指定的包下的所有接口,并将这些接口作为 Mapper 接口注册到。原创 2025-03-18 14:10:38 · 379 阅读 · 0 评论 -
MyBatis XMLMapperBuilder 是如何将 SQL 语句解析成可执行的对象? 如何将结果映射规则解析成对应的处理器?
元素的结果映射配置,用于将查询结果集映射到 Java 对象。等 SQL 语句元素时,并不仅仅是简单地读取 SQL 文本,而是要将 SQL 语句和相关的配置信息。对象包含了执行一个 SQL 操作所需的所有信息,是 MyBatis 运行时执行 SQL 的核心对象。对象才是 MyBatis 运行时真正可执行的 SQL 对象。会解析 SQL 语句中的参数映射配置。注册时,会使用 Mapper 接口的全限定名 + SQL 语句的。会根据 SQL 语句文本的类型,创建不同的。定义的映射规则,映射到 Java 对象。原创 2025-03-18 10:50:12 · 529 阅读 · 0 评论 -
ApplicationContext 如何创建 Bean 实例?
方法(用于预实例化非懒加载的单例 Bean)中。创建 Bean 实例的过程主要在其内部的。原创 2025-03-17 12:50:06 · 896 阅读 · 0 评论 -
MyBatis SqlSession 是如何创建的? 它与 SqlSessionFactory 有什么关系?
是 MyBatis 中与数据库交互的核心接口,它提供了执行 SQL 语句、管理事务、获取 Mapper 接口代理对象等关键功能。的生命周期管理,对于正确使用 MyBatis 至关重要。在 MyBatis 应用中,开发时遵循。是轻量级对象,用于执行 SQL 语句和管理事务。是 MyBatis 与数据库交互的核心接口,它通过。的标准流程,确保资源正确释放和事务的正确性。方法的重载版本,用于创建不同类型的。是重量级对象,负责创建和配置。原创 2025-03-17 08:42:58 · 1099 阅读 · 0 评论 -
MyBatis XMLMapperBuilder 是如何解析 SQL 映射文件的? 它读取了哪些信息?
它使用 XPath 技术高效地解析 Mapper XML 文件,读取 SQL 语句、参数映射、结果映射、缓存配置等信息,并将这些信息封装在。SQL 映射文件定义了 SQL 语句、参数映射、结果映射、缓存配置等信息,用于将 Java 方法调用映射到具体的 SQL 操作。的主要职责就是读取这些 XML 文件,解析其中的 SQL 映射配置,并将这些配置信息存储到。根元素,定义 Mapper 映射文件的命名空间 (namespace)。方法完成 SQL 映射文件的解析和注册后,解析过程结束。原创 2025-03-17 07:25:04 · 872 阅读 · 0 评论 -
MyBatis XMLConfigBuilder 是如何解析 MyBatis 配置文件的? 它读取了哪些信息? 如何将这些信息存储到 Configuration 对象中?
XPath 允许以路径的方式选择 XML 文档中的节点,使得解析器可以方便地访问和提取特定元素和属性的值。它使用 XPath 技术高效地解析 XML 文件,读取各种配置信息,并将这些信息以结构化的方式存储到。它的主要职责是从 XML 文件中读取 MyBatis 的配置信息,并将这些信息构建并存储到。在解析 XML 配置文件的过程中,会将读取到的信息通过以下方式存储到。会按照一定的顺序解析 XML 配置文件中的元素,大致顺序如下 (与。方法完成 XML 文件的解析后,会将构建好的。实例,并将配置文件的。原创 2025-03-16 13:07:14 · 725 阅读 · 0 评论 -
MyBatis SqlSessionFactoryBuilder 的作用是什么?
建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。一旦工厂组装完成,工程师的任务就完成了,他就可以离开了 (一次性使用)。这种多配置源的支持,使得 MyBatis 的配置方式更加灵活,可以适应不同的应用场景和配置管理需求。) 负责根据设计图纸 (MyBatis 配置) 和原材料 (配置源),一步步地组装出最终的工厂 (在 MyBatis 中扮演着至关重要的角色,它的主要作用是。理解为 SqlSessionFactory。的创建逻辑解耦,提高了代码的灵活性。原创 2025-03-16 11:12:54 · 1043 阅读 · 0 评论 -
ApplicationContext 如何解析 Bean 定义
的子接口,它可以在Bean 定义加载完成后,但在 Bean 实例化之前执行,允许添加、删除或修改 Bean 定义。* 在BeanDefinition加载完, 实例化Bean之前, 会调用。解析 Bean 定义的过程,实际上是其内部的。和解析器协同工作的结果。的配置元数据(例如,修改。原创 2025-03-15 16:48:02 · 760 阅读 · 0 评论 -
MyBatis SqlSessionFactory 是如何创建的?
之前,首先需要加载和解析 MyBatis 的配置信息。实例是 MyBatis 与数据库交互的主要接口,负责执行 SQL 语句、管理事务等。的方法,可以从不同的配置源 (如 XML 配置文件、Java 代码配置) 构建。是 MyBatis 的核心接口之一,它是创建。参数,用于读取 XML 配置文件。方法内部会执行以下关键步骤来创建。方法,用于根据不同的配置源构建。遵循建造者模式,提供多种构建。原创 2025-03-15 12:45:26 · 1016 阅读 · 0 评论 -
MyBatis 如何创建 SqlSession 对象的?
接口及其实现类来完成。MyBatis 创建。MyBatis 创建。原创 2025-03-15 11:49:35 · 850 阅读 · 0 评论 -
JVM 的不同组成部分分别有什么作用?
除了启动类加载器,每个类加载器都有一个父类加载器。当一个类加载器需要加载类时,它首先会委托给父类加载器去加载,只有当父类加载器无法加载时,才由自己加载。原创 2025-03-14 15:07:04 · 913 阅读 · 0 评论