Java面试八股文框架篇

1、简单的谈一下SpringMVC的工作流程 难度系数:⭐

SpringMVC 的核心工作流程可概括为以下五个步骤:

  1. 请求入口 :所有请求统一由 前端控制器(DispatcherServlet) 接收并处理。
  2. 定位处理器 :DispatcherServlet 通过 处理器映射器(HandlerMapping) 找到对应的 处理器(Controller)
  3. 执行处理 :DispatcherServlet 通过 处理器适配器(HandlerAdapter) 调用处理器执行业务逻辑,并返回 ModelAndView
  4. 解析视图 :DispatcherServlet 将 ModelAndView 交给 视图解析器(ViewResolver) 解析,生成具体的 View
  5. 响应渲染:DispatcherServlet 使用 View 进行渲染,将结果返回给客户端。

2、说出Spring或者SpringMVC中常用的5个注解 难度系数:⭐

以下是 Spring/SpringMVC 中最常用的 5 个注解及其最概括的说明:

  1. @Component:将普通类标记为 Spring 容器管理的 Bean。

    • 衍生@Controller(Web 层)、@Service(业务层)、@Repository(数据访问层)。
  2. @Autowired:实现依赖自动注入,按类型自动装配 Bean。

  3. @RequestMapping:将 HTTP 请求映射到控制器处理方法。

    • 衍生@GetMapping@PostMapping 等快捷方式。
  4. @Configuration:声明该类为配置类,用于定义 Bean 的装配逻辑。

    • 配合 :常与 @Bean 配合使用(用于声明第三方库的实例)。
  5. @Value:将配置文件(如 application.properties)中的属性值注入到变量中。


3、简述SpringMVC中如何返回JSON数据 难度系数:⭐

在 SpringMVC 中返回 JSON 数据最核心的两点:

  1. 使用 @ResponseBody 注解 :在处理器方法上添加 @ResponseBody,或将类注解为 @RestController(等同于 @Controller + @ResponseBody),框架会将方法返回的对象自动序列化为 JSON。
  2. 依赖 HttpMessageConverter :借助 MappingJackson2HttpMessageConverter(由 Jackson 库提供)完成对象到 JSON 字符串的转换。

4、谈谈你对Spring的理解 难度系数:⭐

Spring在我看来,就是一个**"容器"加"生态"**。

  • 作为容器 :它通过 IoC(控制反转) 接管了对象的创建与依赖管理,让开发者从繁琐的new对象中解脱出来;再通过 AOP(面向切面编程) 将业务逻辑与公共逻辑(如事务、日志)解耦。本质上,它解决了Java开发中组件间的解耦与集成问题。

  • 作为生态:它不仅是Framework,更是一个一站式平台。基于其核心的"容器"能力,Spring衍生出了Spring MVC(Web层)、Spring Data(数据层)、Spring Cloud(微服务)等,几乎覆盖了企业级开发的所有方面,成为了Java工业级开发的事实标准。


5、Spring中常用的设计模式 难度系数:⭐

Spring 中最常用的设计模式,概括如下:

  • 工厂模式BeanFactoryApplicationContext,负责 Bean 的创建与管理。
  • 单例模式:Bean 默认作用域,确保一个类仅有一个实例。
  • 代理模式:AOP 实现核心,通过 JDK 动态代理或 CGLIB 增强功能。
  • 模板方法模式JdbcTemplateRedisTemplate 等,封装固定流程,预留回调接口。
  • 策略模式Resource 资源访问、InstantiationStrategy 实例化策略,实现算法替换。
  • 适配器模式HandlerAdapter 用于适配不同 Controller 的调用方式。
  • 观察者模式ApplicationEventApplicationListener,实现事件驱动的异步通信。
  • 装饰者模式BeanWrapper 对 Bean 属性操作增强,动态添加功能。

6、Spring循环依赖问题 难度系数:⭐⭐

Spring通过三级缓存解决单例Bean的循环依赖:

  1. 实例化:先创建对象(提前暴露到三级缓存)
  2. 属性填充:发现依赖时,从缓存中获取提前暴露的代理对象
  3. 完成创建:最终将完全初始化的对象放入一级缓存

关键 :利用提前暴露机制,在Bean未完全初始化前就能获取其引用,打破循环。仅适用于单例且非构造器注入的场景。


7、介绍一下Spring bean 的生命周期、注入方式和作用域 难度系数:⭐

1. 生命周期

实例化 → 属性填充 → 初始化(@PostConstructafterPropertiesSetinit-method)→ 使用 → 销毁(@PreDestroydisposableBeandestroy-method)。

2. 注入方式

  • 字段注入@Autowired 直接打在字段上(最简洁,不推荐用于不可变属性)。
  • 构造器注入:通过构造方法赋值(推荐,支持不可变对象,便于单元测试)。
  • Setter 注入:通过 Setter 方法注入(可选依赖或需要循环依赖时使用)。

3. 作用域

  • singleton:默认,单例,整个容器只有一个实例。
  • prototype:原型,每次获取都创建新实例。
  • request:每次 HTTP 请求一个实例(仅 Web 环境)。
  • session:每个 HTTP 会话一个实例(仅 Web 环境)。
  • application :每个 ServletContext 一个实例(仅 Web 环境)。

8、请描述一下Spring 的事务管理 难度系数:⭐

Spring 事务管理的本质是 AOP,核心流程可概括为:

  1. 核心机制 :通过 PlatformTransactionManager (事务管理器)统一管理事务(开启、提交、回滚),利用 @Transactional 进行声明式配置。
  2. 运作方式 :采用 AOP 代理 拦截方法,在目标方法执行前开启事务 ,执行后提交 ,若出现 RuntimeExceptionError回滚 (可通过 rollbackFor 定制)。
  3. 关键能力 :支持 7种传播行为 (如 REQUIRED 复用或新建事务)和 隔离级别,以控制并发场景下的数据一致性。

9、MyBatis中 #{}和${}的区别是什么 难度系数:⭐

#{} 是预编译占位符(相当于 PreparedStatement?),防止 SQL 注入
${} 是纯文本替换(直接拼接字符串),存在 SQL 注入风险,通常用于动态传入表名、列名等无法使用占位符的场景。


10、Mybatis 中一级缓存与二级缓存 难度系数:⭐

一级缓存SqlSession 级别,默认开启。同一会话中相同查询命中缓存,会话结束缓存失效。

二级缓存Mapper 级别(namespace 级别),需手动开启。可跨会话共享,数据以"粗粒度"存储,需注意脏读风险。

核心概括 :一级缓存是会话内 的自动加速,二级缓存是跨会话的共享缓冲区。


11、MyBatis如何获取自动生成的(主)键值 难度系数:⭐

在 MyBatis 中,获取自动生成的主键值最概括的方式是:

<insert> 语句中设置 useGeneratedKeys="true"keyProperty="实体类中的主键属性名",执行插入后,数据库生成的主键值会自动赋值给传入的实体对象或参数对象的对应属性。


12、简述Mybatis的动态SQL,列出常用的6个标签及作用 难度系数:⭐

MyBatis 动态SQL 允许根据条件动态拼接 SQL 片段,避免硬编码。

常用6个标签及作用:

  1. <if>:条件判断,满足时拼接 SQL。
  2. <choose>/<when>/<otherwise>:多条件分支,只选取一个满足的条件。
  3. <where> :自动处理 AND/OR 前缀,去除多余连接词。
  4. <set> :用于 UPDATE,自动处理逗号,去除多余逗号。
  5. <foreach> :遍历集合,用于 IN 查询或批量插入。
  6. <trim> :灵活定制前缀、后缀或去除多余内容,可替代 <where>/<set>

13、Mybatis 如何完成MySQL的批量操作 难度系数:⭐

使用 <foreach> 标签在动态SQL中构建批量插入/更新语句,或利用 BatchExecutor 执行批量提交。


14、谈谈怎么理解SpringBoot框架 难度系数:⭐⭐

基于Spring的框架,通过"自动配置"和"起步依赖"大幅简化应用搭建与开发,实现"约定优于配置"。


15、Spring Boot 的核心注解是哪个 它主要由哪几个注解组成的 难度系数:⭐

@SpringBootApplication,它由 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan 三个注解组成


16、Spring Boot自动配置原理是什么 难度系数:⭐

启动时通过 @EnableAutoConfigurationMETA-INF/spring.factories 中加载配置类,结合条件注解(如 @ConditionalOnClass)按需创建Bean。


17、SpringBoot配置文件有哪些 怎么实现多环境配置 难度系数:⭐

支持 application.propertiesapplication.yml;多环境通过 application-{profile} 文件区分,并在主配置中用 spring.profiles.active 激活。


18、SpringBoot和SpringCloud是什么关系 难度系数:⭐

SpringBoot是快速构建单个微服务的基石,SpringCloud基于SpringBoot提供一套完整的分布式系统解决方案。


19、SpringCloud都用过哪些组件 介绍一下作用 难度系数:⭐

Nacos(服务注册与配置中心)、Feign(声明式HTTP调用)、Ribbon(客户端负载均衡)、Sentinel(流量控制与熔断降级)、Gateway(API网关)。


20、Nacos作用以及注册中心的原理 难度系数:⭐⭐

提供服务注册发现与配置管理;原理上,服务实例启动时向Nacos Server注册心跳,消费者通过Server获取服务列表并本地缓存。


21、Feign工作原理 难度系数:⭐⭐

通过JDK动态代理生成接口实现类,在方法调用时利用注解和编码器构建HTTP请求,经Ribbon负载均衡后发送并解码响应。

相关推荐
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Java的医药进出口交易系统设计与实现为例,包含答辩的问题和答案
java·开发语言
编程一生2 小时前
面试问到的那些技术细节
面试·职场和发展
Touch&2 小时前
Windows11多个JDK版本(Java8、Java11、Java17、Java21)下载安装和切换
java·jdk·jdk多个版本切换
清水白石0082 小时前
Python 性能优化全景解析:当 Big O 骗了你——深挖常数开销、内存与解释器黑盒
开发语言·python·性能优化
oi..2 小时前
python Get/Post请求练习
开发语言·经验分享·笔记·python·程序人生·安全·网络安全
星夜夏空992 小时前
C语言进阶项目——搭建内存池
c语言·开发语言
帮我吧智能服务平台2 小时前
装备制造企业售后服务数字化:从成本中心到利润中心背景
java·前端·制造
历程里程碑2 小时前
Proto3 三大高级类型:Any、Oneof、Map 灵活解决复杂业务场景
java·大数据·开发语言·数据结构·elasticsearch·链表·搜索引擎
蜜獾云2 小时前
DDD 架构分层,MQ消息要放到那一层处理?
java·jvm·架构