摘要:这哥们儿小周,是我大学同学,毕业后去了某大厂当 Java 开发。前几年跳槽去了一家新锐 SaaS 公司,一直干得不错。结果今年年初公司收缩,他成了“优化对象”。
这哥们儿小周,是我大学同学,毕业后去了某大厂当 Java 开发。前几年跳槽去了一家新锐 SaaS 公司,一直干得不错。结果今年年初公司收缩,他成了“优化对象”。
“我这几年写得多的是逻辑代码,底层配置都用现成的,真要写 Spring 原生注入,脑子一时转不过弯。”小周叹着气说。
“怎么了?”我问。
他苦笑了一下,说:
“第一轮面试就栽了。人家问我:在 Spring 中怎么注入一个 Java 的集合,比如 List、Set、Map? 我一开始还想说‘这还不简单,直接写就好了’,结果人家一个接一个追问,追得我差点自闭。”
我听了就笑了。
不是嘲笑,是“这题我熟”的那种亲切的笑。
这个问题看似简单,其实层层递进,特别适合用来判断你对 Spring IoC(控制反转)机制的掌握情况。于是,今天我就用这个小问题,展开聊一聊如何在 Spring 中优雅地注入集合。
让我们像面试官那样,层层深入——
我们以一个非常简单的场景开始:假设有一个类 FruitBasket,它需要注入一个水果列表。
好,现在我们准备注入一个 List 类型的集合。
1、XML 配置方式(老派但经典)
是不是有点怀念起 XML 配置的日子?
我曾在 2014 年用 XML 注入一个 List,配完还得关心 bean 的 lifecycle 和 scope,当时觉得自己就是“Spring 工程师之神”。
2、注解 + 配置类的现代姿势
到了现代 Spring Boot 项目中,大家基本都不写 XML 了。那么我们可以用 @Configuration 和 @Bean 方式:
我们通过定义一个 fruitList bean,并把它注入到 FruitBasket 中,是不是非常清爽?
现在我们升级面试难度!
1、注入 Set
假设我们有如下类:
在 XML 中可以这样注入:
注意 Set 是无序去重的,所以结果是:[Apple, Banana]。
在注解方式中同样适用:
2、注入 Map
Map 的注入就更实用了:
XML 配置方式
注解方式:
现在面试官又笑了:“你刚才讲的都是字面量注入,如果我有多个实现类,Spring 能帮我自动注入到集合里吗?”
当然可以!
举个例子,我们有一个接口 FruitProcessor 和多个实现类:
实现类 A:
实现类 B:
在构造函数中注入所有实现:
是不是优雅极了?只要这些实现类都被 Spring 管理,它就会自动装配所有实现。
Spring 还支持用 @Value 注解注入集合配置,比如从 application.properties 中读取。
application.properties
代码中使用:
面试官看到这里,可能已经开始点头了!
到这一步,如果你都答出来了,面试官可能还会顺手加上一些彩蛋问题,比如:
如果集合中有多个 Bean 名称冲突怎么办?如果我只想注入部分实现类?多模块项目中,集合 Bean 的管理是否影响模块间耦合?在 Spring Boot 中使用 @ConfigurationProperties 注入复杂集合配置怎么做?这时候,建议你不急着详细展开,而是谦虚地说:“这个点我有一些了解,比如可以通过 Qualifier 精细控制,或者用 @Primary 指定默认实现,如果有需要我可以深入写一段 demo。”这样能体现出你有技术深度,也有良好的沟通能力。
如何注入 List、Set、Map;XML 与注解配置的区别;自动装配多个实现到集合;使用 @Value 从配置文件注入集合;面试中的“加分项”与应对策略。这正是面试中常见的“递进式问题”:你以为它只是一个集合,其实它考察的是你对 Spring IoC 容器、Bean 注入方式、组件管理能力的理解。
一道好面试题,往往不在于它多难,而在于它能不能看出一个人对基础的掌握是否扎实。就像 Spring 注入集合,不是高级技术,但能把它讲清楚,往往比炫技更打动人。
所以啊朋友们,不要忽略这些“小”问题。
你认真对待的每一个“简单题”,都是通往“大厂 offer”的垫脚石!
如果你觉得这篇文章还不错,欢迎分享、点赞、点“在看”!
有任何问题,欢迎在评论区留言,一起交流!
来源:慧德教教育