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的主要内容,如果未能解决你的问题,请参考以下文章
说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用