云计算百科
云计算领域专业知识百科平台

Spring 自动装配的 5 种模式:byName、byType 到底有什么区别?

Spring 自动装配要回答的问题是:

给对象的属性赋值时,容器到底按什么规则把依赖注入进来。

很多人刚学 Spring 时听过 byName、byType,但真正开发久了,对这几种装配方式的细节反而说不清了。

而这又恰好是面试爱考的基础题,用来判断你的 Spring 功底扎不扎实。

Spring 一共提供了 5 种自动装配模式:no、byName、byType、constructor、autodetect。

下面逐个说清楚。

一、no:默认,不自动装配

no 是默认模式,表示不做自动装配,依赖全靠手动用 ref 指定。

日常开发基本不会显式配它,因为不写 autowire 属性时,走的就是这个默认行为。

二、byName:按名称装配

byName 是按属性名匹配——容器去查找与当前 bean 属性同名的 bean,找到就注入。

举个例子,bean 里有个属性叫 userDao,容器就去找 id(或 name)也叫 userDao 的那个 bean 注入进来。

在 Spring XML 自动装配模式中,byName 相比 byType 更容易控制。

但在现代 Spring Boot 项目中,这几种 XML 自动装配方式已经较少使用。

三、byType:按类型装配

byType 是按类型匹配——容器去找与属性类型一致的 bean 注入。

问题也正出在这里:

如果找到多个相同类型的 Bean,Spring 无法判断应该注入哪一个,会抛出 NoUniqueBeanDefinitionException。

所以用 byType 有个前提:

同一类型在容器里必须唯一。

只要可能出现多个同类型 bean,就更适合改用 byName 把名称指定清楚。

两者对比,byName 更稳,因为它按名字精确定位;

byType 的匹配范围是整个容器里所有该类型的 bean,容易踩坑。

四、constructor:按构造器参数类型装配

constructor 和 byType 一样是按类型匹配,区别在于它作用于构造函数的参数。

它要求 Spring 能够明确找到匹配的构造参数依赖。

如果存在多个候选 Bean 且无法确定具体注入对象,就会导致装配失败。

还有一种容易翻车的情况:

如果存在多个构造器,Spring 需要根据构造参数进行匹配。

如果存在多个满足条件的构造器,可能导致无法确定使用哪个构造器。

正因为约束苛刻,这种模式用得相对少。

五、autodetect:自动检测

autodetect 交给 Spring 自己判断:

如果类有默认构造方法,就用 byType 装配;

没有默认构造方法,就用 constructor 装配。

匹配到哪种规则就用哪种,不需要人为指定。

小贴士:

autodetect 是 Spring 早期 XML 配置中的自动装配模式,在 Spring 3.0 后已经废弃,现代项目基本不会使用。

怎么选?

模式匹配依据特点适用
no 手动 ref 默认,不自动装配 不想用自动装配时
byName 属性名 名称精确,容易控制 XML 配置中需要按名称匹配时
byType 属性类型 同类型必须唯一,否则报"多个匹配"异常 类型唯一且图省事时
constructor 构造参数类型 要求唯一,构造器重复会报错 较少用
autodetect 自动检测 有默认构造走 byType,否则走 constructor 交给 Spring 判断

如果讨论 Spring XML 时代的自动装配模式,byName 和 byType 使用较多。

但在现代 Spring Boot 项目中,更推荐显式注入,例如构造器注入、@Autowired、@Resource,可读性和可维护性更好。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Spring 自动装配的 5 种模式:byName、byType 到底有什么区别?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!