前言
本章学习Spring的DI的相关知识
方法
1.概念
DI,英文名称为dependency injection,中文名称为依赖注入。
它指的是一个类的属性是对象的时候,将该对象进行注入的过程
它实质上就是IOC,我们可以把它理解为一个特殊的IOC,因为我们之前注入的都是基本数据类型以及String
2.Spring IOC属性注入的两种方式
1)构造器注入
这个前面已经讲解过了,这里不再赘述。
特别的,如果注入的是对象类型,那么需要用到ref属性!
2)setter注入
编写applicationContext.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">
<!-- 使用bean标签创建对象,id代表用于标识对象,class指定对象的路径 -->
<!-- 构造器注入-->
<bean id="user" class="cn.edu.ccut.bo.User">
<!-- 使用constructor-arg标签进行有参构造创建bean-->
<!-- index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 -->
<!-- value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean -->
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
</bean>
<!-- setter注入-->
<bean id="user2" class="cn.edu.ccut.bo.User">
<!-- 使用property标签进行setter注入-->
<!-- value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean -->
<property name="username" value="admin"></property>
<property name="password" value="admin"></property>
</bean>
<!-- constructor-arg和property子标签含有value,ref,list,set,map,props,array等
它们可用来分别注入普通值,对象、List、Set、Map、Properties、数组等
-->
</beans>
编写测试类看一下效果:
import cn.edu.ccut.bo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
public void testApplicationContext(){
//加载spring配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取User对象
User user = ac.getBean("user2", User.class);
System.out.println(user);
}
}
3.DI依赖注入
如果我们的属性是对象类型,那么将其注入我们称之为依赖注入!
例如,在User类中加入Student对象属性(学习用)
package cn.edu.ccut.bo;
public class User {
private String username;
private String password;
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public User() {
System.out.println("调用无参构造方法");
}
public User(String username, String password) {
this.username = username;
this.password = password;
System.out.println("调用有参构造方法");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
System.out.println("调用setter方法");
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", student=" + student +
'}';
}
}
我们applicationContext.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">
<!-- 使用bean标签创建对象,id代表用于标识对象,class指定对象的路径 -->
<!-- 构造器注入-->
<!--<bean id="user" class="cn.edu.ccut.bo.User">
<!– 使用constructor-arg标签进行有参构造创建bean–>
<!– index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 –>
<!– value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean –>
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
</bean>-->
<!-- setter注入-->
<bean id="student" class="cn.edu.ccut.bo.Student"></bean>
<bean id="user2" class="cn.edu.ccut.bo.User">
<!-- 使用property标签进行setter注入-->
<!-- value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean -->
<property name="username" value="admin"></property>
<property name="password" value="admin"></property>
<property name="student" ref="student"></property>
</bean>
<!-- constructor-arg和property子标签含有value,ref,list,set,map,props,array等
它们可用来分别注入普通值,对象、List、Set、Map、Properties、数组等
-->
</beans>
其中ref属性表示的就是依赖注入,将其他对象注入到该属性当中!
再次运行测试代码结果如下:
这说明我们成功的注入了student属性!
严格意义上来讲,DI和IOC是一样的,只不过DI着重表示属性注入的是对象罢了!