先来看方法的描述与正确的用法
<T>T getBean(Class requiredType): 返回容器中属于requiredType类型的、唯一的bean实例。
<bean id="person" class="com.test.pojo.Person" scope="prototype">
<property name="name" value="Zhangsan"/>
<property name="pet" ref="pet"/>
</bean>
// 通过给定类型获取对象
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = app.getBean(Person.class);
这里解释一下唯一是什么意思:这里的唯一指的是,当用指定类型的方式获取spring容器中bean对象时,spring容器中的那个类型的bean只能声明一个!而不是说你只能写一次getBean(Book.class)的意思,你可以写很多很多个,当你没声明scope是多例的时候,你声明再多个也只是给你同一个对象。
举例说明
当我spring容器中声明了两个同样类型而id不同bean实例person1与person2时
<bean id="person1" class="com.test.pojo.Person" scope="prototype">
<property name="name" value="Zhangsan"/>
<property name="pet" ref="pet"/>
</bean>
<bean id="person2" class="com.test.pojo.Person" scope="prototype">
<property name="name" value="Zhangsan"/>
<property name="pet" ref="pet"/>
</bean>
这种情况,只能用id或者id与类型的方式来获取bean对象,因为存在两个或多个类型相同的bean对象时,你用获取类型的方式来获取bean对象,spring容器并不知道你需要的是哪一个,所以会报错。
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person1 = context.getBean(Person.class);
System.out.println(person1);
// 如果spring容器中只有唯一的person类型bean的话,这么写是没毛病的
Person person2 = context.getBean(Person.class);
System.out.println(person2);
// id方式获取
Person person3 = (Person) context.getBean("person1");
System.out.println(person3);
}
No qualifying bean of type ‘com.test.pojo.Person’ available: expected single matching bean but found 2: person1,person2
翻译过来就是找到了两个都是person类型不知大你要用哪一个。所以需要用Object getBean(String name)或者 <T>T getBean(String name,Class<T> requiredType)。
关于更多getBean()方法的使用可以看下面这篇文章
更多getBean()方法的使用