当前位置: 首页 > news >正文

Spring面试题 02

目录

✅ 一、核心概念与对比(Q1-Q2)

1. ApplicationContext 和 BeanFactory 有什么区别?

2. Spring Boot、Spring MVC 和 Spring 有什么区别?

✅ 二、容器与生命周期(Q3-Q5)

3. 介绍一下 Spring 容器的启动流程。

4. 如何实现一个 IOC 容器?

5. 描述一下 Spring Bean 的生命周期?

✅ 三、设计模式与组件(Q6-Q8)

6. Spring 用到了哪些设计模式?请举例说明。

7. 介绍一下 Spring MVC 的工作流程。

8. Spring MVC 的主要组件有哪些?

✅ 四、Spring Boot 特性(Q9- Q10)

9. 如何理解 Spring Boot 中的 Starter?

10. 说一说你知道的 Spring Boot 中常用注解及其底层实现。

🎯 面试加分技巧:串联作答示例


这份清单涵盖了Spring 框架的核心原理、容器机制、MVC 流程、Boot 特性及设计思想,是中高级 Java 开发面试的“必考组合拳”。下面我将为你整理每道题的高分回答话术,语言精炼、逻辑清晰、重点突出,适合直接用于面试表达。


✅ 一、核心概念与对比(Q1-Q2)

1. ApplicationContext 和 BeanFactory 有什么区别?

标准对比法:

维度BeanFactoryApplicationContext
定位Spring 最基础容器接口BeanFactory 的子接口,功能更强大
加载方式懒加载(首次获取时才初始化 Bean)预加载(启动时初始化所有单例 Bean)
功能扩展仅支持基本 DI支持 AOP、事件发布、国际化、资源访问等
使用场景资源受限环境(如嵌入式设备)企业级应用主流选择

💡 补充:“我们日常开发用的ClassPathXmlApplicationContextAnnotationConfigApplicationContext都是 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 容器的启动流程。

四步走战略:

  1. 创建容器对象
    new ClassPathXmlApplicationContext("applicationContext.xml")

  2. 加载配置文件 / 扫描注解
    解析 XML 或扫描@Component,@Configuration等注解,生成 BeanDefinition

  3. 实例化 & 依赖注入
    根据 BeanDefinition 创建 Bean 实例,并通过反射完成属性注入(DI)

  4. 初始化回调 & 注册后置处理器
    执行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 的生命周期?

七阶段记忆法:

  1. 实例化(Instantiation)→ 调用构造函数创建对象
  2. 属性赋值(Populate)→ 注入依赖(setter/构造器/@Autowired)
  3. Aware 接口回调→ 如BeanNameAware,ApplicationContextAware
  4. 前置处理(BeanPostProcessor.postProcessBeforeInitialization)
  5. 初始化(Initialization)@PostConstruct/InitializingBean.afterPropertiesSet()/ init-method
  6. 后置处理(BeanPostProcessor.postProcessAfterInitialization)→ AOP 代理在此处生成
  7. 销毁(Destruction)@PreDestroy/DisposableBean.destroy()/ destroy-method

💡 图解口诀:“生(实例化)→ 养(赋值)→ 认亲(Aware)→ 前插(前置)→ 成年(初始化)→ 后插(后置/AOP)→ 死(销毁)”


✅ 三、设计模式与组件(Q6-Q8)

6. Spring 用到了哪些设计模式?请举例说明。

五大经典模式:

  1. 工厂模式BeanFactory,ApplicationContext创建 Bean
  2. 单例模式→ 默认 Bean 作用域为 singleton
  3. 代理模式→ AOP 动态代理(JDK/CGLIB),事务、日志等功能实现
  4. 模板方法模式JdbcTemplate,RestTemplate封装重复逻辑
  5. 观察者模式→ 事件驱动模型(ApplicationEventPublisher+Listener

💡 加分项:“还有策略模式(不同 ValidationStrategy)、适配器模式(HandlerAdapter)、责任链模式(FilterChain)等。”


7. 介绍一下 Spring MVC 的工作流程。

九步请求旅程:

  1. 用户发送请求 →DispatcherServlet(前端控制器)
  2. Dispatcher 查询HandlerMapping→ 找到对应 Controller 方法
  3. Dispatcher 调用HandlerAdapter→ 执行 Controller 方法
  4. Controller 返回ModelAndView(或@ResponseBody)
  5. Dispatcher 交给ViewResolver→ 解析视图名
  6. ViewResolver 返回具体 View 对象(如 JSP、Thymeleaf)
  7. Dispatcher 渲染视图 → 填充模型数据
  8. 响应返回给用户
  9. (可选)拦截器、异常处理器全程参与

️ 图示关键词:“前端控制器 → 映射器 → 适配器 → 控制器 → 视图解析器 → 视图渲染”


8. Spring MVC 的主要组件有哪些?

六大核心组件:

  1. DispatcherServlet→ 中央调度器,所有请求入口
  2. HandlerMapping→ 请求映射到 Handler(Controller 方法)
  3. HandlerAdapter→ 适配不同类型的 Handler(如注解方法、旧式 Controller)
  4. Controller→ 业务逻辑处理器(@RestController / @Controller)
  5. ViewResolver→ 视图名称 → 实际视图对象(JSP/Thymeleaf/Freemarker)
  6. 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
  • 工作原理:

    1. 引入 starter → 自动传递相关依赖(如 web starter 包含 Tomcat、Jackson、Spring MVC)
    2. 触发@EnableAutoConfiguration→ 扫描META-INF/spring.factories中的自动配置类
    3. 条件装配(@ConditionalOnClass,@ConditionalOnMissingBean)→ 按需启用功能

✅ 总结:“Starter = 依赖炸弹 + 自动配置开关 —— 让开发者专注业务,不用操心环境搭建。”


10. 说一说你知道的 Spring Boot 中常用注解及其底层实现。

高频注解 + 原理拆解:

注解作用底层实现
@SpringBootApplication主启动类标识=@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan
@EnableAutoConfiguration开启自动配置导入AutoConfigurationImportSelector→ 读取spring.factories
@ConditionalOnXXX条件装配@ConditionalOnClass(RedisTemplate.class)→ 类存在才生效
@ConfigurationProperties绑定配置文件到 Java 对象通过Binder工具类反射赋值
@RestControllerRESTful 控制器=@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(基础概念)→ 再理解 Q4-Q5(容器机制)→ 最后攻克 Q6-Q10(组件与 Boot)。

祝你面试顺利,拿下 Offer!🚀

http://www.jsqmd.com/news/475442/

相关文章:

  • 老板看不见的修仙路
  • 多版本gcc共存方法探索
  • 算法题练习Day1:B2006 地球人口承载力估计
  • 【完全免费】电脑桌面必备的置顶便签,待办事项一目了然,还可以设置专属闹钟,让你再也不怕忘记任何事情。
  • STP理论知识
  • Flutter 三方库 m3u_nullsafe 鸿蒙适配指南 - 实现流媒体播放列表精准解析、在 OpenHarmony 上打造极致稳定的直播交互实战
  • springBoot中使用Validator进行参数校验(转载)
  • Flutter 三方库 backoff 鸿蒙适配指南 - 实现高性能指数退避重试与系统高韧性实战
  • Gossip协议(谣言传播机制)
  • 栈数据结构回顾
  • 【技术分享】PostgreSQL+pgvector在遥感影像检索的AI 赋能实践
  • Flutter 三方库 webfeed_plus 的鸿蒙化适配指南 - 全能 RSS 与 Atom 解析、支持 ITunes 扩展内容、打造鸿蒙端极致阅读神器
  • SpringCloudAlibaba第一章(Nacos服务注册) -2024
  • RAG动态切片策略与重叠机制
  • 什么是 Java 中的指令重排?
  • psd文件解析
  • java毕业设计——基于JSP+sqlserver的房产中介系统设计与实现(毕业论文+程序源码)——房产中介系统
  • 01 「梅花七月香」嵌入式 Linux 应用秋招经验分享 - 个人背景与学习经历
  • java毕业设计——基于JSP+sqlserver的房屋租赁管理系统设计与实现(毕业论文+程序源码)——房屋租赁管理系统
  • Flutter 三方库 connectme 鸿蒙适配指南 - 实现高性能全双工 WebSocket 通讯、在 OpenHarmony 上打造极低时延实时防线实战
  • Management By Objectives (MBO) - 目标管理
  • 教师必备!告别手忙脚乱,这些软件一键批量发成绩
  • Flutter 三方库 flutter_data_generator 鸿蒙适配指南 - 实现自动化测试数据生产、在 OpenHarmony 上打造极致高效的研发脚手架实战
  • java毕业设计——基于JSP+sqlserver的高校学生考勤管理系统设计与实现(毕业论文+程序源码)——考勤管理系统
  • 第十章 微积分:贯穿多领域的统一思维与落地价值
  • 车流量计数、不同车型统计算法
  • SimpleBar终极指南:5分钟学会自定义滚动条设计
  • 吃透数据库范式!从 1NF 到 BCNF,零基础也能秒懂的核心笔记
  • Ground Rules
  • Synergy服务端显示异常解决办法