一、为什么需要IOC
我们知道对于面向对象编程而言,一个功能的实现是由一个个功能对象组成,这些对象之间是相互制约的,如图:
从上图中我们可以发现,类和类之间是相互依赖相互制约的,少了谁都转不起来,可以说耦合性极高,
为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson 1996年提出了IOC理论,用来实现对象之间的“解耦”。
二、什么是IOC
IOC的思想是借助于“第三方”实现具有依赖关系的对象之间的解耦,如图:
从上图中我们可以发现,原本相互“粘连”的类(A B C D),不再像以前那样直接作用了,通过使用名为“IOC容器”的东西使 A B C D 产生联系。
换句话说,以前一个模块需要什么类需要其自己去找“new一个”,IOC实现了对指定类的托管,模块需要什么类,直接去IOC容器中去取就可以了。
在spring中怎么让IOC容器托管指定的类呢?
往期的文章中有关于将指定的类注入到IOC中的两种方式:
通过构造方法进行注入【点击查看】
注入完成之后,我们获取对象的方式也发生了改变,通过如下的方式进行获取(往期的文章讲过)【点击查看】:
public class MyTest {
@Test
public void test(){
ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu = (Student)application.getBean("stu");
System.out.println(stu.toString());
}
}
三、IOC与DI的关系
2004年,Martin Fowler发表了<< Inversion of Control Containers and the Dependency Injection pattern>>【点击查看】,经过详细地分析和论证后他得出了答案:“获得依赖对象的过程被反转了”,他称为 "依赖注入(Dependency Injection)”
控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。
所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系(对象)注入到IOC容器之中。
总结:
IoC是一种设计模式,是一种思想,相当于一个容器,而DI就好比是实现IOC的一种方式。
作用是通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
四、IOC的缺点
-
由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗
-
对于Spring而言,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。
-
生成一个对象的步骤变的稍微复杂了,对于不习惯这种方式的人,会觉得有些别扭和不直观。