什么是DI依赖注入?
Spring动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 Spring我们就只需要告诉Spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,Spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由Spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,Spring就是通过反射来实现注入的。
简单来说什么是依赖注入,就是给属性赋值(包括基本数据类型和引用数据类型)。
利用 set 方法给属性赋值
创建Student实体类,示例代码如下:
package com.hlbdx.spring;
public class Student {
private String uuid;
private Integer age;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
创建Classes实体类,示例代码如下:
package com.hlbdx.spring;
import java.util.List;
public class Classes {
private String uuid;
private String cNum;
private String cName;
private List<Student> students;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getcNum() {
return cNum;
}
public void setcNum(String cNum) {
this.cNum = cNum;
}
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
在spring 配置文件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-4.3.xsd">
<bean id="student" class="com.hlbdx.spring.Student">
<property name="uuid" value="1"></property>
<property name="age" value="25"></property>
</bean>
<bean id="classes" class="com.hlbdx.spring.Classes">
<property name="uuid" value="1"></property>
<property name="cNum" value="1001"></property>
<property name="cName" value="中华一班"></property>
<property name="students">
<list>
<ref bean="student" />
</list>
</property>
</bean>
</beans>
测试代码:
package com.hlbdx.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Classes classes = (Classes) context.getBean("classes");
System.out.println(classes);
}
}
测试结果:
利用构造函数给属性赋值
改造Student实体类,示例代码如下:
package com.hlbdx.spring;
public class Student {
private String uuid;
private Integer age;
public Student(String uuid, Integer age) {
this.uuid = uuid;
this.age = age;
}
@Override
public String toString() {
return "Student [uuid=" + uuid + ", age=" + age + "]";
}
}
改造Classes实体类,示例代码如下:
package com.hlbdx.spring;
import java.util.List;
public class Classes {
private String uuid;
private String cNum;
private String cName;
private List<Student> students;
public Classes(String uuid, String cNum, String cName,
List<Student> students) {
this.uuid = uuid;
this.cNum = cNum;
this.cName = cName;
this.students = students;
}
@Override
public String toString() {
return "Classes [uuid=" + uuid + ", cNum=" + cNum + ", cName=" + cName
+ ", students=" + students + "]";
}
}
在spring 配置文件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-4.3.xsd">
<bean id="student" class="com.hlbdx.spring.Student">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="25"></constructor-arg>
</bean>
<bean id="classes" class="com.hlbdx.spring.Classes">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="1001"></constructor-arg>
<constructor-arg index="2" value="中华一班"></constructor-arg>
<constructor-arg index="3">
<list>
<ref bean="student" />
</list>
</constructor-arg>
</bean>
</beans>
测试代码如下:
package com.hlbdx.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Classes classes = (Classes) context.getBean("classes");
System.out.println(classes);
}
}
测试结果: