2. Spring IoC 容器对象管理

Spring的两大核心机制,IoC(控制反转),AOP(面向切面编程)

IoC

property标签:name对应属性名,value是属性的值,如果属性值包含特殊字符,比如name="<张三>",使用<![CDATA[<张三>]]>

<bean id="student" class="com.devlin.entity.Student">
    <property name="id" value="1"></property>
    <property name="name">
        <value><![CDATA[<张三>]]></value>
    </property>
    <property name="age" value="22"></property>
</bean>

Spring的IoC容器通过调用每个属性的setter方法来完成属性赋值的,所以实体类必须有setter方法,否则无法完成属性的赋值。

通过运行时类获取对象。

//1.加载spring.xml配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
//2.通过运行时类获取对象
Student student2 = (Student) applicationContext.getBean(Student.class);
System.out.println(student2);

通过运行时类获取对象有一个弊端,当spring.xml中配置两个Student的bean时程序会抛异常,因为此时两个bean都是由Student类生成的,IoC容器无法讲两个bean返回,必须指定一个唯一的bean。

以上是IoC容器通过无参构造函数创建对象的方式,同时IoC容器也可以通过有参构造函数来创建对象。

IoC容器会根据constructor-arg标签去加载对应的有参构造函数,创建对象并完成属性赋值。

name的值需要与有参构造函数的形参名对应,value是对应的值。

除了使用name对应参数之外,还可以通过下标index来对应参数。

以上是IoC容器通过有参构造函数创建对象的方式,获取对象有两种方式可以选择:id和运行时类

IoC容器管理多个对象,并且对象之间有及联关系,如何实现?

在spring.xml中,通过ref属性将其他bean赋给当前bean对象的方式叫做依赖注入(DI),是Spring框架非常重要的一种机制,DI是将不同的对象进行关联的一种方式,是IoC的具体实现方式,通过DI和IoC是结合起来使用,所以一般来将IoC包括来DI,IoC是自动创建对象的一种机制,DI是完成对象之间关联关系的方式。

通过有参构造函数来创建对象。

集合属性的DI,通过无参构造函数创建对象。

通过有参构造函数创建对象。

集合属性通过list标签和ref标签完成注入,ref的bean属性指向需要注入的bean对象。

Bean 作用域

scope有4种类型:

  • singleton:单例,表示通过IoC容器获取的对象是唯一的。

  • prototype:原型,表示通过IoC容器获取的对象是不同的。

  • request:请求,表示通过IoC容器获取的对象在一次HTTP请求内有效。

  • session:会话,表示通过IoC容器获取的对象在一个用户会话内有效。

request和session只适用于web项目,大多数情况下,我们只会使用singleton和prototype两种scope,并且scope的默认值是singleton。

scope=singleton时,一旦加载spring.xml配置文件就会创建bean对象,并且只创建一次,单例模式。

scope=prototype时,加载spring.xml配置文件时不会创建bean对象,每次获取对象时再来创建,获取多少次就创建多少个对象,原型模式。

Spring的继承,与Java中的继承不一样,但是思想是类似的,Spring中的继承表示子bean可以继承父bean中的属性,对象层面的继承,Java中的继承表示子类可以继承父类的结构,类层面的继承。

子bean在继承父bean的属性值的基础之上,可以对属性值进行覆盖,两个不同类型的对象之间也可以实现继承,前提是两个对象的属性完全一致,User中有int id和String name,Student中有int id和String name,同样可以完成继承,读取父bean的属性值,赋给对应的子bean的属性。

Last updated