大家好,我是小米,一个爱敲代码、爱喝奶茶、爱分享的 31 岁程序员大哥哥。
前几天,我去参加了一家大厂的社招面试,碰巧面试官劈头盖脸就问了我一个“经典老八股”——
“你能说一下什么是 Spring Beans 吗?”
我当时笑了笑,心想这题我太熟了,Spring 是我最早接触的框架之一,从 Spring3 到 SpringBoot,再到 SpringCloud,一路陪我走到现在,真的是有感情了。
所以这篇文章,我就来和大家分享下我当时是怎么回答的(当然现场比这个简洁点,面试后我又回忆整理了很多扩展知识),希望能帮到正在面试的你,或者正在系统学习 Spring 的你。
先来点小故事:我和 Spring Beans 的初相遇
还记得我刚入职第一家公司,那时候还在用 Spring,XML 配置漫天飞,我那时刚学完 JavaSE,听说要学 Spring,直接有点头大。
有一天师傅拍着我的肩说:
“小米啊,这一段代码是配置 Spring Beans 的,咱们系统中最重要的就是 Bean 了,搞懂了你就能走上人生巅峰。”
我当时一脸懵:“Bean 是什么?是绿豆吗?”
师傅翻了个白眼:“你可以理解成是 Spring 世界里的一切,配置里定义的每个 Java 对象,都叫 Bean。”
当时我就记住了:Bean 是 Spring 中的核心组件,是被 Spring 容器管理的对象。
一句话定义 Spring Bean
在正式讲概念之前,我们先来一段“官方范式”答法,这是我在面试时的开场白:
Spring Bean 是由 Spring IoC 容器实例化、组装和管理的对象,通常是应用程序中的核心组件。我们可以通过 XML、注解或者 Java 配置的方式将普通的 Java 类声明为 Spring Bean,由容器来统一管理它的生命周期和依赖关系。
是不是有点官方?别急,接下来我会把它掰开揉碎,一点点讲清楚。
为什么要有 Bean?
咱们开发的时候,难道不是 new 一个对象就好了?为什么非要让 Spring 管理呢?
举个例子:
很普通,对吧?可是一旦业务复杂了:
- 对象之间依赖越来越多
- 管理生命周期越来越麻烦
- 想要解耦、替换实现越来越难
Spring 就站出来说:“别担心,我来帮你统一创建这些对象,还帮你把它们组装起来。”
于是就有了 IoC(控制反转) 和 DI(依赖注入)的概念,而 Spring Bean 就是 IoC 容器管理的“居民”。
Bean 的几种定义方式
在 Spring的时代,我们主要用 XML 定义 Bean,现在注解和 Java Config 也很常见了,这里我把三种方式都给大家展示一下:
1. XML 配置(经典老派)
你看,这就像是 Spring 容器的“户口本”,我们把所有的对象都登记了,Spring 会帮我们创建并注入它们的依赖。
2. 注解方式(现代主流)
加上 @Component、@Repository 等注解,Spring 会自动扫描包下的类,把它们注册为 Bean。
3. Java Config 配置(注解控福音)
这种方式更灵活、可测试,也不依赖注解扫描,更受一些框架开发者的青睐。
Spring Bean 的生命周期
很多人理解 Spring Bean 只是“new 出来而已”,但其实它有一整个生命周期!
我面试时就顺手画了个图在纸上,讲给面试官看(字丑忽略):
- 实例化(Instantiation)
- 属性注入(Populate properties)
- 感知接口调用(如 BeanNameAware、ApplicationContextAware)
- 初始化前处理(BeanPostProcessor#postProcessBeforeInitialization)
- 初始化方法(@PostConstruct 或 InitializingBean)
- 初始化后处理(BeanPostProcessor#postProcessAfterInitialization)
- 使用中
- 销毁前处理(@PreDestroy 或 DisposableBean)
- 销毁
是不是挺复杂?但大多数我们只关心几个环节:
- 创建时机(单例 or 多例)
- 注入时机(构造器 or setter)
- 销毁时机(有没有释放资源)
Bean 的作用域(Scope)
Spring 默认 Bean 是单例的(singleton),但它支持多种作用域:
设置方式:
Bean 的依赖注入方式
在面试中我还特别提到了一点:Bean 的依赖注入方式,这是体现设计思想的地方:
1. 构造器注入(推荐)
优点是依赖不可变、强制依赖明确、便于测试。
2. Setter 注入(有些框架兼容性好)
适合可选依赖。
3. 字段注入(最简单但不推荐)
对测试不友好,不易扩展。
Spring Bean 相关的常见注解
来个表格一键掌握:
小米的面试答题技巧
说实话,这种问题本身不难,但 面试中拼的不是你是否知道,而是你表达得是否有条理、有逻辑、有深度。
我一般会这样回答:
- 一段定义:什么是 Spring Bean
- 两种理解角度:
-
- 容器视角:由谁创建,怎么管理,生命周期
-
- 程序员视角:怎么用,怎么注入,怎么配置
- 三种配置方式:XML、注解、Java Config
- 补充点亮点:
-
- 生命周期
-
- 作用域
-
- 依赖注入方式
-
- Spring 的发展历程(这题太适合加点“版本”亮点)
总结一下
如果你看到这里,小米想给你一个抱抱,因为你已经远远超过很多浮躁的“看标题党”程序员啦。
今天我们讲了:
- 什么是 Spring Bean
- 为什么需要 Bean 管理
- 三种定义方式:XML、注解、Java Config
- 生命周期和作用域
- 依赖注入的三种方式
- 常见注解
- 面试答题的技巧和节奏
END
其实每一次的面试,都是一次整理自己认知的机会。别小看一个“老掉牙”的问题,它可能就是你和 offer 之间的那堵墙。
Spring 虽然有点老了,但它是我们无数人入门的起点。我们从“配置 Bean”开始,学会了依赖注入、IoC 的哲学思想,也慢慢走进了更深的架构设计世界。
如果你觉得这篇文章有用,欢迎转发给你正在面试的小伙伴,也欢迎关注小米,咱们一起把技术走得更远
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!