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