【Spring 面试突击 · 02】大厂高频面试题:从容器启动流程到设计模式及Spring Boot特性深度解析
目录
1. ApplicationContext 和 BeanFactory 有什么区别?
2. Spring Boot、Spring MVC 和 Spring 有什么区别?
9. 如何理解 Spring Boot 中的 Starter?
10. 说一说你知道的 Spring Boot 中常用注解及其底层实现。
这份清单涵盖了 Spring 框架的核心原理、容器机制、MVC 流程、Boot 特性及设计思想,是中高级 Java 开发面试的“必考组合拳”。下面我将为你整理每道题的高分回答话术,语言精炼、逻辑清晰、重点突出,适合直接用于面试表达。
✅ 一、核心概念与对比(Q1, Q2)
1. ApplicationContext 和 BeanFactory 有什么区别?
标准对比法:
| 维度 | BeanFactory | ApplicationContext |
|---|---|---|
| 定位 | Spring 最基础容器接口 | BeanFactory 的子接口,功能更强大 |
| 加载方式 | 懒加载(首次获取时才初始化 Bean) | 预加载(启动时初始化所有单例 Bean) |
| 功能扩展 | 仅支持基本 DI | 支持 AOP、事件发布、国际化、资源访问等 |
| 使用场景 | 资源受限环境(如嵌入式设备) | 企业级应用主流选择 |
💡 补充:“我们日常开发用的
ClassPathXmlApplicationContext、AnnotationConfigApplicationContext都是 ApplicationContext 的实现类。”
2. Spring Boot、Spring MVC 和 Spring 有什么区别?
层级关系 + 职责划分:
- Spring → 核心框架,提供 IOC、AOP、事务管理等底层能力。
- Spring MVC → 基于 Spring 的 Web 层框架,负责请求分发、视图渲染、参数绑定等。
- Spring Boot → 不是新技术,而是“脚手架”+“自动配置”,简化 Spring 应用的搭建和部署。
🎯 类比:
- Spring = 汽车发动机 + 底盘
- Spring MVC = 方向盘 + 仪表盘(Web 控制层)
- Spring Boot = 整车出厂套装(一键启动,开箱即用)
✅ 总结:“Spring 是根基,MVC 是 Web 模块,Boot 是加速器——三者协同工作,构成现代 Java Web 开发基石。”
✅ 二、容器与生命周期(Q3-Q5)
3. 介绍一下 Spring 容器的启动流程。
四步走战略:
-
创建容器对象
如new ClassPathXmlApplicationContext("applicationContext.xml") -
加载配置文件 / 扫描注解
解析 XML 或扫描@Component,@Configuration等注解,生成 BeanDefinition -
实例化 & 依赖注入
根据 BeanDefinition 创建 Bean 实例,并通过反射完成属性注入(DI) -
初始化回调 & 注册后置处理器
执行InitializingBean.afterPropertiesSet()、@PostConstruct、BeanPostProcessor 等
💡 关键点:“整个过程由
AbstractApplicationContext.refresh()方法驱动,包含 12 个步骤,核心是‘加载→实例化→注入→初始化’。”
4. 如何实现一个 IOC 容器?
手写简易版思路(展示理解深度):
// 1. 定义注解
@interface Component {}
@interface Autowired {}
// 2. 扫描包路径,收集带 @Component 的类
List<Class<?>> classes = scanPackages("com.example");
// 3. 实例化并缓存到 Map<String, Object> beanMap
for (Class<?> clazz : classes) {
Object instance = clazz.newInstance();
beanMap.put(clazz.getSimpleName().toLowerCase(), instance);
}
// 4. 处理 @Autowired 字段注入
for (Object bean : beanMap.values()) {
for (Field field : bean.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(Autowired.class)) {
field.setAccessible(true);
String name = field.getType().getSimpleName().toLowerCase();
field.set(bean, beanMap.get(name));
}
}
}
✅ 总结:“IOC 本质就是‘反射 + 映射表’——通过扫描、实例化、注入三步,把对象管理权从程序员交给容器。”
5. 描述一下 Spring Bean 的生命周期?
七阶段记忆法:
- 实例化(Instantiation) → 调用构造函数创建对象
- 属性赋值(Populate) → 注入依赖(setter/构造器/@Autowired)
- Aware 接口回调 → 如
BeanNameAware,ApplicationContextAware - 前置处理(BeanPostProcessor.postProcessBeforeInitialization)
- 初始化(Initialization) →
@PostConstruct/InitializingBean.afterPropertiesSet()/ init-method - 后置处理(BeanPostProcessor.postProcessAfterInitialization) → AOP 代理在此处生成
- 销毁(Destruction) →
@PreDestroy/DisposableBean.destroy()/ destroy-method
💡 图解口诀:“生(实例化)→ 养(赋值)→ 认亲(Aware)→ 前插(前置)→ 成年(初始化)→ 后插(后置/AOP)→ 死(销毁)”
✅ 三、设计模式与组件(Q6-Q8)
6. Spring 用到了哪些设计模式?请举例说明。
五大经典模式:
- 工厂模式 →
BeanFactory,ApplicationContext创建 Bean - 单例模式 → 默认 Bean 作用域为 singleton
- 代理模式 → AOP 动态代理(JDK/CGLIB),事务、日志等功能实现
- 模板方法模式 →
JdbcTemplate,RestTemplate封装重复逻辑 - 观察者模式 → 事件驱动模型(
ApplicationEventPublisher+Listener)
💡 加分项:“还有策略模式(不同 ValidationStrategy)、适配器模式(HandlerAdapter)、责任链模式(FilterChain)等。”
7. 介绍一下 Spring MVC 的工作流程。
九步请求旅程:
- 用户发送请求 →
DispatcherServlet(前端控制器) - Dispatcher 查询
HandlerMapping→ 找到对应 Controller 方法 - Dispatcher 调用
HandlerAdapter→ 执行 Controller 方法 - Controller 返回
ModelAndView(或@ResponseBody) - Dispatcher 交给
ViewResolver→ 解析视图名 - ViewResolver 返回具体 View 对象(如 JSP、Thymeleaf)
- Dispatcher 渲染视图 → 填充模型数据
- 响应返回给用户
- (可选)拦截器、异常处理器全程参与
️ 图示关键词:“前端控制器 → 映射器 → 适配器 → 控制器 → 视图解析器 → 视图渲染”
8. Spring MVC 的主要组件有哪些?
六大核心组件:
- DispatcherServlet → 中央调度器,所有请求入口
- HandlerMapping → 请求映射到 Handler(Controller 方法)
- HandlerAdapter → 适配不同类型的 Handler(如注解方法、旧式 Controller)
- Controller → 业务逻辑处理器(@RestController / @Controller)
- ViewResolver → 视图名称 → 实际视图对象(JSP/Thymeleaf/Freemarker)
- View → 最终渲染页面或 JSON 数据
💡 补充:“还有
LocaleResolver,ThemeResolver,MultipartResolver等辅助组件。”
✅ 四、Spring Boot 特性(Q9, Q10)
9. 如何理解 Spring Boot 中的 Starter?
依赖打包 + 自动配置双引擎:
-
Starter 是什么?
一组预定义的依赖集合 + 自动配置类,让你“零配置”快速集成第三方库。 -
命名规范:
- 官方 starter:
spring-boot-starter-web,spring-boot-starter-data-jpa - 第三方 starter:
mybatis-spring-boot-starter,redisson-spring-boot-starter
- 官方 starter:
-
工作原理:
- 引入 starter → 自动传递相关依赖(如 web starter 包含 Tomcat、Jackson、Spring MVC)
- 触发
@EnableAutoConfiguration→ 扫描META-INF/spring.factories中的自动配置类 - 条件装配(
@ConditionalOnClass,@ConditionalOnMissingBean)→ 按需启用功能
✅ 总结:“Starter = 依赖炸弹 + 自动配置开关 —— 让开发者专注业务,不用操心环境搭建。”
10. 说一说你知道的 Spring Boot 中常用注解及其底层实现。
高频注解 + 原理拆解:
表格
| 注解 | 作用 | 底层实现 |
|---|---|---|
@SpringBootApplication |
主启动类标识 | = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan |
@EnableAutoConfiguration |
开启自动配置 | 导入 AutoConfigurationImportSelector → 读取 spring.factories |
@ConditionalOnXXX |
条件装配 | 如 @ConditionalOnClass(RedisTemplate.class) → 类存在才生效 |
@ConfigurationProperties |
绑定配置文件到 Java 对象 | 通过 Binder 工具类反射赋值 |
@RestController |
RESTful 控制器 | = @Controller + @ResponseBody |
@Value |
注入配置值 | 通过 PropertySourcesPlaceholderConfigurer 解析占位符 |
💡 深入一点:“
spring.factories文件位于META-INF/目录下,存储了所有自动配置类的全限定名,Spring Boot 启动时会加载它们。”
🎯 面试加分技巧:串联作答示例
如果面试官问:“你对 Spring 整体架构怎么理解?”
你可以这样回答:
“Spring 的核心是 IOC 容器(Q1, Q2, Q9, Q10),它通过反射和依赖注入管理 Bean 生命周期。在 Web 层面,Spring MVC(Q5, Q6)基于 DispatcherServlet 实现请求分发,背后大量使用设计模式(Q3)。而 Spring Boot(Q4, Q7, Q8)则通过 Starter 和自动配置,极大简化了这些组件的使用门槛,让我们能‘开箱即用’地构建微服务。”
这样回答,既有广度又有深度,展现系统性思维!
✅ 建议背诵顺序:
先掌握 Q1-Q3(基础概念)→ 再理解 Q3/Q4(容器机制)→ 最后攻克 Q6-/Q10(组件与 Boot)
祝你面试顺利,拿下 Offer!🚀
更多推荐




所有评论(0)