看Spring實戰有感(一)
忘記以前看到哪兒了,再從頭看吧!
Spring的兩個核心特性,依賴注入dependency injection和麵向切面程式設計aspect-oriented programming,它的根本使命是簡化java開發,採用了以下四種關鍵策略:
- 基於POJO的輕量級和最小入侵性程式設計;
- 通過依賴注入和麵向介面實現鬆耦合;
- 基於切面和慣例進行宣告式程式設計;
- 通過切面和模板減少樣板式程式碼。
激發POJO潛能
不會強迫實現Spring介面和規範的類,非侵入性程式設計。
我覺得這樣真的好,分的清楚!他不強行和你糾纏,想分就分,讓人沒有了壓力
依賴注入
看前問題:maven實現的是依賴注入嗎
類之間相互協作,導致程式碼高度耦合,並且還難以測試哪一塊兒,不開心。
建立應用元件之間協作的行為 稱為裝配。spring中使用xml進行裝配很常見,也可以通過java配置來實現。
Spring通過Application Context轉載bean的定義並把它們組裝起來。
應用切面
DI可以讓相互協作的軟體元件保持鬆散耦合,而AOP允許將遍佈應用各處的功能分離出來形成可重用元件(這不禁Σ(っ °Д °;)っ讓我回想起ps中的圖層,當你覺得你做的事情是在重複,那麼我們就要去解決它,我們當然可以用框架或者自己做一個框架,這時候就需要天馬行空的想象了,我們不必追求細節或者循規蹈矩,只需要一個思路)。
- 系統關注點功能的程式碼重複出現在多個元件中(如果是我,應該想,反正都已經封裝好了,每個呼叫一下也不是很費事,但其實呢,不優雅,notelegant!)
- 元件會變得混亂因為那些與自身核心業務無關的程式碼
很多例子都在描述現實世界,但大多時候我們進行了抽象,很多時候事物出離了本質或者本心或者自身執行的規則,但也有很多時候,最真實的往往是最簡單的,你要對一個東西程式設計,你就要先理解什麼,正如我想要編寫出生命,那就應該先理解生命本身
將Minstrel bean宣告為一個切面,首先需要將它宣告為一個bean,然後引用該bean。前置通知,後置通知,pointcut-ref屬性引用了名字問embank的切入點,語法為AspectJ。
<aop:config>
<aop:aspect ref="minstrel">
<aop:pointcut id="embark"
expression = "execution(* *.embarkOnQuest(..))"/> ---定義切點
<aop:beforre pintcut-fef="embark"
method="singBeforeQuest"/> -----宣告潛質通知
<aop:after pintcut-fef="embark"
method="singAfterQuest"/> -----宣告潛質通知
</aop:aspect>
</aop:config>
</beans>
通過少量宣告將其宣告成一個切面,Minstrel仍是一個POJO,其次,BraveKnight完全不知道Minstrel的存在。
使用模板消除樣式程式碼
Spring旨在通過模板封裝消除版式程式碼。書中以jdbc為例,展示了 spring中的jdbc template。
容納你的bean
容器是Spring框架的核心,其容器並不是只有一個。自帶多個容器實現歸於兩種型別,bean工廠,提供基本di支援,對於大部分應用太過低階。
應用上下文基於beanfactory構建,提供框架級服務,例如解析屬性檔案。
使用應用上下文
- AnnotationConfigApplicationContext
- AnnotationConfigWebApplicationContext
- ClassPathXmlApplicationContext
- FileSystenXmlapplicationcontext
- XmlWebApplicationContext
哪種上下文將bean載入到bean工廠的過程都是類似的。應用上下文準備就緒之後後我們可以呼叫上下文的getBean()方法從Spring容器中獲取bean。現在對如何建立Spring容器,對bean生命週期做更一步的探究。
我現在理解的上下文:如果把容器看作是一個盒子,那上下文不僅是盒子本身,還是把bean抓進來的手
bean的生命週期
例項化,填充屬性,setBeanName(),setBeanFactory(),setApplicationContext(),
Processor()的預初始化方法,afterPropertiesSet()方法,呼叫自定義的初始化方法,processor的初始化方法,bean可以使用了,容器關閉,呼叫destroy,呼叫自定義的銷燬方法
俯瞰Spring風景線
超乎你的想象。
Spirng模組
- spring核心容器:最為核心的部分,掛曆bean的建立配置和管理。包括了bean工廠,in which 提供DI。基於bean工廠有著多種上下文的實現。
- AOP模組: 對面向切面程式設計的豐富支援
- 資料訪問與整合: Spring的JDBC和DAO模組抽象了這些樣板式程式碼。除此以外,本模組還會使用AOP為Spring應用中的物件提供事務管理服務。
- web與遠端呼叫:MVC模式是一種普遍且被接收的構建web應用的方法,將介面邏輯與應用邏輯相分離。java從不缺少mvc,spring還提供了多終於其它應用互動的方案,自帶遠端呼叫框架,還提供了暴露和使用REST API的良好支援。
- Instrumentation:體哦給你了為jvm新增代理的功能agent,為tomcat提供了一個織入代理,能夠為tomcat傳遞類檔案,使用場景有限,本書不會涉及(我還以為mvc的啥的都要基於它呢,原來很有限。。)
- 測試: 未使用jndi,servlet,portlet編寫單元測試提供了一系列的mock物件實現,對於整合測試,也為bean提供了互動支援。
Spring Portfilio
Spring是個大家族,如果只看framework會失去很多有價值的東西,提一下spring boot,致力於簡化spring本身,也許我學好spring之後會去研究它。
小結
告一段落,最近想先乾點別的事,估計會過一陣子再更新,這篇文章就是小結本身。