1. 程式人生 > >Spring實戰(1)

Spring實戰(1)

手動 之前 ava singleton 標簽 測試 之間 解決 業務邏輯

本博客是參考Spring實戰第四版,對其中重要的知識點進行總結。

  • Spring是如何簡化java開發的?

答:(1)基於POJO的輕量級和最小侵入性編程;(2)通過依賴註入和面向接口來松耦合;(3)基於切面和慣例進行聲明式編程;(4)通過切面和模板來減少樣板式代碼;

  • 配置Spring容器三種主要的裝配機制?

答:(1)在XML中顯示配置;(2)在java中進行顯示配置;(3)隱式的bean發現機制和自動裝配;

  • Spring從兩個角度來實現自動化裝配?

答:(1)組件掃描:Spring會自動發現上下文中所創建的bean;(2)自動裝配:Spring自動滿足bean之間的依賴;

  • Spring依賴註入DI的功能是如何實現的?

答:任何一個有實際意義的應用都會由兩個或者多個類組成,這些類之間相互協作來完成特定的業務邏輯。按照傳統的做法,每個對象負責管理與自己相互協作的對象的引用,這樣會導致高度耦合並難以測試。例如如下代碼:

技術分享圖片

可以看到,DamselRescuingKnight在它的構造函數中創建了RescueDamselQuest。這使得DamselRescuingKnight緊密的和RescueDamselQuest耦合到了一起,因此就極大的限制了這個騎士探險的能力。而通過DI,對象的依賴關系將由系統中協調各對象的第三方組件在創建對象的時候進行設定。對象無需自己創建或者管理他們的依賴關系。技術分享圖片

技術分享圖片

我們可以看到,不同於之前的DamselRescuingKnight,BraveKnight沒有沒有自行創建探險任務,而是在探險的時候把任務作為參數傳入。

  • 觀察Spring是如何工作的?

答:Spring通過應用上下文(Application Context)裝載bean的定義並把他們組裝起來。Spring上下文全權負責對象的創建和組裝。

技術分享圖片

  • AOP應用?

技術分享圖片

正如你所看到的,Minstrel是只有兩個方法的簡單類。在騎士探險之前或者之後都會調用相應的函數。接下來我們該如何把吟遊詩人和騎士探險結合起來呢?如果是如下方式調用,

技術分享圖片這樣就到時每次騎士進行探險都要命令吟遊詩人去給他進行記錄,這樣合理嗎?所以我們利用AOP,你可以聲明吟遊詩人必須去歌頌騎士探險,而騎士不需要去管吟遊詩人。將Minstrel聲明一個切面。

技術分享圖片

  • Spring幫助我們管理Bean分為兩個部分,一個是註冊Bean,一個裝配Bean。

答:完成這兩個動作有三種方式,一種是使用自動配置的方式、一種是使用JavaConfig的方式,一種就是使用XML配置的方式。在自動配置的方式中,使用@Component去告訴Spring,我是一個bean,你要來管理我,然後使用@AutoWired註解去裝配Bean(所謂裝配,就是管理對象直接的協作關系)。然後在JavaConfig中,@Configuration其實就是告訴spring,spring容器要怎麽配置(怎麽去註冊bean,怎麽去處理bean之間的關系(裝配))。那麽久很好理解了,@Bean的意思就是,我要獲取這個bean的時候,你spring要按照這種方式去幫我獲取到這個bean。到了使用xml的方式,也是如此。均不見<bean>標簽就是告訴spring怎麽獲取這個bean,各種<ref>就是手動的配置bean之間的關系。如下圖分別是三種方式的代碼:

技術分享圖片技術分享圖片技術分享圖片

  • 配置profile bean?

答:Spring為環境相關的bean所提供的解決方案其實與構建時的方案沒有太大區別。當然,在這個工程中需要根據環境決定常見那個bean和不創建那個bean。不過Spring並不是在構建的時候做出這樣的決策,而是等到運行來再決定。這樣的結果就是同一個部署單元能夠使用說有的環境,沒有必要進行重新構建。Spring引入了bean profile功能。可以使用@profile來指定那個bean屬於profile。

技術分享圖片

在Spring確定那個profile處於激活狀態時,需要依賴兩個獨立的屬性:spring.profiles.active和spring.profiles.default。如果設置了spring.profiles.active屬性的話,那麽他的值就會用來確定那個profile被激活;如果沒有設置spring.profiles.active的話,那麽spring將會查找spring.profiles.default值。如果這兩個都沒有設置的話,那麽就沒有profile被激活。可以在web.xml中設置默認的profile。

技術分享圖片

  • 限定自動裝配的bean:@qualifier註解是使用限定符主要方式之一。技術分享圖片

  • bean的作用域?

答:在默認情況下bean是以單例的形式創建的。也就是說,不管一個bean被註入到其他bean中多少次,每次所註入的都是一個實例。Spring定義了多種作用域,可以基於這些作用域來創建bean,包括:單例(Singleton):在整個應用中,只創建一個bean的實例;原型(Prototype):每次註入或者通過應用上下文獲取的時候,都會創建一個新的bean實例;會話(session):在web應用中,為每個會話創建一個bean實例;請求(Request):在web應用中,為每個請求創建一個bean實例。技術分享圖片

  • 運行時值註入?

答:Spring提供了兩種在運行時求值的方式:(1)屬性占位符(Property placeholder);(2)Spring表達語言(SpEL)。技術分享圖片技術分享圖片

在XML中進行配置:

技術分享圖片

使用SpEL表達語言:

技術分享圖片

Spring實戰(1)