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