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 > 通过变量名进行指定