首页 专题 文章 代码 归档
找到IOC容器中的实例
2020.01.23 09:54 2020.01.23 09:54

找到的IOC容器中的实例

本节我们来通过各种方法找到IOC容器中的实例!

通过类型

也即通过“Obejct.class”这方法传参,获得容器中实例。

spring-ioc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--    注册一个Student类-->
    <bean id="student01" class="com.misiai.bean.Student">
        <!--class告诉容器bean注册的是类的全限定类名,需要根据自己的报名更改-->
        <property name="name" value="kuan"/>
        <property name="sno" value="10001"/>
        <!--property为属性赋值-->
    </bean>
</beans>

只有一个id名为student01的bean

Test.java

public class Test01 {
    ApplicationContext ap = new ClassPathXmlApplicationContext("spring-ioc.xml");

    /**
     * 通过bean的类型,从IOC容器中找到bean的实例!
     */
    @Test
    public void test02() {
        Student bean = ap.getBean(Student.class);
        System.out.println("bean = " + bean);
    }
}

结果:

截图-1579663960


那如果我们配置文件里面有两个或以上的同类型的bean呢?

也即我们再注册一个Student类型的bean(id=student02):

<!--    注册一个Student类-->
<bean id="student02" class="com.misiai.bean.Student">
    <!--class告诉容器bean注册的是类的全限定类名,需要根据自己的报名更改-->
    <property name="name" value="Misiai"/>
    <property name="sno" value="10002"/>
    <!--property为属性赋值-->
</bean>

报错:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.misiai.bean.Student' available: expected single matching bean but found 2: student01,student02

说明通过此方法我们只能有一个此类型的实例在IOC容器中,不然是会报错的!

如果你想找到student02,那么只能通过ID找啦,但是通过ID查找的时候,我们依然能传入类型。

@Test
public void test02() {
    // Student bean = ap.getBean(Student.class);
    // System.out.println("bean = " + bean);
    // 传入ID时,同时参数类型
    Student student02 = ap.getBean("student02", Student.class);
    System.out.println("student02 = " + student02);
}

通过构造器

1、先确保实体类有有参构造器

public Student(String name, String sno) {
    this.name = name;
    this.sno = sno;
    System.out.println("Student的有参构造!");
}

2、然后在配置文件新建一个bean

<!--注册一个Student03-->
<bean id="student03" class="com.misiai.bean.Student">
    <!--通过有参构造器赋值-->
    <constructor-arg name="name" value="student03"/>
    <constructor-arg name="sno" value="10003"/>
</bean>

constructor-arg标签就是通过实体类的有参构造器来进行实例化!

3、测试

/**
 * 通过有参构造器
 */
@Test
public void test03() {
    Student student03 = ap.getBean("student03", Student.class);
    System.out.println("student03 = " + student03);
}

截图-1579664611

Tips:

constructor-arg标签,可以省略name属性,只给value属性。但是如果省略,那么得严格按照实体类(Student)的有参构造器的顺序来!

P名称空间

1、导入名称空间

你需要在spring-ioc.xml文件的顶部加一个命名空间:

xmlns:p="http://www.springframework.org/schema/p"

完整的如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

2、新建bean

<!--注册一个Student04-->
<bean id="student04" class="com.misiai.bean.Student"
      p:name="student04" p:sno="10004">
</bean>

注意这里的p:name和p:sno相当于是bean标签的一个属性,和id、class一样!

而不是写在<bean></bean>内部!

3、测试结果

依旧测试没有问题:

截图-1579665469

本节阅读完毕! (分享
二维码图片 扫描关注我们哟