IOC(控制反转)

解释

控制

控制对象的创建,属性的赋值,依赖关系的管理。以及对象从创建到销毁的整个生命周期。

反转

把开发人员在代码中创建的权限交给代码之外的Spring容器,Spring框架可以说是一个工厂,可以生产管理Java对象,当我们需要用到对象时可以直接从Spring容器中获取就行,不用再自己创建。


技术实现

DL

依赖查找。

DI

依赖注入,我们在代码中只需要提供对象的名称,对象的获取、赋值都由容器自己完成。若追究Spring框架的底层原理则是Java的反射机制。


Spring的IOC原理图

Spring的IOC原理图


举例

编写Java对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class School {
private String name;
private String address;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Student {
private String name;
private int age;

//引用类型
private School school;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public School getSchool() {
return school;
}

public void setSchool(School school) {
System.out.println("setSchool:"+school);
this.school = school;
}

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}

XML配置文件

1
2
3
4
5
6
7
8
9
10
<bean id="myStudent" class="com.zlt.bean02.Student">
<property name="name" value="李四"/><!--setNaem(李四)-->
<property name="age" value="20"/><!--setAge(20)-->
<property name="school" ref="myschool"/><!--setSchool()-->
</bean>
<!--声明School-->
<bean id="myschool" class="com.zlt.bean02.School">
<property name="name" value="北京大学"/>
<property name="address" value="北京"/>
</bean>

主类调用

1
2
3
4
5
6
7
8
9
10
11
12
13
public class App {
public static void main(String[] args){
//定义spring配置文件
String config = "applicationContext.xml";
//创建Spring的容器对象,根据spring配置文件的位置,使用接口的不同实现类
//如果spring的配置文件是在类路径(classpath),使用ClassPathXmlApplicationContext
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
//从容器中获取对象,使用getBean("<bean>的id")
SomeService student = (SomeService) ctx.getBean("myStudent");
//输出对象
System.out.println(student);
}
}

优点

Spring框架可以说是一个工厂,可以生产管理Java对象,当我们需要用到对象时可以直接从Spring容器中获取就行,不用再自己创建。以此也达到了解耦合的目的。