快捷搜索:  汽车  科技

autowired注入的bean爆红(如何解决Autowired自动装配时的多bean问题)

autowired注入的bean爆红(如何解决Autowired自动装配时的多bean问题)下一节:Spring Bean注解@Qualifier讲解,敬请关注……上一节:Spring Bean的配置注解@Autowired的使用以上问题就是我们经常遇到的多目标bean的问题,我们知道Autowired注解是类型驱动的注入,而当前的apple和orange两个bean都是Food类型的,所以需要更近一步的告诉Spring容器该装配哪个bean,这个时候就需要使用Primary进行更加精细化的配置。假设我们需要优先装配apple实例,那么进行如下配置即可 <bean id="apple" class="model.Apple" primary="true"></bean> <bean id="orange" class="model.Orange">&l

上一节,我们学习了Spring Bean的配置注解@Autowired的使用,这节我们一起来看下如何使用Primary注解,解决Autowired自动装配时的多bean问题。话不多说,直接上干货。

autowired注入的bean爆红(如何解决Autowired自动装配时的多bean问题)(1)

我们先看下问题发生的场景,假设我们存在一个Food接口类,它含有一个eat方法,有Apple和Orange类都实现了这个Food接口,同时,我们有一个Person类,它使用@Autowired注解装配一个Food类型的实现类,我们配置xml使得Spring 容器为我们创建apple和orange两个bean(注意两个bean都是Food类型的),具体代码如下:

public interface Food { void eat(); } public class Apple implements Food { public void eat() { System.out.println("我是苹果"); } } public class Orange implements Food { public void eat() { System.out.println("我是橙子"); } } public class Person { @Autowired private Food food; @Override public String toString() { return "Person{" "food=" food '}'; } } <bean id="apple" class="model.Apple"></bean> <bean id="orange" class="model.Orange"></bean> <bean id="person" class="model.Person"></bean>

autowired注入的bean爆红(如何解决Autowired自动装配时的多bean问题)(2)

我们编写一个启动类,在容器正常初始化完后,尝试打印下person实例的toString,看下Spring为我们装配的到底是apple还是orange?启动类代码如下:

public class StartUp { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person) applicationContext.getBean("person"); System.out.println(person.toString()); } }

执行代码后,启动报错“No qualifying bean of type 'model.Food' available: expected single matching bean but found 2: apple orange”,Spring容器不知道该为我们装配哪个bean,所以只能报错。

autowired注入的bean爆红(如何解决Autowired自动装配时的多bean问题)(3)

以上问题就是我们经常遇到的多目标bean的问题,我们知道Autowired注解是类型驱动的注入,而当前的apple和orange两个bean都是Food类型的,所以需要更近一步的告诉Spring容器该装配哪个bean,这个时候就需要使用Primary进行更加精细化的配置。假设我们需要优先装配apple实例,那么进行如下配置即可

<bean id="apple" class="model.Apple" primary="true"></bean> <bean id="orange" class="model.Orange"></bean> <bean id="person" class="model.Person"></bean>

此时再启动容器,输出如下,可见优先装配了apple实例到person对象。

autowired注入的bean爆红(如何解决Autowired自动装配时的多bean问题)(4)

autowired注入的bean爆红(如何解决Autowired自动装配时的多bean问题)(5)

以上即是本节的所有内容,如有错误之处,欢迎留言指正。

上一节:Spring Bean的配置注解@Autowired的使用

下一节:Spring Bean注解@Qualifier讲解,敬请关注……

猜您喜欢: