<T>T getBean(Class<T> requiredType):方法描述中的“唯一的bean实例”是什么意思?唯一体现在哪里?

先来看方法的描述与正确的用法

<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()方法的使用

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 这个bean是通过在Spring配置文件定义一个id为"a",class为"test.spring.demo01.A"的bean标签来创建的,具体的配置如下: ```xml <bean id="a" class="test.spring.demo01.A"></bean> ``` 在应用启动时,Spring容器会读取这个配置文件,并根据配置文件的信息创建相应的bean对象,并将其放入Spring容器供其他对象使用。这个bean的类型是"test.spring.demo01.A",id为"a",可以通过在其他bean引用这个id来获取对应的实例。 ### 回答2: <bean id="a" class="test.spring.demo01.A"></bean> 是通过 Spring 容器的 XML 配置文件来创建这个 bean 的。 具体来说,这段配置代码的 `<bean>` 标签表示将要创建的 bean,它有三个属性: - id:为这个 bean 分配一个唯一的标识符,这样我们可以在其他地方引用这个 bean。 - class:指定要创建的 bean 的类的全限定名,这里是 "test.spring.demo01.A"。 - scope:表示 bean 的作用域,默认为 singleton,即每次从容器获取bean 时都会返回同一个实例。另外两个作用域是 prototype(每次获取都会创建一个新的实例)和 request(表示每个 HTTP 请求都会创建一个新的实例)。 在 Spring 容器启动的过程,它会读取 XML 配置文件,并解析其的 `<bean>` 标签。然后,根据配置的属性信息,通过 Java 反射机制创建一个 `test.spring.demo01.A` 类型的对象实例,并将其纳入 Spring 容器的管理。 这个 bean 创建完成后,可以通过容器的 `getBean` 方法获取实例。之后,我们就可以在程序的其他地方使用这个 bean,并调用其方法或者获取其属性值。 值得一提的是,这种方式创建 bean 的方式是传统的 XML 配置方式,还有其他方式如基于注解和基于 Java 配置类的方式也可以创建 bean。不过,无论哪种方式,都是通过 Spring 容器来负责 bean 的创建和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值