找到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);
}
}
结果:
那如果我们配置文件里面有两个或以上的同类型的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);
}
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、测试结果
依旧测试没有问题:
本节阅读完毕!
(分享)