Spring 的基本应用——IoC

Posted 好多个码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 的基本应用——IoC相关的知识,希望对你有一定的参考价值。

IoC 容器

实现步骤

  • 在 pom.xml 中添加 Spring 依赖

  • 创建配置文件,可以自定义文件名 spring.xml

  • 在 spring.xml 中配置 bean 标签,IoC 容器通过加载 bean 标签来创建对象

  • 调用 API 获取 IoC 创建的对象

IoC 容器可以调用无参构造或者有参构造来创建对象,我们先来看无参构造的方式。

无参构造

<!-- 配置 student 对象-->
<bean id="stu" class="com.southwind.entity.Student"</bean>

配置一个 bean 标签:

  • id,对象名

  • class,对象的模板类

接下来调用 API 获取对象,Spring 提供了两种方式来获取对象:id 或者运行时类。

(1)通过 id 获取对象

//1.加载 spring.xml 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
//2.通过 id 值获取对象
Student stu = (Student) applicationContext.getBean("stu");
System.out.println(stu);

第一步:加载 spring.xml 配置文件,生成 ApplicationContext 对象。

第二步:调用 ApplicationContext 的 getBean 方法获取对象,参数为配置文件中的 id 值。程序在加载 spring.xml 时创建 stu 对象,通过反射机制调用无参构造函数,所有要求交给 IoC 容器管理的类必须有无参构造函数。

有参构造

(1)在实体类中创建有参构造

public Student(int id, String name, int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
}

(2)spring.xml 中进行配置

<!-- 通过有参构造函数创建对象 -->
<bean id="stu3" class="com.hzit.entity.Student">
   <constructor-arg name="id" value="3"></constructor-arg>
   <constructor-arg name="name" value="小明"></constructor-arg>
   <constructor-arg name="age" value="22"></constructor-arg>
</bean>

(3)此时 IoC 容器会根据 constructor-arg 标签去加载对应的有参构造函数,创建对象并完成属性赋值。name 的值需要与有参构造的形参名对应,value 是对应的值。除了使用 name 对应参数外,还可以通过下标 index 对应,如下所示。

<!-- 通过有参构造函数创建对象 -->
<bean id="stu3" class="com.hzit.entity.Student">
   <constructor-arg index="0" value="3"></constructor-arg>
   <constructor-arg index="1" value="小明"></constructor-arg>
   <constructor-arg index="2" value="22"></constructor-arg>
</bean>

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

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

(1)创建 Classes 类

public class Classes {
    private int id;
    private String name;
}

(2)在 Student 类中添加 Classes 属性

public class Student {
    private int id;
    private String name;
    private int age;
    private Classes classes;
}

(3)spring.xml 中配置 classes 对象,然后将该对象赋值给 stu 对象

<!-- 创建 classes 对象 -->
<bean id="classes" class="com.hzit.entity.Classes">
   <property name="id" value="1"></property>
   <property name="name" value="Java班"></property>
</bean>
<!-- 创建 stu 对象 -->
<bean id="stu" class="com.hzit.entity.Student">
   <property name="id" value="1"></property>
   <property name="name">
       <value><![CDATA[<张三>]]></value>
   </property>
   <property name="age" value="23"></property>
   <!-- 将 classes 对象赋给 stu 对象 -->
   <property name="classes" ref="classes"></property>
</bean>

在 spring.xml 中,通过 ref 属性将其他 bean 赋给当前 bean 对象,这种方式叫做依赖注入(DI),是 Spring 非常重要的机制,DI 是将不同对象进行关联的一种方式,是 IoC 的具体实现方式,通常 DI 和 IoC 是紧密结合在一起的,因此一般说的 IoC 包括 DI。

 

如果是集合属性如何依赖注入?

(1)Classes 类中添加 List<Student> 属性。

public class Classes {
    private int id;
    private String name;
    private List<Student> students;
}

(2)spring.xml 中配置 2 个 student 对象、1 个 classes 对象,并将 2 个 student 对象注入到 classes 对象中。

<!-- 配置 classes 对象 -->
<bean id="classes" class="com.hzit.entity.Classes">
   <property name="id" value="1"></property>
   <property name="name" value="Java班"></property>
   <property name="students">
       <!-- 注入 student 对象 -->
       <list>
           <ref bean="stu"/>
           <ref bean="stu2"/>
       </list>
   </property>
</bean>
<bean id="stu" class="com.hzit.entity.Student">
   <property name="id" value="1"></property>
   <property name="name">
        <value><![CDATA[<张三>]]></value>
   </property>
   <property name="age" value="23"></property>
</bean>
<bean id="stu2" class="com.hzit.entity.Student">
   <property name="id" value="2"></property>
   <property name="name" value="李四"></property>
   <property name="age" value="23"></property>
</bean>

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

总结

这一讲我们讲解了 Spring IoC 的基本概念以及如何使用,IoC 是 Spring 的核心,这很重要。使用 Spring 开发项目时,控制层、业务层、DAO 层都是通过 IoC 来完成依赖注入的。

 

 

 

以上是关于Spring 的基本应用——IoC的主要内容,如果未能解决你的问题,请参考以下文章

长文预警!Spring源码之IoC容器的基本实现

IOC容器基本原理

说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用

IoC 之 2.2 IoC 容器基本原理(00000001)

Spring框架由来及IOC的基本概念

spring之ioc