忙了很久,沒時間寫博客,感覺很慚愧,對不起CSDN各位大佬們對卑下的厚愛。
今天決定發功,寫一篇關於Spring的文章,話不多說,開搞!
話說這天,小魯班一個人蹲着峽谷紅爸爸旁邊的草叢裏,託着自己可愛的腮幫子思考人生。
正巧,妲己小妹妹搖着性感的紅尾巴路過,看到小魯班鬱悶的模樣,決定上去逗逗他。
妲己:小滷蛋,你在想啥呢,那麼出神,是不是昨晚金金做的滷蛋不合胃口,在生氣呢?
小滷蛋:啊…妲…妲己小姐姐…沒…沒有…(悄悄別過臉去掩飾自己慌張的表情)
妲己: (轉動迷人的大眼睛,湊近小滷蛋)是嘛?小滷蛋,那你爲啥不敢看我呀…
小滷蛋:(聞到一股濃濃的香水味,打了一個激靈,往後挪了幾步)啊…是這樣的…妲己姐姐,我不是報名峽谷程序員學院的Java課程了嗎… 可是學到Spring這個知識點的時候有點蒙圈了…現在很受傷…
妲己:沒有心,就不會受傷。
小滷蛋:??
妲己:sorry,串臺詞了呃…
小滷蛋:害…
妲己:正好我學完了Spring,那我來給你講講吧?
小滷蛋:(很興奮,臉漲的通紅)好呀,好呀,妲己姐姐…
妲己:emm…我先問你一個問題,你知道Spring中用到哪些設計模式嗎?
小滷蛋:(有點心虛) 知道一點…
妲己:那你說說Spring爲什麼使用單例模式?
小滷蛋:(這個我看過,得意)是爲了實現資源共享?某些資源創建的成本很高,比如數據源等…
妲己:嗯,是的,
Spring的單例模式核心方法通過AbstractBeanFactory實現的。來看看源碼:
public Object getSingotonByBeanName(String beanName){
Object bean=getSingleton(String beanName, boolean allowEarlyReference) ;
if(bean==null){
synchronized (this.singletonObjects) {
//雙重校驗
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
singletonObject = singletonFactory.createBean();
addSingleton(beanName, singletonObject);
}
return singletonObject;
}
}
}
Spring一開始會嘗試獲取bean,如果沒有,那就加鎖,Double Check之後創建Bean,創建完之後緩存在singletonObjects裏面,之後再用的時候直接取這個單例對象就可以了。
小滷蛋:噢噢…我好像懂了,我之前看過node哥哥的單例模式(面試單例小技巧),有印象的…
妲己:哈哈,滷蛋,沒想到你這麼好學啊!
小滷蛋:嘿嘿,我這不是看到大家都很努力,我不能拖後腿啊
妲己:不錯,那你知道還有哪些其他的設計模式嗎?
小滷蛋:呃…這個…好像還有…(拍腦袋思考)
妲己:好啦,我來給你普及一下吧
小滷蛋:好耶(抓住妲己的胳膊晃啊晃)
妲己:(摸了摸小滷蛋的腦袋,感覺他真可愛死了,忍不住又親了一口)
小滷蛋:(大羞羞,但還是紅着臉穩穩的坐着)
妲己:小滷蛋,我跟你說哈,Spring除了單例模式還有很多種設計模式呢,作爲Java領域最優秀的框架,它有很多值得我們借鑑的地方哦
比如代理模式,可以做到既不修改基類(無侵入),又可以靈活的擴展它的功能,像我們熟知的AspectJ、CGLIB、JDK動態代理等
比如觀察者模式,可以做到代碼解耦,像Spring中的事件通知機制就是。
比如簡單工廠方法模式,由BeanFactory的實現類來統一生產bean,實現bean創建時干預、統一管理等。
比如模板方法模式,通過模板代碼來減少冗餘代碼,模板類提供模板方法,調用類接口提供自定義的通用方法,調用類作爲參數,在執行完模板方法時,實現自己的業務邏輯。
還有責任鏈模式、策略模式等等…
小滷蛋:哇喔,妲己小姐姐你好厲害呀,會這麼多!
妲己:哈哈,沒有啦,還不是我前段時間偷偷關注了node哥哥,從他那裏學到了很多Java小技巧呢!
小滷蛋:搜嘎,那我也去找node哥哥給我補補課去
妲己:好呀,咱倆一起,好久沒看到node哥哥了呢,嘻嘻…
夕陽下,只剩小書包和妲己手牽手一高一矮的身影,唯美而盪漾…
喜歡Java,熱衷學習的小夥伴可以加我微信: xia_qing2012,大家一起學習進步,成爲大佬!