IOC(Inversion of Control)
- 概念:控制反转,把对象创建和对象之间调用过程交给Spring管理
- 目的:降低耦合度
- 底层原理:xml解析、工厂模式、反射
老规矩,上代码
最开始我们一段程序的实现方法是这样的:
class Student{
void add(){
...
}
}
class Teacher{
void check(){
//这是原本常规做法,实例化对象后调用方法
Student student = new Student();
student.add();
}
}
但这么做会导致耦合度过高,所以引入工厂模式
就是加入一个Factory类
class Factory{
public static Student getStudent(){
return new Student();
}
}
这样原本的方法就可以改进为
class Student{
void add(){
...
}
}
class Teacher{
void check(){
Student student = Factory.getStudent();
student.add();
}
}
这样Teacher类在需要Student类中的方法时,就会由Factory类自动创建一个Student对象然后注入到Teacher需要的地方,即控制权在Factory手上,也就是控制反转
并且当你Student类做出改变时,不需要改动Teacher类,也就降低了耦合度。
但是这样的话Factory类和Student类的耦合度仍然过高,这是就出现了IOC
现在再来看IOC这个概念,我们的系统大多数都是由许多对象组成的,假设A对象需要B对象,那么A对象在初始化或运行到某一行时,程序需要主动去创建B对象,这时的控制权是在程序手上。在引入IOC容器后,可以切断A对象和B对象的联系,那么A对象需要B对象的时候,IOC容器就会主动创建一个B对象注入到A对象需要的位置。实际上这个控制权就从主动变为被动,也就是控制权颠倒过来了。
原先是我们写程序去控制创建对象,而现在这种控制反转的思想,我们不需要管理对象的创建了,这就是IOC的原型
IOC的过程
需要xml配置文件,配置创建的对象
<bean id="" class="类名路径"> </bean>
接下来在Factory类中解析xml配置文件通过类名路径反射出类对象
class Factory{
public static Student getStudent(){
String classvalue = class的属性值:类名路径;
//反射创建对象
Class class = Class.forName(classvalue);
return (Student)class.newInstance();
}
}
IOC接口
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
Spring提供IOC容器实现两种方式:(两个接口)
(1)BeanFactory:IOC容器基本实现,Spring内部的使用接口;
加载配置文件时不会创建对象
(2)ApplicationContext:BeanFactory接口的子接口,提供更多功能
加载配置文件时就会创建配置文件对象
ApplicationContext实现类: