控制反轉(zhuǎn)(IoC=Inversion of Control)IoC,用白話來講,就是由容器控制程序之間的(依賴)關(guān)系,而非傳統(tǒng)實(shí)現(xiàn)中,由程序代碼直接操控。這也就是所謂“控制反轉(zhuǎn)”的概念所在:(依賴)控制權(quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移,是所謂反轉(zhuǎn)。
IoC 也稱為好萊塢原則(Hollywood Principle):“Don’t call us, we’ll call you”。即,如果大腕明星想演節(jié)目,不用自己去找好萊塢公司,而是由好萊塢公司主動(dòng)去找他們(當(dāng)然,之前這些明星必須要在好萊塢登記過)。
正在業(yè)界為 IoC 爭吵不休時(shí),大師級人物 Martin Fowler 也站出來發(fā)話,以一篇經(jīng)典文章《Inversion of Control Containers and the Dependency Injection pattern》為 IoC 正名,至此,IoC 又獲得了一個(gè)新的名字:“依賴注入 (Dependency Injection)”。
相對 IoC 而言,“依賴注入”的確更加準(zhǔn)確的描述了這種古老而又時(shí)興的設(shè)計(jì)理念。從名字上理解,所謂依賴注入,即組件之間的依賴關(guān)系由容器在運(yùn)行期決定,形象的來說,即由容器動(dòng)態(tài)的將某種依賴關(guān)系注入到組件之中。
例如前面用戶注冊的例子。UserRegister
依賴于UserDao
的實(shí)現(xiàn)類,在最后的改進(jìn)中我們使用 IoC 容器在運(yùn)行期動(dòng)態(tài)的為UserRegister
注入UserDao
的實(shí)現(xiàn)類。即UserRegister
對UserDao
的依賴關(guān)系由容器注入,UserRegister
不用關(guān)心UserDao
的任何具體實(shí)現(xiàn)類。如果要更改用戶的持久化方式,只要修改配置文件 applicationContext.xml 即可。
依賴注入機(jī)制減輕了組件之間的依賴關(guān)系,同時(shí)也大大提高了組件的可移植性,這意味著,組件得到重用的機(jī)會(huì)將會(huì)更多。