首页 / 资讯中心 / 文章详情

Spring面试25题考点全拆解:IoC容器、Bean生命周期与自动装配

Spring面试25题考点全拆解:IoC容器、Bean生命周期与自动装配 ★ FEATURED ARTICLE
简介经典的Spring面试问答合集面向Java开发者和准备技术岗位面试的求职者聚焦Spring框架的核心知识与常见高频考点。内容覆盖IoC与依赖注入的理解、BeanFactory与ApplicationContext的区别、Bean的生命周期与作用范围、XML/Java/注解三种配置方式、构造器注入与setter注入的对比以及Required、Autowired、Qualifier等注解的实际用法适合用来在面试前系统梳理和查漏补缺。资料为单个docx文档压缩包内共1个文件体积约88KB轻便易存文档以问答题形式呈现整理了25个代表性的Spring面试问题并附带解答示例和要点说明例如单例Bean是否线程安全、如何注入集合类与Properties、FileSystemResource与ClassPathResource的区别、Spring中使用的设计模式总结等。这些内容既能帮助理解Spring容器的工作原理也能为实际项目中的配置和开发提供参考。目前已有403人学习过该资料是不少开发者面试准备阶段的选用材料。通过这份问答清单读者可以快速明确Spring面试的考察方向补齐概念盲区提高复习效率。1. 先搞懂 Spring 面试考什么25 道经典题背后的考点分布Spring 面试题看着是考察框架知识实际上考的是你区分「会用」和「懂原理」的能力。常见的翻车现场是背了一堆配置标签却被一句「BeanFactory 和 ApplicationContext 有什么区别」问住准备了 Spring Boot 项目细节却被「Spring Bean 的生命周期怎么管理」问得卡壳。翻看这份经典 25 题清单它的重心根本不是代码量而是一层层追问容器、Bean、装配、注解这些核心机制。你不需要会写多复杂的 Spring 应用但必须能把 IoC、DI、生命周期、作用域、自动装配这些概念讲清楚并且能配合项目里真实用到的注解和配置方式展开。这份资源对你最大的价值是把 Spring 面试中反复出现的考点压缩成可背诵的问答清单照着过一遍就能覆盖大部分技术面的一二轮考察。2. IoC 与 DI 高频考点控制反转、依赖注入与容器接口怎么答2.1 控制反转和依赖注入的本质区别很多人在面试时把 IoC 和 DI 当成同一个东西回答这是最常见的失分点。控制反转IoC是一种设计思想核心是把对象之间的耦合关系从「程序内部写死」转移到「容器运行时组装」依赖注入DI则是实现这种思想的具体手段。面试官问到「什么是依赖注入」时最想听到的是你分得清这两个层次而不是只有一句「不用 new 对象了」。依赖注入在 Java 中主要有三种实现方式构造器注入、Setter 方法注入、接口注入。构造器注入在对象创建时就要把依赖传进去适合必填依赖Setter 注入则可以在对象创建后再补充依赖适合可选依赖。答题时可以补一句控制反转关注的是「谁控制谁、控制什么」依赖注入关注的是「怎么把依赖送进去」。这句点题的话能让面试官觉得你是真的理解而不是背了面经。2.2 Spring 中 IoC 容器的作用从 BeanFactory 到 ApplicationContextSpring 的 IoC 容器由 org.springframework.beans 包和 org.springframework.context 包构成基础。BeanFactory 接口提供了先进的配置机制是 IoC 容器的核心接口各种 bean 的定义、实例化和关联关系的建立都由它来管理。ApplicationContext 是 BeanFactory 的子接口在 BeanFactory 的功能之上增加了国际化文本消息处理、统一的资源文件读取方式、事件传播以及针对 Web 应用的应用层配置。面试问到「Spring IoC 容器如何工作」你可以按这条链路回答容器读取配置XML、注解或 Java 配置类→ 注册 bean 定义 → 根据定义实例化 bean → 通过构造器或 setter 完成依赖注入 → 将可用 bean 存入容器供客户端获取。这类题通常这么答比较稳妥先说明容器本质是管理 bean 的工厂再点出 BeanFactory 与 ApplicationContext 的扩展关系最后把「实例化、配置、组装」三步讲完整。2.3 BeanFactory 和 ApplicationContext 的区别一道必考对比题BeanFactory 可以理解为含有一组 bean 定义的工厂类在接收到客户端请求时才实例化对应的 beanApplicationContext 在包含全部 bean 定义和关联关系设置的基础上额外提供了对国际化的支持、统一的资源文件读取方式以及在监听器中注册 bean 的事件机制。常见的三种 ApplicationContext 实现类是 ClassPathXmlApplicationContext、FileSystemXmlApplicationContext 和 XmlWebApplicationContext。面试遇到「BeanFactory 和 ApplicationContext 有什么区别」时建议从四个维度展开功能范围、加载时机、Web 支持、事件与国际化。加载时机这道题最容易踩坑很多人误以为 ApplicationContext 启动时会把所有 bean 都加载完严格说它默认是预加载单例 bean而 BeanFactory 是懒加载。补上一句「在实际项目中绝大多数使用的是 ApplicationContext 系列BeanFactory 更多作为底层容器接口出现」答案就完整了。3. Bean 生命周期与作用域高频题容器如何造 Bean、管 Bean、销毁 Bean3.1 Bean 生命周期的四种管理方式Spring Bean 的生命周期管理是面试官的黄金追问区几乎每个面试者在自我介绍提到 Spring 后都会被问到。Bean 在被实例化后需要执行一系列初始化操作才能进入可用状态当不再被调用时需要执行相关析构操作并从容器中移除。BeanFactory 负责管理容器中创建的 bean 的生命周期生命周期由两组回调方法组成初始化之后调用的回调方法、销毁之前调用的回调方法。Spring 框架提供四种方式管理生命周期事件实现 InitializingBean 和 DisposableBean 回调接口实现针对特殊行为的 Aware 接口在 Bean 配置文件中指定自定义的 init 方法和 destroy 方法使用 PostConstruct 和 PreDestroy 注解。其中 XML 方式最直观在 标签中通过 init-method 和 destroy-method 属性指定自定义方法比如配置 demoBean 时声明 customInit 和 customDestroy。面试答题建议按执行顺序来先讲 PostConstruct 注解方法和自定义 init 方法谁先谁后再提 InitializingBean 的 afterPropertiesSet 方法最后补充销毁阶段的 PreDestroy 与 DisposableBean 的 destroy 方法。这里有个常见的记忆技巧注解优先于接口方法、接口方法优先于配置方法。把顺序讲清楚比单纯背四种方式名称更容易让面试官认可。3.2 五种 Bean 作用域对比从 singleton 到 global-sessionSpring 容器中的 bean 有五种作用域singleton 是默认范围保证每个容器中只有一个实例由 BeanFactory 自身维护单例模式prototype 与原形范围相反为每一个请求提供一个新实例request 为每一个来自客户端的网络请求创建一个实例请求完成后被垃圾回收器回收session 确保每个 session 中有一个 bean 实例session 过期后 bean 随之失效global-session 与 Portlet 应用相关在部署到 Portlet 容器时用于所有 portlet 共享的全局存储变量。面试最常考察的对比是 singleton 和 prototype。singleton 适合无状态的服务类、DAO 类、工具类prototype 适合有状态的场景比如视图模型对象和包含可变状态的业务对象。request 和 session 更多地出现在 Web 应用上下文中。答作用域题时建议补一句「作用域决定 bean 实例的存活范围与生命周期回调共同构成容器对 bean 的管控」能把两道题串起来。这部分可以结合一个面试场景练习面试官问「一个用户登录状态存储对象应该用什么作用域」不要回答 singleton也不要回答 request标准思路是 session 作用域因为登录状态要求整个会话期间共享会话结束才销毁。这类场景题考的不是记忆而是对作用域含义的理解。3.3 单例 Bean 是否线程安全一道容易答绝对化的题Spring 框架并没有对单例 bean 做任何多线程封装处理单例 bean 的线程安全和并发问题需要开发者自行解决。这个点是面试的高频陷阱不少人直接回答「Spring 单例是线程安全的」这句话本身就是错的。正确的表述是大部分 Spring 单例 bean 不包含可变状态例如 Service 类和 DAO 类它们天然是线程安全的但一旦 bean 中包含可变实例变量比如视图模型对象就需要自行保证线程安全。最简单的解决办法是把多态 bean 的作用域由 singleton 变更为 prototype。更进一步可以这样展开如果 bean 有可变状态可以考虑把状态抽取到独立对象中或者使用 ThreadLocal 保存状态或者对关键操作加锁。面试官最想听的不是你背出的方案列表而是你能意识到「框架没有替你管并发」这个事实并且能给出自己的取舍思路。3.4 内部 Bean、事件机制与资源读取容易被忽略的武器内部 bean 是这道清单里容易被轻视的考点。当一个 bean 只被另一个 bean 的某个属性使用时最合理的做法是把它声明为内部 bean通过 setter 注入属性或构造方法注入构造参数来实现。输入里的例子很典型Customer 类引用 Person 类此时只需创建 Person 实例并在 Customer 内部使用不必单独暴露这个 bean。Spring 事件机制也是一个潜在考点。ApplicationContext 支持事件传播当容器中发生事件时注册在监听器中的 bean 可以接收到事件通知。回答事件题时先讲三个角色事件源、事件、监听器再补充 ApplicationEvent 与 ApplicationListener 对应的关系。FileSystemResource 和 ClassPathResource 的对比同样值得留意。FileSystemResource 从文件系统路径读取资源依赖于程序运行的当前目录ClassPathResource 从类路径读取资源项目打包成 jar 后依然能正常读取。实际开发中更常用 ClassPathResource因为它不依赖外部文件系统环境。答题时点出「配置文件随包走」这个经验判断会给面试官留下实际项目经验的印象。4. 配置方式与装配实战XML、Java、注解三选一集合注入与自动装配4.1 三种配置方式的选择策略基于 XML、基于注解、基于 JavaSpring 支持三种配置方式基于 XML 的配置、基于注解的配置、基于 Java 的配置。面试官问「Spring 有几种配置方式」你需要答出这三种并说明各自的适用场景。XML 配置把所有组件以 XML 文件形式统一管理优点是集中、直观缺点是配置文件冗长注解配置把 bean 描述转移到组件类内部在相关类、方法或字段声明上使用注解即可代码更紧凑Java 配置使用 Configuration 和 Bean 注解完全摆脱 XML适合新项目。基于注解的配置在 Spring 2.5 之后开始支持可以用注解替代 XML 方式描述 bean。需要注意一点注解注入会被容器在 XML 注入之前处理也就是说 XML 配置会覆盖注解对同一属性的处理结果。注解装配在 Spring 中默认是关闭的需要在配置文件中添加 context:annotation-config/ 标签才能开启。这在面试中是个高频细节答错就容易暴露知识盲区。4.2 基于 XML 的配置与 Web 场景一个完整实例基于 XML 的配置是 Spring 最经典的接入方式。配置文件以 开头包含一系列的 bean 定义和专门的应用配置选项。Spring XML 配置的主要目的是使所有 Spring 组件都能用 XML 文件形式进行配置依靠 Spring 命名空间的 XML 标签实现主要命名空间包括 context、beans、jdbc、tx、aop、mvc 和 aso。一个简单的 XML 片段可以这样描述 beanbeans bean nameviewResolver classorg.springframework.web.servlet.view.BeanNameViewResolver/ bean namejsonTemplate classorg.springframework.web.servlet.view.json.MappingJackson2JsonView/ /beans这里配置了视图解析器和 JSON 模板两个 bean。BeanNameViewResolver 负责将视图名解析为 Spring 管理的 beanMappingJackson2JsonView 用于把模型数据输出为 JSON 格式。在 Web 应用中web.xml 只需配置 DispatcherServlet 即可满足运行时组件的需求web-app servlet servlet-namespring/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namespring/servlet-name url-pattern//url-pattern /servlet-mapping /web-app这段配置的核心是 DispatcherServlet 与 URL 映射所有请求都会进入名为 spring 的 DispatcherServlet交给 Spring MVC 框架处理。面试如果让手写 Spring MVC 入口配置只需要达到这个程度就能过关。注意 Servlet 类的全限定名要写完整同时设置 load-on-startup 让容器启动时提前初始化避免第一个请求才触发加载带来延迟。4.3 基于 Java 的配置Configuration 与 Bean 的配合基于 Java 的配置由 Configuration 和 Bean 两个注解支撑。被 Configuration 注解的类表示其主要职责是作为 bean 定义的资源由 Bean 注解的方法负责实例化、配置和初始化一个新对象交由 Spring 的 IoC 容器管理作用与 元素类似。一个简单的 Java 配置类如下Configuration public class AppConfig { Bean public MyService myService() { return new MyServiceImpl(); } }这段代码等价于 XML 中的 。Configuration 类内部的方法之间可以直接互相调用用来设置嵌入 bean 的依赖关系。要使用组件扫描则加上 ComponentScan(basePackages com.example)容器扫描指定包路径下被 Component 声明的类找到后注册为 bean。实例化这种配置的方式使用 AnnotationConfigApplicationContext 类public static void main(String[] args) { ApplicationContext ctx new AnnotationConfigApplicationContext(AppConfig.class); MyService myService ctx.getBean(MyService.class); myService.doStuff(); }getBean 方法按类型从容器中获取已经完成初始化和依赖注入的实例。这个例子展示了纯 Java 配置的完整链路配置类 → 容器加载 → 获取 bean → 调用业务方法。如果是在 Web 应用中使用这种配置需要改用 AnnotationConfigWebApplicationContext配合 ContextLoaderListener 和 DispatcherServlet 完成初始化。答题时强调「Bean 负责定义ComponentScan 负责发现AnnotationConfigApplicationContext 负责启动」这个分工思路会更清楚。4.4 集合注入与 Properties 注入XML 配置的四个标签Spring 提供了四种集合类的配置元素 装配可重复的 list 值装配没有重复的 set 值注入键和值可以是任意类型的键值对 注入键和值都是字符串类型的键值对。一个集合注入的 XML 片段如下beans bean idjavaCollection classcom.example.JavaCollection property namecustomList list valueINDIA/value valueUSA/value valueUK/value /list /property property namecustomSet set valueINDIA/value valueUSA/value valueUK/value /set /property property namecustomMap map entry key1 valueINDIA/ entry key2 valueUSA/ /map /property property namecustomProperies props prop keyadminadminexample.com/prop prop keysupportsupportexample.com/prop /props /property /bean /beans注意这里的规律list 和 set 用 元素填值map 用 填键值对props 用 填字符串键值对。面试问到 Properties 注入时除了用 标签还可以补充另一种方式通过 util 命名空间从 properties 文件创建一个 properties bean然后通过 setter 方法注入 bean 引用。这类题通常这么答比较加分先说出四个标签分别对应哪四种集合类型再强调 props 只能存字符串键值对map 键值可以是任意类型。很多面试者会把 map 和 props 混为一谈能主动区分这一点就能从同类面试者里脱颖而出。4.5 自动装配的原理与歧义处理自动装配允许 Spring 容器自动搞定 bean 之间的依赖关系通过在 XML 配置文件中设定即可实现。自动装配可以按照如下方式设置使用 autowire 属性的 byName、byType 等模式或者使用 Autowired 注解完成指定 bean 的自动装配。下面的 XML 片段展示了按名称自动装配bean idemployeeDAO classcom.example.EmployeeDAOImpl autowirebyName /byName 模式根据属性名去容器中查找同名的 bean 完成装配byType 模式根据属性类型去容器中查找匹配的 bean。使用 Autowired 注解前必须先配置 context:annotation-config / 开启注解装配。面试到这里通常会有追问「如果 byType 找到多个候选对象怎么办」标准答案是配合 Qualifier 指定具体的 bean 名称消除歧义。自动装配的基本原则是容器负责匹配开发者负责提供清晰的 bean 定义。5. 注解三件套与常见错误Required、Autowired、Qualifier 怎么答才不丢分5.1 Required、Autowired、Qualifier 的考点定位Required 注解应用于设值方法用来检查指定属性是否被赋值如果配置时没有给这个属性注入值容器初始化时会抛出异常。Autowired 更灵活可以应用于设值方法、非设值方法、构造方法和变量按类型自动装配所需的依赖。Qualifier 与 Autowired 搭配使用用于消除特定 bean 自动装配的歧义。不少面试者分不清 Required 和 Autowired 的职责差异其实一句话可以讲明白Required 是强制校验「必须装配」Autowired 是启动「自动装配」Qualifier 是解决「装配哪个」。面试官如果让你举例说明这三个注解建议按「校验 → 装配 → 指定」的逻辑展开并说明 Autowired 默认先按类型找找不到唯一匹配再回退到按名称找。5.2 构造器注入与 Setter 注入的对比从代码面试到源码追问构造器注入和 Setter 方法注入是依赖注入的两种最常用实现方式。构造器注入在 Bean 创建时强制传入依赖好处是依赖不可变且必填创建后对象状态完整坏处是当依赖过多时构造器参数列表会变得冗长。Setter 注入在 Bean 创建后再调用 setter 方法补充依赖好处是依赖可以选填、后续可以重新赋值坏处是对象创建后可能处于未完全初始化的状态。答题时建议补充目前 Spring 团队的推荐倾向核心强制依赖优先用构造器注入可选依赖用 Setter 注入。追问到「为什么推荐构造器注入」时可以从不可变性和测试便利性两个角度展开。构造器注入还能有效避免循环依赖的发生因为对象在创建阶段就明确了依赖图。5.3 高频失分点面试者最常踩的四个坑第一个失分点是把 bean 作用域名称记混。global-session 是 Portlet 应用下所有 portlet 共享的全局存储变量作用域与 Servlet 中的 session 作用域效果相同很多面试者听到 global-session 就默认它是 Web 通用配置这是错的。错在哪实际项目很少用 Portlet 容器这个作用域容易记忆错位。怎么答对先答五个标准作用域全称再单独说明 global-session 的使用前提是 Portlet 容器。第二个失分点是对「单例 bean 是否线程安全」回答绝对化。有人说「Spring 单例都是安全的」有人说「Spring 单例都不安全」两种极端都会被面试官抓漏洞。怎么答对框架不负责线程安全无状态 bean 天然安全有状态 bean 需要自行设置作用域为 prototype 或做并发控制。第三个失分点是混淆 Configuration 与 ComponentScan 的职责。Configuration 标记类是 bean 定义资源ComponentScan 负责扫描指定包下的组件类。常见错误是只写了 Configuration 没加扫描路径导致容器找不到 bean。答题模板配置类负责定义扫描器负责发现容器负责装配。第四个失分点是混淆 FileSystemResource 和 ClassPathResource 的适用场景。FileSystemResource 从文件系统路径读取ClassPathResource 从类路径读取后者更适合打包部署。答题时补一句「实际项目优先使用 ClassPathResource避免依赖服务器文件系统路径」面试观感会完全不同。6. 面试答题节奏从概念到源码的六步拆题法6.1 六步拆题法任何 Spring 问题都能套用的答题结构第一步先复述题干概念用一两句话精准定义不要展开细节。第二步说明概念背后的设计动机为什么需要它、解决什么问题比如 IoC 是解决对象耦合问题。第三步给出核心组件或关键接口按重要程度排列。第四步落到配置写法用 XML 片段、注解或 Java 配置类示意最好附上关键参数。第五步讲执行流程从容器启动到 bean 被获取的完整链路。第六步总结优缺点或候选方案比如构造器注入和 Setter 注入的取舍。掌握这套节奏后任何 Spring 问题都能在 90 秒内答出层次感。6.2 追问链路的预判从这里准备答案不会冷场答完「Spring Bean 生命周期」之后面试官大概率追问初始化顺序怎么排答完「Autowired 自动装配」之后大概率追问找不到唯一候选怎么办答完「单例 bean 线程安全」之后大概率追问那你的项目里哪些 bean 是有状态的你不需要把所有深入的答案提前背全但要在准备每个高频考点时预设两轮追问再准备一层答案。这份经典 25 题清单覆盖了概念背记的层面你还需要针对每一个答案补充一段自己的项目使用场景这也是面试官检验你放心虚不虚的关键手段。从那以后我每次准备 Spring 面试都强制自己把每个考点按「定义 → 动机 → 组件 → 代码 → 流程 → 取舍」六步过一遍而且至少预演两轮追问遇到「你怎么在项目中用到的」这类开放题就不再慌乱。现在拿这份清单先从 IoC 与 DI、生命周期、作用域、配置方式这四块开始每块背熟后再用六步法口头复述两遍最后再过一遍易错点。按这个节奏准备Spring 面试的基础分基本不会失。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站