理解IoC和DI对于Spring的初学者来说是很重要的.
刚开始接触到这两个词感觉过于抽象实在难懂,会有很多问题产生,什么叫反转?什么是依赖关系,啥又叫注入?
程序员都是懒惰和高冷的
记住这句话,因此一个纯粹的程序员都会想方设法让自己的代码变得简洁,并且后期修改的时候花费少量的精力,同时不是自己的事理都不理。
灵感都来源于生活,所以先用生活中的例子来解释所谓的"控制反转"和"依赖注入".
Ioc—Inversion of Control,即"控制反转"
既然有反转,那么正转又是什么呢?比如你现在是刚起步的小公司的boss,你现在需要找java工程师,现在找职员的控制权在你的手上,你找到一个Mr.zz给你打工。那么你和Mr.zz就产生了依赖关系(你当然要依赖Mr.zz给你搞事情啊),一段时间后Mr.zz挂了,你又得自己去找一个Mr.xx.
这就是所谓正转,在程序设计中,就是指程序主动的去创建依赖对象(你主动的去找Mr.zz).
此时身为boss的你就暴躁了,我才是老大,为啥要我亲自找人搞事情啊。于是你找到一个中介,他负责给你找你想要的人,挂了就找他换,你再也不用操心职员的事情,也就是说你把找职员的控制权反而交给中介去处理。这就叫控制反转,这样也能很好的理解好莱坞法则"Don't call us,we will call you."(不要去找职员们,他们会自动来找你).即告诉开发者不要主动去构建依赖对象,而是在需要的时候由依赖注入容器把对象提供过来。
DI—Dependency Injection,即"依赖注入"
依赖注入实际上是控制反转的另一种体现,不同角度的说法而已,中介啥时候找工程师,怎么找工程师,我都不需要知道。当我需要的时候就联系中介,中介就给我一个我需要的职员。
拿操作数据库来说:比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring(中介)我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。
理解DI的关键是:"谁依赖谁,为什么需要依赖,谁注入谁,注入了什么?"。谁依赖于谁:应用程序依赖于IoC容器(boss依赖中介);
为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源(boss需要中介提供职员,这个职员拥有某种技能,那么职员的技能对于boss来说就是一种外部资源);
谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象(中介把职员注入到boss公司)
注入了什么:就是注入某个对象所需要的外部资源,包括对象、资源、常量数据(把职员注入到公司,自然而然就获取的职员的技能).