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问题。话不多说,直接上干货。
我们先看下问题发生的场景,假设我们存在一个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>
我们编写一个启动类,在容器正常初始化完后,尝试打印下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,所以只能报错。
以上问题就是我们经常遇到的多目标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对象。
以上即是本节的所有内容,如有错误之处,欢迎留言指正。
上一节:Spring Bean的配置注解@Autowired的使用
下一节:Spring Bean注解@Qualifier讲解,敬请关注……