IoC(DI):Java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成。通常,每个对象在使用它的合作对象时,自己均要使用像new Object()这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了;
而IoC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。从这方面来说,对象如何得到它的协作对象的责任被反转了(IoC、DI)。
IoC:Inversion of Control,控制反转;
DI:Dependency Injection,依赖注入;
IoC:是Spring的核心,贯穿始终。所谓IoC,对于Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。在传统的程序开发中,一个对象如果要使用另外的对象,就必须得到它(比如自己new一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其它的接口或类耦合起来。而在IoC中,所有的类都会在Spring容器中登记,告诉Spring你是个什么东西,你需要什么东西,然后Spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其它需要你的东西。所有的类的创建、销毁都由Spring来控制,也就是说,控制对象生存周期的不再是引用它的对象,而是Spring。对于某个具体的对象而言,以前是它控制其它对象,现在是所有对象都被Spring控制,所以这叫控制反转。
IoC的一个重点是在系统运行中,动态地向某个对象提供它所需要的其它对象。这一点是通过DI实现的。比如对象A需要操作数据库,以前总是需要在A中自己编写代码来获得一个Connection对象,有了Spring,我们就只需要告诉Spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,Spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常工作,而这个Connection是由Spring注入到A中的,依赖注入的名字就是这么来的。
DI的实现:Java1.3之后添加了重要特征,反射(reflection),允许程序在运行的时候动态生成对象,执行对象的方法,改变对象的属性,Spring就是通过反射来实现注入的。
主要代码:
public static Object newInstance(String className) {
Class<?> cls = null;
Object obj = null;
try {
cls = Class.forName(className);
obj = cls.newInstance();
} catch (Exception e) {
......
}
return obj;
}
Spring中选择了IoC而不是工厂模式,本质原因是IoC通过反射机制实现,当需求出现变动时,工厂模式需要进行相应变化,而IoC的反射机制允许我们不重新编译代码,因为其对象都是动态生成的。