談到構(gòu)架,總是會想起前面看到banq寫的一篇文章,叫做重與輕的永恒話題。是討論使用EJB等重量級框架和Spring,Jdon之類的輕量級框架采用POJO實現(xiàn)業(yè)務(wù)。俺是小人物,沒學(xué)過EJB,而對Spring倒是有一點了解。所以這次就用Spring了。

這次實現(xiàn)的系統(tǒng)是一個數(shù)據(jù)采集網(wǎng)站,最后根據(jù)管理員所填的數(shù)據(jù)最一些判斷,給出一個評價結(jié)果。系統(tǒng)的ER圖如下:

http://forum.lingdot.com/UploadFile/2006-5/20065718265790780.jpg

業(yè)務(wù)不是很復(fù)雜,本來也不是很需要使用這些框架的。但作為看了好久Marsting Spring的一個實踐,于是就使用了Spring.

不用不知道,一用嚇一跳。呵呵。我只是用到了Spring的IoC容器,和Spring對Hibernate的支持部分。感覺,,,好簡單。呵呵。如果只是用到這兩個部分的話,我覺得Spring藥比Hibernate簡單的多了。至少我在第一次使用Hibernate的時候?qū)懥撕镁贸绦蜃哉J(rèn)為沒問題了,開始運(yùn)行卻出了一大堆莫名其妙的錯誤。但Spring,那天寫了一些東西,配好了環(huán)境,在Hibernate之上使用Spring,竟然一個錯都沒出。

然后說用這個東西的一點感想。一句話,要不要用Spring這個問題是非常值得考慮的。我想這一次我使用它可能一方面是學(xué)習(xí),另外一方面也有“用了Spring,程序含金量會高一些吧,至少可以和人家炫耀我用了Spring了”這樣的想法在。
?
于是當(dāng)這個項目接近尾聲的時候,回過頭來想Spring在這個系統(tǒng)中所起到的作用,于是一陣郁悶。
?
Spring支持對接口編程。例如我在Spring配置文件中寫了一個Bean,
?
1 < bean? id ="userDAO" ?class ="com.lingdot.es.dao.UserDAO" >
2 ???? < property? name ="sessionFactory" >
3 ?????????? < ref? local ="sessionFactory" />
4 ???? </ property >
5 </ bean >
?
那么我在程序中想要獲得這樣的一個實例的時候,會這樣寫:
?
UserDAO?userDAO? = ?(UserDAO)getBeanFromIoC( " userDAO " );
?
其中g(shù)etBeanFromIoC是我自己寫的方法。
?
這里存在一個問題,就是我沒有對接口編程,這樣導(dǎo)致整個應(yīng)用依然是依賴于UserDAO這樣一個具體類。顯然這不是我們想要得。
?
如果我不依賴于具體類,那么勢必創(chuàng)建一個接口,
?
public ? class ?UserDAO? implements ?UserDAOI
?
這樣我就可以把獲得userDAO的實例的代碼寫成這樣:
?
UserDAOI?userDAO? = ?(UserDAOI)getBeanFromIoC( " userDAO " );
?
由此,我做到了程序與具體類無關(guān)。可以說做到了開閉原則。
?
但如此出現(xiàn)了一個問題。只要我想從IoC容器中獲取一個bean,那么這個bean類一定對應(yīng)一個接口,這樣才能保證我的應(yīng)用不依賴于這個具體類。于是,我的每一個業(yè)務(wù)類,DAO類,都將有一個接口。于是我就想起了一個詞——接口污染。
?
究竟怎樣才算把握好了接口和針對接口編程,而不會成為一種接口污染,這個度,我想需要很好地把握才行。大型的項目,后期發(fā)展的可能性比較大,要求可擴(kuò)展性能比較好的時候,可能需要Spring,IoC去做到與具體類無關(guān)的編程,但是一些小的東西,只怕不用反而更簡潔。
?
我到現(xiàn)在也沒能很好的評價出這個項目中使用Spring是不是適合。
?
學(xué)習(xí)的路,還很長。