Spring面试25道经典题:IoC、Bean生命周期与配置方式全解析 简介经典Spring面试问答整理面向Java开发工程师及正在备战Spring相关岗位面试的求职者覆盖IoC控制反转、依赖注入、Bean生命周期与作用域、注解配置、自动装配等核心高频考点同时涉及Spring框架模块划分、BeanFactory与ApplicationContext对比、事务管理等实际面试常见问题帮助读者快速建立Spring知识脉络并查漏补缺。压缩包内含1个docx文档共25道经典题目及详细参考答案文件体积约88KB轻量易读方便随时随地翻阅学习。已有403人学习文档按问答形式逐题展开适合面试前集中复习也可作为日常巩固Spring基础知识的随身笔记。内容在讲解核心原理时还结合了典型场景与设计模式说明有助于提升对框架底层机制的理解为后续深入源码学习打下基础。1. Spring面试到底考什么25道经典题背后的考点地图Spring是Java后端面试绕不开的关卡IoC、Bean生命周期、配置方式、线程安全这些点几乎每场都会被问到而且面试官特别喜欢往深处追问一层。这25道经典题恰好覆盖了Spring面试的完整考点链从概念到落地、从XML到注解、从单例到设计模式全是最常考的骨架题。它不是一份拿来背的清单而是一张考点地图。面试官问什么是控制反转不是要你背书是要听你怎么把概念落到代码里、再落到项目场景中。备考的核心就是把这张地图上的每个考点拆成概念一句话、代码一段、场景一个的答题模板。下面按这条考点链依次拆解照着准备基本能覆盖大多数Spring面试题。2. 高频考点IoC与依赖注入的三种实现方式与答题模板2.1 概念题怎么答IoC是思想DI是机制面试官问什么是控制反转IOC和什么是依赖注入时最忌讳把两者混为一谈。正确答题顺序是先给IoC下定义再给出DI的定义最后点明两者的关系。控制反转是软件工程中的一种设计范式核心在于对象之间的耦合关系在编译时通常是未知的而是在运行时由装配器对象来绑定。传统编程里业务逻辑的流程由应用程序中早已设定好关联关系的对象决定用了IoC之后业务逻辑流程由对象关系图决定这个关系图由装配器负责实例化对象间关联关系的定义也被抽象化了。听完这段如果面试官没喊停立刻补一句关键收尾绑定的过程就是通过依赖注入实现的依赖注入是控制反转的基础——否则组件不受框架控制时框架根本不知道要创建哪个组件。在Java中依赖注入有三种实现方式构造器注入、Setter方法注入、接口注入。Spring实际使用前两种接口注入基本只停留在理论层面。答到这里再主动补一句Spring里的IoC以BeanFactory和ApplicationContext为核心就能自然衔接到下一题。2.2 构造器注入与Setter注入三个维度对比第22题构造器注入和setter方法注入之间的区别几乎是必考的对比题最优答法分三个维度必要性、可变性、可测试性。必要性层面构造器注入强制依赖在对象创建的瞬间就必须完整提供不会出现对象建好了但依赖还是空的这种中间状态Setter注入允许对象先创建、后装配适合可选依赖但存在使用到未注入状态的风险。可变性层面构造器注入一旦创建就不可换依赖Setter在运行期还能调setter替换。可测试性层面构造器注入直接new对象传参就能单测Setter需要额外调用setter。Spring团队官方推荐构造器注入但面试别只答结论补一句应用场景更显功底业务服务类多用构造器注入配置类里的可选参数用Setter更灵活。下面这段XML展示的是Setter注入真实写法同时也是第12题内部Bean的绝佳示例bean idcustomerBean classcom.example.common.Customer property nameperson bean classcom.example.common.Person property namename valuelokesh / property nameaddress valueIndia / property nameage value34 / /bean /property /bean当某个Bean只被另一个Bean使用一次时直接在property或constructor-arg内部声明不需要在顶层注册这就是内部Bean。说到这可以顺带点一句内部Bean没有id外部拿不到它的引用这种细节最容易让面试官眼前一亮。2.3 真题演练BeanFactory与ApplicationContext的区别第5题是Spring面试出场率最高的题之一。标准答题路径是三层递进先讲关系再讲加载时机差异最后讲扩展功能。关系上ApplicationContext是BeanFactory的子接口属增强版。BeanFactory是Spring IoC容器的核心接口可以理解为含有Bean定义的工厂类在客户端请求时实例化bean同时负责Bean生命周期和初始化/销毁方法的调用。ApplicationContext在具备这些能力之外还扩展了三个能力支持国际化的文本消息、统一的资源文件读取方式、支持已注册在监听器中的Bean事件。加载时机是关键得分点BeanFactory是懒加载调用getBean()时才实例化ApplicationContext是预加载容器启动时就实例化所有单例Bean所以能提前暴露配置错误代价是启动更慢、内存占用更高。常见ApplicationContext实现类有三种逐一报名字并给出一行代码// classpath下的XML配置文件 ApplicationContext context new ClassPathXmlApplicationContext(bean.xml); // 文件系统中的XML配置文件 ApplicationContext context new FileSystemXmlApplicationContext(bean.xml); // Java配置类 ApplicationContext ctx new AnnotationConfigApplicationContext(AppConfig.class);面试官追问你项目里用哪种答AnnotationConfigApplicationContext对应Spring Boot和Java Config趋势再补一句老SSH项目才会看到ClassPathXmlApplicationContext。把这句说出来等于告诉面试官你见过两种年代的项目。2.4 注入Collection和PropertiesXML配置的实操题第14题考Spring如何注入Java集合类答法就是报出四种标签并各给一段代码 装配可重复的List值装配无重复的Set值注入键值对任何类型都可 注入键和值均为字符串的键值对。bean idjavaCollection classcom.example.JavaCollection property namecustomList list valueINDIA/value valueUSA/value /list /property property namecustomMap map entry key1 valueINDIA/ entry key2 valueUSA/ /map /property property namecustomProperties props prop keyadminadminnospam.com/prop prop keysupportsupportnospam.com/prop /props /property /bean第15题专门考Properties注入除了上面的 写法还有一种高级答法用util命名空间从properties文件创建独立的Properties Bean再通过setter方法注入引用。两种方法对比一下 适合配置内联少量键值对util方式适合复用外部配置文件。这题答完面试官对你的XML功底基本心里有数了。3. 高频考点Bean生命周期、作用域与线程安全真相3.1 Bean生命周期四组回调一个不落第10题考Bean生命周期时面试官想听的不是初始化然后销毁六个字而是完整的回调机制。Spring Bean的生命周期由BeanFactory管理分成两组回调初始化之后调用的回调和销毁之前调用的回调。管理这些回调一共有四种方式缺一不可InitializingBean和DisposableBean接口。afterPropertiesSet()在属性设置完成后触发destroy()在销毁前触发。缺点是接口方法名固定、侵入代码。针对特殊行为的Aware接口。BeanFactoryAware、ApplicationContextAware等用于让Bean感知容器环境。这一条答出来通常能拉开差距很多候选者只记得前两条。配置文件里的custom init-method和destroy-method。这是最灵活的方案任意类里写任意public方法在XML里配对声明即可不要求实现框架接口bean iddemoBean classcom.example.task.DemoBean init-methodcustomInit destroy-methodcustomDestroy /beanPostConstruct和PreDestroy注解。Java标准注解标注在方法上由容器扫描执行适合Java Config和注解驱动项目。答题时建议顺手提一句执行顺序构造Bean实例后先执行PostConstruct再走InitializingBean的afterPropertiesSet最后才调init-method销毁侧顺序正好相反先PreDestroy再destroy()最后destroy-method。能说出这个顺序这道题直接满分。3.2 五种作用域一张表过完注意两个坑第11题考Bean作用域五种作用域名称都自说明但面试容易丢分在两个细节上。先把五种作用域背熟作用域实例数生命周期典型场景singleton每个容器一个容器启动到关闭默认无状态Service/DAOprototype每次请求创建新实例获取Bean时创建有状态对象request每个HTTP请求一个实例请求结束即失效Web请求级临时对象session每个Session一个实例Session过期失效用户级状态对象global-session每个全局Session一个Portlet应用场景多个Portlet共享全局变量第一个易错点是singleton的边界它是每个Spring容器一个不是每个JVM一个两个容器各自管理各自的单例。第二个易错点在于prototype容器创建后就撒手不管了不会执行它的destroy回调因为容器不再跟踪prototype Bean的生命周期。很多候选人背表很熟被追问prototype作用域下destroy方法会执行吗直接卡壳。给出明确答案后再补一句所以prototype Bean的资源释放通常靠Bean自身或调用方管理面试官会点头。3.3 单例Bean线程安全这是陷阱题第13题是个典型的陷阱题面试官故意问Spring框架中的单例Bean是线程安全的吗。这个问题的正确答案非常明确不是Spring并没有对单例Bean做任何多线程封装处理线程安全和并发问题需要开发者自行解决。但这里有个微妙之处为什么很多人觉得Spring单例Bean安全原因在于大部分Spring Bean没有可变状态比如Service类和DAO类没有成员变量天然线程安全。如果你的Bean有多种状态比如ViewModel对象就必须自行保证线程安全。最浅显的解决办法就是把多态Bean的作用域从singleton改为prototype。面试作答时用分两类结构无状态Bean直接用单例完全没问题这是主流有状态Bean要么改prototype要么用ThreadLocal等机制隔离状态。最后补一句实际项目里我会先看Bean里有没有可变的成员变量再决定要不要改作用域把话题从背书拉到工程判断。3.4 真题演练Spring用了哪些设计模式怎么答不落俗套第25题考Spring中使用的设计模式。这道题看似开放其实有固定得分点。至少要说清五种工厂模式——BeanFactory用来创建和管理Bean单例模式——默认的singleton作用域代理模式——AOP通过代理对象包裹目标方法模板方法——JdbcTemplate、RestTemplate等观察者模式——ApplicationEvent和监听器机制。答题技巧是每个模式都带一句用在哪别只甩名词。比如Spring的AOP用代理模式事务管理就是靠生成代理对象在目标方法前后追加事务逻辑。这样答比干列举有说服力多了。顺带把第23题事件机制串进来Spring的事件类型基于ApplicationEvent通过ApplicationContext发布由ApplicationListener监听这就是观察者模式在容器里的落地。3.5 文件资源加载FileSystemResource和ClassPathResource的区别第24题容易被忽略但大厂偶尔会考。FileSystemResource基于文件系统中的文件路径读取资源ClassPathResource基于classpath类路径读取。前者的路径锚点是项目运行目录后者的锚点是编译后classes目录。回答时给一个判断标准打包成Jar运行后ClassPathResource更可靠因为文件系统路径在部署环境下经常不可控。4. 高频考点三大配置方式与注解装配的实战答法4.1 三种配置方式怎么选XML、注解、Java Config第6题问Spring有几种配置方式标准答案是三种基于XML的配置、基于注解的配置、基于Java的配置。面试时按时间线和适用场景讲才有层次最早的SSH项目全是XML配置文件和Java代码分离但冗长Spring 2.5引入注解把Bean描述搬到组件类内部XML瘦身成 context:annotation-config/ 加Bean定义Spring 3.0后Java Config成为主流Configuration和Bean接管配置XML逐渐退居为兼容旧项目的方案。在Spring Boot体系里Java Config 注解扫描是默认姿势但XML仍在老项目里大量存在。面试官真正想验证的是你既会看老代码也知道新趋势。所以别只答有三种要顺着讲清楚为什么从XML迁到Java Config——类型安全、可重构、IDE友好。4.2 XML配置细节命名空间与DispatcherServlet第7题考XML配置答题锚点是Spring主要命名空间context、beans、jdbc、tx、aop、mvc和aso每个命名空间对应一组XML标签能力。核心配置文件以 开头里面是Bean定义和应用配置选项。给一段实际配置作为例证beans bean nameviewResolver classorg.springframework.web.servlet.view.BeanNameViewResolver/ bean namejsonTemplate classorg.springframework.web.servlet.view.json.MappingJackson2JsonView/ bean idrestTemplate classorg.springframework.web.client.RestTemplate/ /beans如果是Web应用还要配DispatcherServletweb.xml里声明Servlet并映射到根路径这已经是Spring MVC的入口配置。完整答法可以补一句DispatcherServlet本质是一个Servlet负责拦截请求并分发给Controller所有Spring MVC组件的装配都从它开始。这段一说配置题的广度和Web层功底都露出来了。4.3 Java ConfigConfiguration与Bean的正确打开方式第8题考Java配置核心是Configuration和Bean两个注解。Configuration注解类表示这个类的主要目的是作为Bean定义的资源Bean标注的方法负责实例化、配置和初始化一个新对象交给IoC容器管理作用等同于XML里的 元素。给出代码就是最好的回答Configuration public class AppConfig { Bean public MyService myService() { return new MyServiceImpl(); } }这段配置等价于XML里的 。实例化方式是用AnnotationConfigApplicationContext读取配置类ApplicationContext ctx new AnnotationConfigApplicationContext(AppConfig.class); MyService myService ctx.getBean(MyService.class); myService.doStuff();再往深处讲一步配合组件扫描用ComponentScan指定包路径容器自动扫描包内带Component的类并注册成BeanConfiguration ComponentScan(basePackages com.example) public class AppConfig { // ... }Web环境下要用AnnotationConfigWebApplicationContext配置到ContextLoaderListener或DispatcherServlet的contextClass参数里。这题的加分细节是点名Configuration类内部调用Bean方法可以设置Bean间的依赖关系大多数人会漏这句。4.4 注解装配默认关闭这个坑必须主动提起第9题考注解配置最容易被忽略也最常丢分的是这个前置条件注解注入在Spring中是默认关闭的需要先配置 context:annotation-config/ 才能启用注解装配模式。beans context:annotation-config/ !-- bean definitions go here -- /beans答完配置再进入注解主体。核心注解分四类Required作用于设值方法强制属性必须被设置Autowired可作用于属性、方法、构造方法按类型自动装配Qualifier配合Autowired消除特定Bean装配的歧义JSR-250系列包括Resource、PostConstruct、PreDestroy。面试官通常会追问Autowired和Resource有什么区别这题在清单里没有但属于高频延伸题。标准答法Autowired是Spring注解按类型注入Resource是JSR-250标准注解默认按名称注入找不到名称再按类型。还会追问注解和XML同时存在时谁生效答案是注解注入在XML注入之前被处理XML会覆盖同属性的注解结果。4.5 自动装配模式与Qualifier救场第16题考自动装配先讲XML机制。Spring容器可以自动装配合作关系Bean的关联关系在Bean配置上设置autowire属性有以下几种模式byName按属性名查找BeanbyType按类型查找Beanconstructor用于构造器参数no表示不自动装配。bean idemployeeDAO classcom.example.EmployeeDAOImpl autowirebyName /接下来自然引出Autowired注解它在Spring中按类型自动装配。但实际项目里接口常有多个实现按类型装配产生歧义Spring不知道注入哪个。此时用Qualifier指定Bean名称消除歧义Autowired Qualifier(employeeDAOImpl) private EmployeeDAO employeeDAO;答题收尾时给一个工程选择byName依赖命名规范脆byType遇到多实现就歧义需要Qualifier救场实际项目里更推荐构造器注入加Qualifier兼顾装配确定性和可测试性。这段话能让面试官看到你不是只背了XML而是真在项目里权衡过。5. 易错题/失分点5道高频误答与正确答法5.1 把IoC直接等同于DI错在哪回答什么是控制反转时直接说控制反转就是把new对象的操作交给Spring也叫依赖注入。 为什么错IoC和DI不是一个概念。IoC是设计思想DI是实现这种思想的具体机制两者是从属关系不是同义词。 怎么答对先说IoC是解耦思想——对象间耦合关系在编译时未知运行时由容器绑定再说DI是着陆方式——编译阶段不知道依赖来自哪个类由容器实例化并注入最后补一句DI是IoC的基础否则容器无法知道创建哪个组件。5.2 BeanFactory与ApplicationContext的加载时机答反错在哪答成BeanFactory启动时预加载所有BeanApplicationContext延迟加载。 为什么错把两者完全搞反了。BeanFactory是懒加载直到getBean()调用才实例化BeanApplicationContext是预加载启动时就把单例Bean全部实例化。 怎么答对先把加载时机说对再说扩展功能。扩展功能至少报三个国际化文本消息、统一资源文件读取、监听器中注册的Bean事件。加载时机是硬性得分点一旦答反后面功能答得再多也救不回来。5.3 说注解装配默认开启错在哪回答Spring注解配置时直接掏出Autowired就开写完全不提前置配置。 为什么错Spring框架里注解装配默认关闭必须显示配置 context:annotation-config/ 才会生效否则注解全被忽略。Spring Boot的自动配置掩盖了这个底层事实所以背过Spring Boot的人特别容易踩这个坑。 怎么答对先承认默认关闭再贴 context:annotation-config/ 开启配置然后说明注解注入先于XML注入被处理、XML会覆盖同属性的注解结果。5.4 单例Bean是线程安全的这句话本身就是错的错在哪听到单例就默认安全直接断言Spring的单例Bean线程安全。 为什么错单例模式解决的是实例数量问题不解决多线程竞争问题。Spring没有对单例Bean做锁、ThreadLocal之类任何封装所以它本身不保证线程安全。 怎么答对无状态Bean场景下天然安全这是大部分Service和DAO是安全的的原因有状态Bean必须自行保证线程安全最直接的方案是把作用域改成prototype或用ThreadLocal隔离。5.5 构造器注入和Setter注入只背结论不讲依据错在哪只答一句Spring推荐构造器注入然后在追问下支支吾吾。 为什么错对比题要的是判断依据不是推荐结论。面试官想听的是你清楚构造器注入百分百保证依赖完整、Setter注入允许延迟装配但存在半初始状态。 怎么答对用三个维度展开对比——必要性看是否强制提供依赖可变性看运行期能否换实现可测试性看单测时构造对象是否方便。最后落到选择标准必需依赖构造器优先可选依赖Setter更灵活。6. 答题技巧三步应答法与高频追问预案6.1 三步应答法概念-代码-落地Spring面试题大多有共同套路按概念一句话、代码一段、落地场景一个三步走基本不慌。第一步用一句话定调比如IoC是一种解耦思想DI是它的实现机制别展开等面试官追问。第二步拿代码证明你会写生命周期题就贴init-method配置注入题就写Autowired加Qualifier。第三步一定落到场景我项目里Service都用构造器注入遇到多实现就配合Qualifier指定Bean名。三步走完面试官至少认为你既懂原理又能动手。6.2 高频追问预案把25题串成网状Spring的追问路径其实很固定。你答完BeanFactory和ApplicationContext的区别他大概率接着问那你Spring Boot项目里用的是哪个Context你答完Bean生命周期他会追问如果同时有init-method和PostConstruct执行顺序谁先谁后。这类追问考的是知识网络。建议把25题按链路串起来IoC概念三种注入配置方式Bean生命周期作用域线程安全注解装配事件与设计模式。答任何一问前先在脑中定位自己处于链上哪一环被追问时就能顺着链往上下游接话而不是干愣着。6.3 经验面怎么串把考点锚定到项目三层如果面试就着项目经历问Spring别只答我们项目用了SpringBoot要把考点锚定到三个层面。容器层面说你项目里哪些类被IoC管理——Controller依赖Service、Service依赖DAO配置层面说你们用Java Config加注解扫描没有XML运行层面说事务靠AOP声明式管理切面代理包住了Service方法。哪怕只是CRUD项目也能用这套结构撑起我理解容器在管理我的Bean的深度。我备考这25道题最深的一条教训是干背答案过不了追问。以前我把单例Bean线程安全背成Spring默认安全结果被面试官连续追问你项目里那个带状态的后台线程池怎么办当场卡住。从那以后我每次复习Spring都强制自己走一遍概念到代码到场景三步就算只是写个小Demo验证Bean生命周期回调顺序也比反复啃文档管用。希望帮到你。本文还有配套的精品资源点击获取