新手最容易忽略!Spring 自动装配的 5 种方式全解析

原文来自于:zha-ge.cn/java/105

新手最容易忽略!Spring 自动装配的 5 种方式全解析

初入 Spring 世界的那会儿,我像拿着魔法棒的小巫师,对什么都感兴趣,尤其是"自动装配"这个听起来特别高深的词。可谁能想到,自动装配的"打开姿势"居然有那么多种,每个都不太一样,一不小心还会踩雷。回忆那段日子,就像玩拼图,时不时发现漏了几块。今天就来聊聊,这 5 种常见的 Spring 自动装配方式,我是怎么踩坑、摸索、顿悟一路走来的。


从注解到 XML,五花八门的装配

那时候,我看到网上一堆 Spring 示例,装配方式眼花缭乱。光是注解就好几种,什么 @Autowired@Resource@Inject,外加"古董级"的 XML 配置和稍微进阶点的 JavaConfig。真怀疑 Spring 团队是不是收集癖------配置方式务必凑一个"全家桶"才舒服。

先列张小表自个儿压压惊⬇️:

注入方式 配置例子 重点/特性
注解:@Autowired @Autowired Foo foo; 按类型注入
注解:@Resource @Resource Foo foo; 按名字优先,再按类型
注解:@Inject @Inject Foo foo; JSR-330 标准
XML <property ... /> 祖传方式,略繁琐
JavaConfig (@Bean) @Bean public Foo ... 灵活、可编程

刚入行的时候,遇到 demo 代码用的方式跟公司项目上的方式对不上,还会自我怀疑:到底哪一种才是"主流"?


踩坑瞬间

分享两个当年让我怀疑人生的坑:

  1. @Autowired + 多个实现类彻底乱套。 比如我有两个 Bean 都实现了同一个接口,结果注入的时候 Spring 直接给我报错:expected single matching bean but found 2,气得我怀疑是不是 Spring 崩了,其实人家是诚实地告诉你"不知道选谁"。

  2. @Resource 靠名字结果 Bean 名拼错无声挂掉。 @Resource 内部优先按名字找,某次 copy 代码手滑拼了个"fooSercice"(没错,我拼错了),编译 OK,但运行就是注不进来。憋屈到哭。后来加了个 name 属性才搞定。

来一段经典踩雷代码感受下那种无助(简化版):

java 复制代码
public class MyService {
    @Autowired
    private FooService fooService; // 如果 FooService 有多个实现会炸

    @Resource(name = "barService")
    private BarService barService; // "barService" 拼错了,死活注不进来
}

这世界,唯有 Spring 的装配方式,能让你短短两行代码,体会"天堂地狱一线间"。


经验启示

现在回想,自动装配这事其实就那么回事,重要的是:

  • 搞清楚注解原理和默认行为

    • @Autowired → 按类型,多个要配合 @Qualifier
    • @Resource → 按名字,没找到再按类型
    • @Inject → 类似 @Autowired 不支持 required=false
  • Bean 多实现时,说明"谁才是你最爱的孩子" 指定 @Qualifier 或者给 Bean 起个好记又不易拼错的名字。

  • 配置方式别乱搅和 一套项目,坚持一种风格不容易出错。团队约定优于"想怎么写怎么写"。

  • 引用外部 Bean,优先 JavaConfig + 注解 现在 XML 虽然偶尔还用,但没特殊需求就别折腾了。

还有就是:遇到注入失败第一时间别怀疑 Spring,先怀疑自己名字拼错、Bean 没加注解、配错包。Spring 很老实,不会偷偷"帮你一把"。


写到这我都怀念起当年被注解支配的月光夜晚。如今踩过坑,像会骑自行车一样,再回头觉得"自动装配"不过如此。希望你别像我一样,在 Bean 的名字上和队友"灵魂互换",配好了自动装配就能愉快摸鱼啦。


有没有别的"骚操作"?当然有!不过今天就先聊到这。Java 社区的故事还长。别忘了,天天写代码,不如偶尔写写自己的代码故事收个尾巴😉

相关推荐
okjohn2 分钟前
浅谈需求分析与管理
java·架构·系统架构·软件工程·产品经理·需求分析·规格说明书
用户03321266636716 分钟前
Java添加、设置和删除PDF图层:
java
荣光波比23 分钟前
K8S(十)—— Kubernetes核心组件详解:Pod控制器与配置资源管理
java·容器·kubernetes
m0_6515939131 分钟前
企业级订单系统架构设计:领域驱动 vs 数据驱动实践指南
java·系统架构·领域驱动ddd
WangMing_X32 分钟前
C#上位机软件:2.5 体验CLR实现多语言混合编程
java·开发语言·c#
青云交41 分钟前
Java 大视界 -- Java 大数据在智慧交通停车场智能管理与车位预测中的应用实践
java·数据采集·数据清洗·智慧交通·停车场智能管理·智能收费系统·车位预测
豐儀麟阁贵1 小时前
4.4数组的基本操作
java·开发语言·数据结构·算法
组合缺一1 小时前
全球首个支持 IETF JSONPath (RFC 9535) 标准的 Java 框架,Snack4-Jsonpath v4.0.0 发布
java·开发语言·json·jsonpath
智海观潮1 小时前
JVM垃圾回收器、内存分配与回收策略
java·大数据·jvm
vx Biye_Design1 小时前
servlet宠物医院管理系统-计算机毕业设计源码77418
java·vue.js·spring·servlet·eclipse·mybatis