1、简单的谈一下SpringMVC的工作流程 难度系数:⭐
SpringMVC 的核心工作流程可概括为以下五个步骤:
- 请求入口 :所有请求统一由 前端控制器(DispatcherServlet) 接收并处理。
- 定位处理器 :DispatcherServlet 通过 处理器映射器(HandlerMapping) 找到对应的 处理器(Controller)。
- 执行处理 :DispatcherServlet 通过 处理器适配器(HandlerAdapter) 调用处理器执行业务逻辑,并返回 ModelAndView。
- 解析视图 :DispatcherServlet 将 ModelAndView 交给 视图解析器(ViewResolver) 解析,生成具体的 View。
- 响应渲染:DispatcherServlet 使用 View 进行渲染,将结果返回给客户端。
2、说出Spring或者SpringMVC中常用的5个注解 难度系数:⭐
以下是 Spring/SpringMVC 中最常用的 5 个注解及其最概括的说明:
-
@Component:将普通类标记为 Spring 容器管理的 Bean。- 衍生 :
@Controller(Web 层)、@Service(业务层)、@Repository(数据访问层)。
- 衍生 :
-
@Autowired:实现依赖自动注入,按类型自动装配 Bean。 -
@RequestMapping:将 HTTP 请求映射到控制器处理方法。- 衍生 :
@GetMapping、@PostMapping等快捷方式。
- 衍生 :
-
@Configuration:声明该类为配置类,用于定义 Bean 的装配逻辑。- 配合 :常与
@Bean配合使用(用于声明第三方库的实例)。
- 配合 :常与
-
@Value:将配置文件(如 application.properties)中的属性值注入到变量中。
3、简述SpringMVC中如何返回JSON数据 难度系数:⭐
在 SpringMVC 中返回 JSON 数据最核心的两点:
- 使用
@ResponseBody注解 :在处理器方法上添加@ResponseBody,或将类注解为@RestController(等同于@Controller+@ResponseBody),框架会将方法返回的对象自动序列化为 JSON。 - 依赖
HttpMessageConverter:借助MappingJackson2HttpMessageConverter(由 Jackson 库提供)完成对象到 JSON 字符串的转换。
4、谈谈你对Spring的理解 难度系数:⭐
Spring在我看来,就是一个**"容器"加"生态"**。
-
作为容器 :它通过 IoC(控制反转) 接管了对象的创建与依赖管理,让开发者从繁琐的
new对象中解脱出来;再通过 AOP(面向切面编程) 将业务逻辑与公共逻辑(如事务、日志)解耦。本质上,它解决了Java开发中组件间的解耦与集成问题。 -
作为生态:它不仅是Framework,更是一个一站式平台。基于其核心的"容器"能力,Spring衍生出了Spring MVC(Web层)、Spring Data(数据层)、Spring Cloud(微服务)等,几乎覆盖了企业级开发的所有方面,成为了Java工业级开发的事实标准。
5、Spring中常用的设计模式 难度系数:⭐
Spring 中最常用的设计模式,概括如下:
- 工厂模式 :
BeanFactory和ApplicationContext,负责 Bean 的创建与管理。 - 单例模式:Bean 默认作用域,确保一个类仅有一个实例。
- 代理模式:AOP 实现核心,通过 JDK 动态代理或 CGLIB 增强功能。
- 模板方法模式 :
JdbcTemplate、RedisTemplate等,封装固定流程,预留回调接口。 - 策略模式 :
Resource资源访问、InstantiationStrategy实例化策略,实现算法替换。 - 适配器模式 :
HandlerAdapter用于适配不同 Controller 的调用方式。 - 观察者模式 :
ApplicationEvent和ApplicationListener,实现事件驱动的异步通信。 - 装饰者模式 :
BeanWrapper对 Bean 属性操作增强,动态添加功能。
6、Spring循环依赖问题 难度系数:⭐⭐
Spring通过三级缓存解决单例Bean的循环依赖:
- 实例化:先创建对象(提前暴露到三级缓存)
- 属性填充:发现依赖时,从缓存中获取提前暴露的代理对象
- 完成创建:最终将完全初始化的对象放入一级缓存
关键 :利用提前暴露机制,在Bean未完全初始化前就能获取其引用,打破循环。仅适用于单例且非构造器注入的场景。
7、介绍一下Spring bean 的生命周期、注入方式和作用域 难度系数:⭐
1. 生命周期
实例化 → 属性填充 → 初始化(@PostConstruct、afterPropertiesSet、init-method)→ 使用 → 销毁(@PreDestroy、disposableBean、destroy-method)。
2. 注入方式
- 字段注入 :
@Autowired直接打在字段上(最简洁,不推荐用于不可变属性)。 - 构造器注入:通过构造方法赋值(推荐,支持不可变对象,便于单元测试)。
- Setter 注入:通过 Setter 方法注入(可选依赖或需要循环依赖时使用)。
3. 作用域
- singleton:默认,单例,整个容器只有一个实例。
- prototype:原型,每次获取都创建新实例。
- request:每次 HTTP 请求一个实例(仅 Web 环境)。
- session:每个 HTTP 会话一个实例(仅 Web 环境)。
- application :每个
ServletContext一个实例(仅 Web 环境)。
8、请描述一下Spring 的事务管理 难度系数:⭐
Spring 事务管理的本质是 AOP,核心流程可概括为:
- 核心机制 :通过
PlatformTransactionManager(事务管理器)统一管理事务(开启、提交、回滚),利用@Transactional进行声明式配置。 - 运作方式 :采用 AOP 代理 拦截方法,在目标方法执行前开启事务 ,执行后提交 ,若出现
RuntimeException或Error则回滚 (可通过rollbackFor定制)。 - 关键能力 :支持 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个标签及作用:
<if>:条件判断,满足时拼接 SQL。<choose>/<when>/<otherwise>:多条件分支,只选取一个满足的条件。<where>:自动处理AND/OR前缀,去除多余连接词。<set>:用于UPDATE,自动处理逗号,去除多余逗号。<foreach>:遍历集合,用于IN查询或批量插入。<trim>:灵活定制前缀、后缀或去除多余内容,可替代<where>/<set>。
13、Mybatis 如何完成MySQL的批量操作 难度系数:⭐
使用 <foreach> 标签在动态SQL中构建批量插入/更新语句,或利用 BatchExecutor 执行批量提交。
14、谈谈怎么理解SpringBoot框架 难度系数:⭐⭐
基于Spring的框架,通过"自动配置"和"起步依赖"大幅简化应用搭建与开发,实现"约定优于配置"。
15、Spring Boot 的核心注解是哪个 它主要由哪几个注解组成的 难度系数:⭐
@SpringBootApplication,它由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 三个注解组成
16、Spring Boot自动配置原理是什么 难度系数:⭐
启动时通过 @EnableAutoConfiguration 从 META-INF/spring.factories 中加载配置类,结合条件注解(如 @ConditionalOnClass)按需创建Bean。
17、SpringBoot配置文件有哪些 怎么实现多环境配置 难度系数:⭐
支持 application.properties 和 application.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负载均衡后发送并解码响应。