上篇博客【SSH進(jìn)階之路】Spring簡(jiǎn)介,搭建Spring環(huán)境――輕量級(jí)容器框架(1),我們簡(jiǎn)單的介紹了Spring的基本概念,并且搭建了兩個(gè)版本的Spring開(kāi)發(fā)環(huán)境,但是我們剩下了Spring最核心的兩大技術(shù):IoC和AOP,沒(méi)有深入介紹。從這篇博文開(kāi)始,我們開(kāi)始逐一的深入學(xué)習(xí)Spring的兩個(gè)核心。Spring目前最引人注視的地方,就是IOC=Inversion Of Control(控制反轉(zhuǎn))或DI=Dependence Injection(依賴(lài)注入)的設(shè)計(jì)思想。
這篇博客我們使用傳統(tǒng)方式(即不使用Spring)來(lái)實(shí)現(xiàn)1個(gè)添加用戶(hù)的實(shí)例,再同理使用Spring實(shí)現(xiàn)添加用戶(hù)的實(shí)例,對(duì)照學(xué)習(xí)IoC的概念,和為何使用IoC等等,最后,簡(jiǎn)單總結(jié)。下面我們開(kāi)始:
客戶(hù)端:
業(yè)務(wù)邏輯層:
UserManager接口:添加用戶(hù)的方法
UserManager實(shí)現(xiàn)
數(shù)據(jù)訪(fǎng)問(wèn)層:
UserDao接口:添加用戶(hù)的方式
UserDao兩種實(shí)現(xiàn)(Mysql和Oracle):傳統(tǒng)方式使用配置文件,然后使用工廠(chǎng)來(lái)創(chuàng)建相應(yīng)的對(duì)象(即我們常常說(shuō)的配置文件+抽象工廠(chǎng)+反射,1會(huì)兒我們?cè)倏纯碨pring創(chuàng)建對(duì)象的方式)
運(yùn)行效果圖:
看到上面的代碼,非常的熟習(xí),由于我們平時(shí)常常使用。但是問(wèn)題來(lái)了,在業(yè)務(wù)邏輯層的實(shí)現(xiàn)中,UserDao有多種不同的實(shí)現(xiàn)方式,例如Mysql和Oracle,UserManager要依賴(lài)于UserDao的具體實(shí)現(xiàn)。并且對(duì)象是由我們自己負(fù)責(zé)創(chuàng)建的,我們主動(dòng)的發(fā)起了1個(gè)查找,要依賴(lài)于1種數(shù)據(jù)庫(kù)的實(shí)現(xiàn)。此時(shí)我們的UserManager就和UserDao的具體實(shí)現(xiàn)牢牢的耦合在1起了。我們?cè)倏纯蛻?hù)端,我們要使用UserManager,同業(yè)務(wù)邏輯層1樣,還得需要我們自己負(fù)責(zé)主動(dòng)查找UserManager的具體實(shí)現(xiàn)。
我們可以發(fā)現(xiàn):傳統(tǒng)方式,對(duì)象和對(duì)象之間產(chǎn)生嚴(yán)重的依賴(lài)關(guān)系,耦合度非常高而且依賴(lài)關(guān)系都寫(xiě)死在了代碼里,項(xiàng)目不容易修改和保護(hù),必須要改代碼。
下面我們使用Spring方式改造實(shí)例,實(shí)現(xiàn)一樣的功能,讓Spring管理我們的對(duì)象,看看Spring是怎樣創(chuàng)建對(duì)象和描寫(xiě)對(duì)象之間依賴(lài)關(guān)系的。
項(xiàng)目的包圖:
客戶(hù)端:
業(yè)務(wù)邏輯層:
UserManager實(shí)現(xiàn):
Spring的配置文件:
由于其他地方的代碼和效果圖,同上,不再浪費(fèi)大家的帶寬。
對(duì)照傳統(tǒng)的實(shí)現(xiàn)方式,再看客戶(hù)端和UserManager,我們可以發(fā)現(xiàn):通過(guò)IoC或DI,我們只需要通過(guò)簡(jiǎn)單的配置,而無(wú)需任何代碼就能夠指定UserManager中所需的UserDao的具體實(shí)現(xiàn)。UserManager只需利用容器注入的UserDao實(shí)例,完成本身的業(yè)務(wù)邏輯,而不用關(guān)心具體實(shí)現(xiàn)來(lái)自哪、由誰(shuí)實(shí)現(xiàn)。換句話(huà)說(shuō):我們不再需要自己負(fù)責(zé)創(chuàng)建對(duì)象,保護(hù)對(duì)象的依賴(lài)關(guān)系,這些都有Spring替我們完成了。
傳統(tǒng)方式:決定使用哪個(gè)具體實(shí)現(xiàn)是由利用程序負(fù)責(zé)的,在編譯階段就肯定了。
Spring方式:調(diào)用類(lèi)只依賴(lài)接口,而不依賴(lài)具體的實(shí)現(xiàn)類(lèi),減少了耦合。控制權(quán)交給了容器,在運(yùn)行期才由容器決定將具體的實(shí)現(xiàn)動(dòng)態(tài)的“注入”到調(diào)用類(lèi)的對(duì)象中。這也是使用IoC的根本緣由。
現(xiàn)在我們對(duì)IoC有了基本認(rèn)識(shí),我們?cè)倮斫?下IoC的概念。
IoC(Inversion of Control),控制反轉(zhuǎn),用白話(huà)來(lái)說(shuō),就是由容器控制程序之間的關(guān)系,而非傳統(tǒng)實(shí)現(xiàn)中,由程序代碼直接控制。這也就是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由利用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移,就是所謂反轉(zhuǎn)。
優(yōu)點(diǎn):
1、把對(duì)象的創(chuàng)建和依賴(lài)關(guān)系定義在了XML文件中,我們改變子類(lèi)的實(shí)現(xiàn)變得異常簡(jiǎn)單。
2、控制反轉(zhuǎn)減輕了對(duì)象之間的耦合度,減輕了對(duì)象之間的依賴(lài)關(guān)系,增加了系統(tǒng)的靈活性,可保護(hù)性,和可移植性等等。
缺點(diǎn):
1、生成對(duì)象的方式變復(fù)雜了(事實(shí)上操作還是挺簡(jiǎn)單的),對(duì)不習(xí)慣這類(lèi)方式的人,會(huì)覺(jué)得有些別扭和不直觀(guān)。
2、創(chuàng)建對(duì)象由于使用了反射技術(shù),在效力上有些消耗。但相對(duì)IoC提高的保護(hù)性和靈活性來(lái)講,這點(diǎn)消耗是微不足道的,除非某對(duì)象的生成對(duì)效力要求特別高。
IoC使得面向?qū)ο蟮氖澜绺雍?jiǎn)單,面向接口編程成了可能。
引言:下篇博文,我為大家轉(zhuǎn)載了1篇深入理解IoC原理的博文,相當(dāng)簡(jiǎn)單,通俗易通。以后,我為大家準(zhǔn)備了1篇依賴(lài)注入幾種類(lèi)型對(duì)照的博文,快馬加鞭ing,敬請(qǐng)期待。
上一篇 找不到符號(hào)