【244期門診集錦】入木三分、鞭辟入里掌握Spring
本期特邀知名作家、開源框架專家陳雄華老師,針對Spring學(xué)習(xí)過程中遇到的問題給予解答。歡迎網(wǎng)友積極提問,與專家一起討論!
查看本期門診精彩實(shí)錄:http://doctor.51cto.com/develop-258.html
精選本期網(wǎng)友提問與專家解答,以供網(wǎng)友學(xué)習(xí)參考。
Q:老師好:如何學(xué)習(xí)Spring?需要掌握哪些知識?Spring 3.0比2.0有哪些差異及改進(jìn)?
A:
1)核心API更新到Java 5.0
2)新增Spring表達(dá)式語言
3)可通過Java類提供IoC配置信息
4)通用類型轉(zhuǎn)換系統(tǒng)和屬性格式化系統(tǒng)
5)數(shù)據(jù)訪問層新增OXM功能
6)Spring 3.0最令人振奮的一個增強(qiáng)是Spring MVC提供了對REST風(fēng)格編程的支持
7)聲明式模型驗(yàn)證,全面支持JSR-303的Bean驗(yàn)證API
8)對JavaEE 6的支持
9)支持內(nèi)嵌的數(shù)據(jù)庫
Q:老師您好,學(xué)習(xí)Spring需要掌握哪些Java基礎(chǔ)知識?如果深入了解并掌握Spring?
A:大致需要以下的知識:
1)Java反射知識;
2)Java動態(tài)代理知識;
3) Java注解知識;
4) PropertyEditor的知識;
5) ThreadLocal的知識;
6) 國際化消息的知識;
這些Java基礎(chǔ)知識在《Spring 3.x企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》中都有介紹,為讀者做好的Java基礎(chǔ)知識的鋪墊,減少了讀者閱讀的難度。
如果深入了解并掌握Spring?先嘗試在項(xiàng)目中使用Spring,然后再有機(jī)會了解Spring的技術(shù)內(nèi)幕,技術(shù)內(nèi)幕在書的第3,5章有講解,再此基礎(chǔ)上建議你開始讀讀Spring的源碼.讀了Spring源碼,一定會讓你的Java功力和OOA,OOP能力大增!
Q:老師好:您好,公司有個項(xiàng)目,其中一個LogicImpl里面執(zhí)行了除常用biz logic之外的,侏儒去外網(wǎng)抓取一些數(shù)據(jù),socket和其他系統(tǒng)之間的通信的功能(使用還比較頻繁)。有一次,系統(tǒng)突然D了,一看,JDBC pool全滿了。后來該類實(shí)現(xiàn)了spring的ApplicationContextAware接口,后面在用的時候就通過applicationcontex上下文的getBean去取本類的實(shí)例。這樣就解決了。想必這個接口您應(yīng)該也熟悉吧。區(qū)別在于改動后,吧一些操作交給了spring的來管理,限于原因,沒仔細(xì)去追究,spring源碼也一直沒時間去細(xì)看。不知道您是否遇到過,能否詳細(xì)的說明一下這個事情的原因?如果沒遇到過,您也可以對這個接口說一下您自己的看法,謝謝。
A:感謝您的提問。
我的猜測是,你的這個業(yè)務(wù)類方法由于執(zhí)行時間較長,他持有Connection的時間就長,所以并發(fā)性就差。 因此需要把數(shù)據(jù)庫訪問的邏輯放在一個事務(wù)方法中,數(shù)據(jù)訪問完成后,就馬上將連接釋放給連接池。引入ApplicationContextAware后,通過getBean的方法和直接Autowried 是沒有區(qū)別的,因此你的問題,我覺得還是沒有徹底解決。我不知道,你原來這個LogicImpl是不是單實(shí)例的, 在Spring中管理的Bean都是單實(shí)例的,它可以有效提高并發(fā)性。建議你將對外網(wǎng)操作這些邏輯和數(shù)據(jù)庫訪問邏輯分開來,對外網(wǎng)的操作較重,可以放到一個異步操作中去做,不要和數(shù)據(jù)庫訪問放在一起,這樣可以降低對數(shù)據(jù)庫連接占用的時間,提高并發(fā)性。
Q:專家們好,你好!在用SPRING管理數(shù)據(jù)庫數(shù)據(jù)源時一般都會顯示用戶名和密碼等敏感信息,用sping來加載數(shù)據(jù)源,如何保障安全性的問題?
A:這個問題很好,說明你對Spring的應(yīng)用已經(jīng)比較深了??梢愿采wPropertyPlaceholderConfigurer類的以下幾個方法:
1)void convertProperties(Properties props):屬性文件中的所有屬性值都封裝在props中,覆蓋此方法,可以對所有的屬性值進(jìn)行轉(zhuǎn)換處理。
2)String convertProperty(String propertyName, String propertyValue):在加載屬性文件并讀取文件中的每個屬性時,都會調(diào)用此方法進(jìn)行轉(zhuǎn)換處理。
3)String convertPropertyValue(String originalValue):和上一個方法類似,只不過沒有傳入屬性名。
Q:陳老師您好,我用SSH開發(fā)了兩個企業(yè)門戶系統(tǒng),開發(fā)起來很容易,可正式上線后,就感覺系統(tǒng)速度不夠流暢了,而且越運(yùn)行就會越慢,人家服務(wù)商那邊說我們的系統(tǒng)老是把他們的服務(wù)器內(nèi)存跑爆掉,真不知道是什么原因引起的,不知Spring有沒有什么好的解決方案?
A:非常感謝您的問題。
如果是互聯(lián)網(wǎng)的項(xiàng)目,不在建議使用Hibernate,因?yàn)镠ibernate對緩存的管理層面比較高,不方便做經(jīng)細(xì)化的緩存管理。我現(xiàn)在的項(xiàng)目也是互聯(lián)網(wǎng)項(xiàng)目,我是采用Spring MVC+Spring +myBatis+memcached+freemaker.Spring本身是不會耗資源的,阿里巴巴就是使用Spring的。