javascript
解析Spring IOC原理——工厂模式与反射机制的综合应用
從一個(gè)例子開(kāi)始講起:
首先我們建立一個(gè)Chinese.java類(lèi),該類(lèi)的sayHelloWorld(String name)方法,用中文對(duì)名為name的人問(wèn)好,其內(nèi)容如下:
?????
[java]?view plaincopyprint? ?
下面我們接著建立一個(gè)American.java類(lèi),該類(lèi)的sayHelloWorld(String name)方法,用英文對(duì)名為name的人問(wèn)好,其內(nèi)容如下:下面我們接著建立一個(gè)American.java類(lèi),該類(lèi)的sayHelloWorld(String name)方法,用英文對(duì)名為name的人問(wèn)好,其內(nèi)容如下:
?最后我們編寫(xiě)一個(gè)測(cè)試類(lèi)對(duì)這兩個(gè)類(lèi)的sayHelloWorld(String name)方法進(jìn)行測(cè)試,下面是該類(lèi)的內(nèi)容:
?
現(xiàn)實(shí)生活中我們總是把同一類(lèi)產(chǎn)品放在一個(gè)工廠中生產(chǎn),消費(fèi)者只需要告訴工廠自己需要這一類(lèi)產(chǎn)品中的哪一種產(chǎn)品,工廠就能夠生產(chǎn)出對(duì)應(yīng)的產(chǎn)品,從而完成交易。
這里我們把上面例子中的HelloWorldTest類(lèi)想象為消費(fèi)者,而Chinese和American類(lèi)想象為產(chǎn)品,根據(jù)上面的例子,我們可以看到每當(dāng)HelloWorldTest這個(gè)消費(fèi)者需要一個(gè)產(chǎn)品時(shí)都要去自己去生產(chǎn)(new),這樣消費(fèi)者就不得不去了解各個(gè)產(chǎn)品的內(nèi)部結(jié)構(gòu)及生產(chǎn)過(guò)程。顯然對(duì)于消費(fèi)者來(lái)說(shuō)這樣是很麻煩的。
而在程序設(shè)計(jì)領(lǐng)域中這個(gè)問(wèn)題就叫做強(qiáng)耦合問(wèn)題,HelloWorldTest類(lèi)與Chinese和American這兩個(gè)類(lèi)都存在強(qiáng)耦合關(guān)系。設(shè)想一下,如果程序中的很多類(lèi)都需要用到Chinese和American類(lèi)這兩個(gè)類(lèi),那么每個(gè)類(lèi)就必須和這兩個(gè)類(lèi)強(qiáng)耦合,而且現(xiàn)實(shí)的項(xiàng)目中類(lèi)似于Chinese這種類(lèi)往往不僅兩個(gè),這樣會(huì)使得整個(gè)程序的耦合度很高,增大程序的復(fù)雜度。這時(shí)我們就想到,能否也使用一個(gè)工廠來(lái)生產(chǎn)這些類(lèi),這樣如果某個(gè)類(lèi)需要用到工廠中的哪個(gè)類(lèi),就只要通過(guò)和工廠生產(chǎn)就行了,從而降低了整個(gè)程序的耦合度。
下面看看工廠模式是如何實(shí)現(xiàn)的:
首先建立接口類(lèi)Human.java,其內(nèi)容如下:
[java]?view plaincopyprint??
并將American.java類(lèi)和Chinese.java類(lèi)改為實(shí)現(xiàn)該接口,即類(lèi)頭分別改成:public class American implements Human和public class Chinese implements Human。
接著編寫(xiě)HumanFactory.java工廠類(lèi),其內(nèi)容為:
?
[java]?view plaincopyprint??
最后我們還需要修改測(cè)試類(lèi)HelloWorld.java類(lèi),修改后的內(nèi)容如下:?
?
[java]?view plaincopyprint?
通過(guò)上面的例子可以看到,使用工廠模式實(shí)現(xiàn)的方式,?HelloWorldTest 不再與Chinese類(lèi)和American類(lèi)耦合,而只是和他們共同的接口耦合,從而很大程度的降低的程序的耦合性。到這里或許很多人會(huì)有一點(diǎn)疑慮,使用工廠模式的HelloWorldTest 類(lèi)也是需要耦合兩個(gè)類(lèi)(即HumanFactory 類(lèi)和Human 接口)那么為什么能說(shuō)降低耦合度呢,這就要是何時(shí)要使用工廠模式的問(wèn)題了。假如類(lèi)似于我們這個(gè)例子,HumanFactory 這個(gè)工廠只生產(chǎn)兩個(gè)類(lèi),那的確沒(méi)有什么必要使用工廠模式,但是現(xiàn)實(shí)的項(xiàng)目中往往有更多和Chinese類(lèi)類(lèi)似的類(lèi),比如English,Japanese,這時(shí)候就能體現(xiàn)出工廠模式的優(yōu)勢(shì)了
?
?(二)Spring IOC的原理
首先我們來(lái)講下為什么要引入IOC:
假設(shè)上面舉例的那個(gè)程序已經(jīng)部署到服務(wù)器中,并已經(jīng)上線運(yùn)行,這時(shí)項(xiàng)目來(lái)了這樣一個(gè)新需求:增加一個(gè)Japanese類(lèi),并且在HelloWorldTest 類(lèi)中調(diào)用Japanese的sayHelloWorld方法。在沒(méi)有引入IOC之前,很顯然我們?yōu)榱诉@個(gè)新需求,必須把項(xiàng)目停止下來(lái),然后從新編譯HumanFactory 和HelloWorldTest這兩個(gè)類(lèi),最后再重新上線運(yùn)行。
而使用IOC,則能夠在不重新編譯部署的情況下實(shí)現(xiàn)上面的新需求!
那么我們來(lái)看一下IOC是去怎么實(shí)現(xiàn)這個(gè)新需求的:?
?首先我們?cè)赾om.human包內(nèi)創(chuàng)建一個(gè)Japanese類(lèi):
[java]?view plaincopyprint?
?
然后對(duì)HelloWorldTest 類(lèi)做如下修改
?
[java]?view plaincopyprint??
然后我們?cè)赽eans.xml中做如下配置:
[html]?view plaincopyprint?總結(jié)
以上是生活随笔為你收集整理的解析Spring IOC原理——工厂模式与反射机制的综合应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 模拟spring - 简单实现sprin
- 下一篇: JSP 第一天:提交表单--获取表单中的