依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。编程
具体含义是:当某个角色(多是一个Java实例,调用者)须要另外一个角色(另外一个Java实例,被调用者)的协助时,在传统的程序设计过程当中,一般由调用者来建立被调用者的实例。设计模式
但在Spring里,建立被调用者的工做再也不由调用者来完成,所以称为控制反转;建立被调用者实例的工做一般由Spring容器来完成,而后注入调用者,所以也称为依赖注入。spa
(1)原始社会里,几乎没有社会分工。须要斧子的人(调用者)只能本身去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者本身建立被调用者。设计
(2)进入工业社会,工厂出现。斧子再也不由普通人完成,而在工厂里被生产出来,此时须要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。接口
(3)进入“按需分配”社会,须要斧子的人不须要找到工厂,坐在家里发出一个简单指令:须要斧子。斧子就天然出如今他面前。对应Spring的依赖注入。
第一种状况下,Java实例的调用者建立被调用的Java实例,必然要求被调用的Java类出如今调用者的代码里。没法实现两者之间的松耦合。io
第二种状况下,调用者无须关心被调用者具体实现过程,只须要找到符合某种标准(接口)的实例,便可使用。此时调用的代码面向接口编程,可让调用者和被调用者解耦,这也是工厂模式大量使用的缘由。但调用者须要本身定位工厂,调用者与特定工厂耦合在一块儿。程序设计
第三种状况下,调用者无须本身定位工厂,程序运行到须要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,两者之间的依赖关系由Spring提供。容器