```html
📞 客服热线:400-123-4567 📧 联系邮箱:support@kaoacca.cn

Java框架面试题库

汇聚2024年最新大厂面试真题,深度解析Spring、MyBatis及微服务架构核心考点,助您从容应对技术面试。

一、 Spring框架核心机制深度解析

在Java框架面试题库中,Spring框架的基础知识占据了半壁江山。面试官往往不仅仅考察API的使用,更关注底层原理的理解。以下是关于Spring核心机制的高频考点梳理。

1.1 Spring Bean的生命周期

理解Spring Bean的生命周期是掌握IoC容器的关键。整个过程可以概括为以下几个阶段:

1.2 循环依赖及其解决

循环依赖是指两个或多个Bean互相引用对方。Spring通过三级缓存机制解决了单例模式下的属性注入循环依赖问题:

缓存名称 数据类型 作用描述
singletonObjects Map<String, Object> 存放完全初始化好的单例Bean
earlySingletonObjects Map<String, Object> 存放原始的Bean对象(未填充属性),用于解决循环依赖
singletonFactories Map<String, ObjectFactory> 存放Bean工厂,用于生成早期引用

注意:Spring无法解决原型(Prototype)作用域下的循环依赖,因为这会导致无限创建Bean对象,最终引发OutOfMemoryError。

二、 Spring Boot与微服务架构实战

随着微服务架构的普及,Java框架面试题库中关于Spring Boot和Spring Cloud的问题比例逐年上升。这部分内容不仅考察配置能力,更考察架构思维。

2.1 @SpringBootApplication 解析

@SpringBootApplication 是一个组合注解,主要包含以下三个核心注解:

  1. @SpringBootConfiguration:标识当前类为配置类,等同于@Configuration。
  2. @EnableAutoConfiguration:开启自动配置,核心在于导入 spring.factories 文件中定义的自动配置类。
  3. @ComponentScan:扫描当前包及其子包下的组件。

自动配置的核心逻辑在于 AutoConfigurationImportSelector,它通过 getCandidateConfigurations 方法加载配置,并结合 @ConditionalOnClass、@ConditionalOnMissingBean 等条件注解,判断是否将某个Bean注册到容器中。

2.2 自定义 Starter

在微服务开发中,封装通用的业务逻辑往往需要自定义Starter。一个标准的Starter包含两部分:

  • 自动配置模块:包含自动配置类,通过 @Configuration 和条件注解实现。
  • 依赖模块:包含业务代码和API接口。

在 META-INF/spring.factories 文件中,需要配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键,指向你的自动配置类全限定名。

2.3 Spring Cloud Gateway 核心概念

Spring Cloud Gateway 是基于Spring WebFlux的反应式编程模型构建的。其核心组件包括:

  • Route(路由):路由的基本构建块,由ID、目标URI和一组断言和过滤器定义。
  • Predicate(断言):Java 8的函数式接口,用于匹配HTTP请求中的任何内容,如Header、参数、路径等。
  • Filter(过滤器):在请求和响应发送之间修改请求和响应的包装器。

三、 MyBatis持久层框架考点

在Java框架面试题库中,MyBatis作为最流行的ORM框架之一,其缓存机制、插件原理及动态SQL是考察重点。

3.1 一级缓存与二级缓存

MyBatis提供了一级缓存和二级缓存。一级缓存是SqlSession级别的,默认开启。当同一个SqlSession执行相同的SQL语句时,第二次查询会直接从缓存中获取数据,而不访问数据库。

二级缓存是Mapper Namespace级别的,默认关闭。开启二级缓存需要配置 <cache/> 标签。需要注意的是,二级缓存涉及序列化问题,因为不同SqlSession可能在不同线程中运行,缓存数据需要在它们之间共享。

3.2 MyBatis插件原理

MyBatis插件基于JDK动态代理实现。它可以通过拦截四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)的方法,实现自定义功能,如分页插件、性能监控插件等。

// 插件示例代码片段
@Intercepts({
    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 拦截逻辑
        return invocation.proceed();
    }
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }
}

四、 高频面试问答(FAQ)

以下是来自Java框架面试题库中网友关注度最高的10个技术问题及其深度解答:

Q1: Spring事务失效的场景有哪些?

1. 方法非public修饰;2. 自身调用(未通过代理对象);3. 数据库引擎不支持事务(如MyISAM);4. 异常被捕获未抛出;5. 异常类型不匹配(默认回滚RuntimeException)。

Q2: Nacos与Eureka的区别?

Eureka遵循AP原则,保证可用性,不保证一致性;Nacos支持CP和AP模式切换。Nacos还支持配置管理功能,而Eureka仅做服务注册发现。

Q3: Redis持久化方式RDB与AOF对比?

RDB是快照形式,恢复快但可能丢失数据;AOF记录写命令,数据安全性高但文件大,恢复慢。生产环境通常建议同时开启两者。

Q4: Kafka如何保证消息不丢失?

生产者设置 acks=all;Broker设置 replication.factor>1 且 min.insync.replicas>1;消费者手动提交Offset。

Q5: 如何优化MyBatis批量插入?

使用 <foreach> 标签生成多条INSERT语句;或使用JDBC批处理;MySQL中可使用 LOAD DATA INFILE 极速导入。

Q6: JVM内存模型如何划分?

堆(Heap)、方法区(Metaspace)、虚拟机栈、本地方法栈、程序计数器。堆又分为新生代(Eden, S0, S1)和老年代。

```
斌知网
蜀ICP备2026017620号-5