Spring 面试题
- 什么是 Spring?它解决了什么问题?
- Spring 就是一个“超级大管家”,帮你管理项目里所有的对象(叫 Bean)和它们的依赖关系。以前你写代码要自己
new对象,现在你把对象交给 Spring,需要用的时候找它要就行了。 - 解决了什么问题?
- 解耦:不用在代码里到处
new,改一个地方不用改一堆。 - 简化开发:提供了很多现成的功能(事务、数据访问、Web 等)。
- 方便测试:因为对象都是独立的,可以轻松替换成模拟对象。
- 解耦:不用在代码里到处
- 什么是 IoC(控制反转)?什么是 DI(依赖注入)?
- IoC(控制反转):以前是你自己主动去创建对象(正转),现在你把控制权交给 Spring 容器,由它来创建和管理对象。就像你以前自己做饭,现在你点外卖,把“做饭的控制权”反转给了外卖平台。
- DI(依赖注入):是 IoC 的具体实现方式。当一个对象需要另一个对象时(比如 UserService 需要 UserDao),Spring 会自动把 UserDao “注入”给 UserService,你不用自己去
new。注入方式有三种:构造方法注入、setter 注入、字段注入(@Autowired)。
- 什么是 AOP(面向切面编程)?有什么用?
- AOP 就是“在不改原有代码的情况下,给某些方法前后统一加功能”。比如你想给所有 service 方法加日志、加事务、加权限校验,你不需要在每个方法里写重复代码,而是定义一个“切面”,Spring 会在方法执行前后自动插入你的代码。
- 常用场景:日志、事务、权限、性能监控、缓存。
- Spring 中的 Bean 是什么?作用域有哪些?
- Bean 就是被 Spring 容器管理的 Java 对象。你可以在类上写
@Component、@Service、@Repository,或者在配置类里用@Bean方法,Spring 就会把它们变成 Bean。 - 作用域(最常考的是前两个):
- singleton(单例,默认):整个容器只有一个实例,大家共用。
- prototype(原型):每次获取都创建一个新实例。
- request(每个 HTTP 请求一个实例,只在 Web 应用有效)
- session(每个用户会话一个实例)
- application(整个 ServletContext 一个实例)
- Spring 怎么管理事务?
@Transactional原理?
- Spring 通过 声明式事务 让你用
@Transactional注解来标记一个方法或类,这个方法执行前会自动开启事务,执行完没异常就提交,有异常就回滚。 - 原理:AOP!Spring 会生成一个代理对象,在目标方法前后加上事务开启、提交/回滚的逻辑。
- 注意:同一个类内部调用
@Transactional方法会失效,因为绕过了代理。
Spring MVC 面试题
- 什么是 Spring MVC?它和 Servlet 什么关系?
- Spring MVC 是 Spring 框架的一个 Web 模块,它把 Servlet 封装得更简单好用。你以前写 Servlet 要自己处理请求参数、转发、重定向,现在 Spring MVC 帮你做了大部分脏活累活。
- 关系:Spring MVC 底层还是 Servlet(核心是
DispatcherServlet),但提供了更优雅的编程模型:@Controller、@RequestMapping、@RequestParam等。
- Spring MVC 的工作流程(一个请求从头到尾经历了什么)?
这是必考题,记住下面 9 步(可以简化成 6 步):
- 用户发送请求到
DispatcherServlet(前端控制器,它是总指挥)。 DispatcherServlet问HandlerMapping:“这个请求应该交给哪个 Controller 方法?” HandlerMapping 返回一个执行链(包含拦截器)。DispatcherServlet把请求交给HandlerAdapter(适配器),让它去调用真正的 Controller 方法。- Controller 方法执行完,返回一个
ModelAndView(包含数据名和视图名)。 DispatcherServlet把 ModelAndView 交给ViewResolver(视图解析器),让它找到真正的视图页面(如 JSP、Thymeleaf)。- 视图渲染(把数据填进模板),生成 HTML。
- 响应返回给用户。
简化记忆:DispatcherServlet → 找 HandlerMapping → 找 HandlerAdapter → 调 Controller → 返回 ModelAndView → 找 ViewResolver → 渲染视图。
3. @RequestMapping 有什么用?和 @GetMapping 啥关系?
@RequestMapping用来把 URL 映射到 Controller 方法上,可以指定请求方法(GET、POST 等)。@GetMapping、@PostMapping是它的简化版,专门对应一种请求方法。比如@GetMapping等价于@RequestMapping(method = RequestMethod.GET)。
- 如何接收前端传来的参数?
- 单个参数:
@RequestParam("name") String name - 路径参数:
@PathVariable("id") Long id,对应 URL/user/{id} - 对象接收:写一个 JavaBean,属性名和请求参数名一致,Spring 自动封装。
- JSON 格式:用
@RequestBody,接收 JSON 转成 Java 对象。
5. @ResponseBody 是干嘛的?
- 它告诉 Spring:不要把返回值当成页面名,而是直接把返回值写到 HTTP 响应体里。通常用来返回 JSON 数据(配合
@RestController,它等于@Controller+@ResponseBody)。
- Spring MVC 的拦截器(Interceptor)和 Filter 有什么区别?
表格 还在加载中,请等待加载完成后再尝试复制
Spring Boot 面试题
- 什么是 Spring Boot?它解决了什么痛点?
- Spring Boot 是一个“脚手架”,让你能 快速创建一个独立运行的 Spring 应用,几乎不用写 XML 配置。
- 解决了什么痛点?
- 以前用 Spring 要配一大堆 XML 或 Java 配置,很烦。
- 要手动管理 jar 包版本,容易冲突。
- 部署麻烦,要打成 war 包放到 Tomcat 里。
- Spring Boot 做到了:自动配置 + 起步依赖 + 内嵌服务器,你只要写业务代码就行了。
- 什么是“自动配置”?原理是什么?
- 自动配置:你加了一个 jar 包(比如
spring-boot-starter-web),Spring Boot 就自动帮你配好 Tomcat、Spring MVC、JSON 转换器等,不用你写一行配置。 - 原理:
- 启动类上的
@SpringBootApplication包含了@EnableAutoConfiguration。 - Spring Boot 会读取
META-INF/spring.factories文件,里面列出了所有自动配置类(比如DataSourceAutoConfiguration、WebMvcAutoConfiguration)。 - 然后根据条件(比如 classpath 里有没有某个类、有没有配某个属性)决定要不要启用这个配置。
- 条件注解有
@ConditionalOnClass、@ConditionalOnMissingBean等。
- 启动类上的
- 什么是“起步依赖”(Starter)?
- 起步依赖 就是一个 Maven/Gradle 依赖,它把某个功能需要的所有 jar 包打包在一起,你只需要加这一个依赖,不用费心去管版本和传递依赖。
- 例如:
spring-boot-starter-web包含了 Spring MVC、Tomcat、Jackson 等;mybatis-spring-boot-starter包含了 MyBatis、数据源自动配置等。
- Spring Boot 内嵌服务器是什么?怎么切换?
- 内嵌服务器就是 Tomcat、Jetty、Undertow 等,被打包到你的应用里,你直接
java -jar运行,不用单独装服务器。 - 默认是 Tomcat。想换成 Jetty,就排除 Tomcat 依赖,加入
spring-boot-starter-jetty。
- Spring Boot 的配置文件有哪些?优先级?
- 常用
application.properties或application.yml。 - 优先级(从高到低):
- 当前目录的
/config子目录 - 当前目录
- classpath 下的
/config包 - classpath 根路径
- 当前目录的
- 也可以使用多环境配置:
application-dev.yml、application-prod.yml,通过spring.profiles.active激活。
6. @SpringBootApplication 注解包含哪三个注解?
@SpringBootConfiguration(其实就是@Configuration)@EnableAutoConfiguration(开启自动配置)@ComponentScan(扫描当前包及其子包的组件)
- Spring Boot 如何实现热部署?
- 添加
spring-boot-devtools依赖,它会监听 classpath 变化,自动重启应用。注意是重启,不是像 Jrebel 那样的热替换。
常问对比题(三兄弟关系)
- Spring 和 Spring Boot 什么关系?
Spring Boot 是 Spring 的“增强版”,它让你用更少的配置,更快的速度创建基于 Spring 的应用。没有 Spring,Spring Boot 就没了灵魂;没有 Spring Boot,Spring 也能用,但配置繁琐。
- Spring MVC 和 Spring Boot 什么关系?
Spring MVC 是一个 Web 框架,Spring Boot 是一个快速开发工具。你可以用 Spring Boot 来创建一个 Spring MVC 项目,它帮你自动配好所有东西。你也可以不用 Spring Boot,自己手动配 Spring MVC,但麻烦。
- 为什么有了 Spring 还需要 Spring Boot?
因为 Spring 的配置太啰嗦了。比如你要配一个 Web 项目,要配 DispatcherServlet、视图解析器、包扫描、JSON 转换器等。Spring Boot 把这些都自动化了,让你专注于写业务代码。