spring 如何加载多个同类型实例

spring 如何加载多个同类型实例

【背景】我们都知道spring在初始化容器的时候, 会往容器中默认按照单例模式初始化各种类型对象一个实例。 然后我们可以使用 @Autowired 进行实例的依赖注入。 那么现在如果我想在容器中注入同一类型的多个不同的实例, 要怎么做呢?
【准备工作】
实例对象
在这里插入图片描述
以及一个configuration类,配置类。
我们直接加载2个同类型的 City bean看看。
在这里插入图片描述
然后我们在另一个Bean内注入这个 City 的实例。

在这里插入图片描述

我们可以看到idea直接给提示了, 说无法注入,因为有2个 City 类型的实例。
那么如何在注入了2种类型的同时,再注入这种类型不报错呢 ?

【方法一】
使用 @Primary 注解在其中一个 生成的 Bean 上面加上此注解, 那么在实例化City Bean 的时候, spring 会优先去加载这个Bean。 如果没有指定的话 。
在这里插入图片描述
【方法二】
给@Bean 注解添加 name属性添加值。
在这里插入图片描述
这样, spring 也会把这2个实例都加载到容器中. 然后我们要在自己的bean中注入这2类的实例有2种方法.

① 我们在依赖注入的时候, bean 的变量名称 和 @Bean(变量) 设置的这个属性的值 要保持一致, 就可以2者都注入.
在这里插入图片描述
如果都是用 city 这个变量的话, 那么会直接报错的.
在这里插入图片描述
② 我们还是使用注解 @Qualifier(“city1”) 这个可以用来指定, 我们依赖注入哪个bean.
在这里插入图片描述

好, 那么看到这里, 就会存在一个优先级的问题了.

通过@primary 指定优先级的, 还有通过 依赖注入时以变量名进行控制, 以及通过 @Qualifier 进行指定这3种方式.

【测试1】
在这里插入图片描述
依赖注入, 如下图:
在这里插入图片描述
可以看到的是,city2 , 我虽然使用了 变量名 = Bean的name属性值,但是注入的实例仍然是 city1 , 所以可以知道的是 @Primary 标记的Bean的优先级会高于通过 变量名进行控制的优先级。

【测试2】
测试 @Qualifier 和 @Primary 的优先级。
在这里插入图片描述

很明显,只要我指定了这个Bean, 哪怕是没有@Primary 这个注解,也会优先加载我们指定的这个Bean。

【结论】@Qualifier > @Primary > 通过变量名进行指定

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CQXXCL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值