《Spring實戰(第四版)》讀書筆記
由於看書比較忘記,記錄在網上,還可以時刻更新。。。
關鍵名稱
DI : dependency injection: 依賴注入
AOP : aspect-oriented programming 面向切面程式設計
POJO :plain old java object 簡單老式java物件
EJB : enterprise javaBean 企業級JavaBean
JDO : java data object java資料物件
第1章 Spring之旅
1.1 Spring的根本使命------簡化java開發
(1)Spring非入侵式程式設計;
(2)依賴;
依賴注入: 通過DI,物件的依賴關係將由系統中負責協調各物件的第三方元件在建立物件的時候進行設定。物件無需自行建立或管理它們的依賴關係。
裝配(wiring):建立應用元件之間的協作的行為通常稱為裝配。 Spring有多種裝配bean的方式,採用XML是很常見的一種裝配方式。也可以使用java語法裝配。
通過依賴,我們的程式碼不需要知道哪個物件正在請求哪個操作,只需簡單的呼叫一下介面函式即可。具體哪個物件執行哪個操作由XML檔案的bean指出。
(3)面向切面程式設計;
允許你把遍佈應用各處的功能分離出來形成可重用的元件。
主要是在XML檔案中定義一個切面,這個切面被應用到類A,而類A根本就不用關心這個切面,事實上這個類A完全不知道切面的存在。
(4)樣板式程式碼;
Spring皆在通過模板封裝來消除樣板式程式碼。
1.2 Spring容器----容納你的Bean
在Spring的應用中,物件由Spring容器建立和裝配,並存在於Spring容器中。
Spring容器:
(1)bean工廠,(太低階)
(2)應用上下文,基於BeanFactory構建,並提供應用框架級別的服務。
AnnotationConfigApplicationContext 從一個或多個基於java的配置類中載入Spring應用上下文。
AnnotationConfigWebApplicationContext 從一個或多個基於java的配置類中載入Spring Web應用上下文。
ClassPathXmlApplicationContext 從路徑下的一個或多個xml配置檔案中載入上下文定義,把應用上下文的定義檔案作為類資源。
本章結束:
Spring致力於簡化企業級java開發,促進程式碼的鬆散耦合,成功的關鍵在於依賴注入和AOP。
第2章 裝配Bean
裝配機制:
(1)在XML中進行顯示配置。
(2)在JAVA中進行顯示配置。
(3)隱式Bean的發現機制和類中自動裝配。
自動化裝配
Spring的自動化裝配:
(1)元件掃描(component scanning) 預設不啟動,使用@ComponentScan開啟。
@Component 該類會作為元件類,並告訴Spring要為這個類建立bean。 可指定 Bean ID。
@Named 為Bean命名,類似@Component。
@ComponentScan 設定組建掃描的包,預設會掃描與配置類相同的包。包括子包。 對應<contest:component-scan>
(2)自動裝配(autowiring)
@Autowired 指定bean裝配到方法或者屬性上。預設:如果沒有匹配的bean,就會丟擲異常; 如果有多個匹配的bean,也會丟擲異常。
@Inject 大多數情況,是可以和@Autowired替換的。
通過java程式碼轉配bean
@Configuration 表明這個類是一個配置類,該類應該包含在Spring應用上下文中如何建立bean的細節。
@Bean 會告訴Spring這個方法將會返回一個物件,該物件要註冊為Spring應用上下文的bean。預設bean的ID與帶@Bean註解的方法名是一樣的,且帶@Bean的方法都是單例。
通過XML裝配bean
<bean class="soundsystem.SgtPeppers"/> 預設bean的ID是“soundsystem.SgtPeppers#0”
一般使用: <bean id="compactDisc" class="soundsystem.SgtPeppers"/>
(1)借住構造器注入初始化bean; 注入bean,注入字串,注入集合。
(2)介入Setter方法實現屬性注入; 注入bean,注入字串,注入集合。
這(1)和(2)都比較簡單。
混合配置
(1)在JavaConfig中引用XML配置
@Import 將另一個JavaConfig合併到當前的JavaConfig中。
@ImportResource 將XML檔案合併到當前的JavaConfig中。
(2)在XML配置中引用JavaConfig
<import resource="cd-config.xml"/> 引用別的XML檔案。
<bean class="soundsystem.CDConfig"/> 將JavaConfig匯入到XML配置中。
第3章 高階裝配
環境與Profile
profile可以理解為環境,在一個程式,要在多個環境中跑,比如開發環境,測試環境。環境不一樣,有些bean的配置也不一樣。
配置profile bean要分兩部走:
(1)將不同bean的定義整理到一個或多個profile中
@Profile指定改bean屬於哪一個profile。
對應<beans ... profile="dev"> ... </beans>
(2)將對應的profile啟用
spring.profiles.active 確定哪個profile是啟用的
spring.profiles.default 如果沒有配置spring.profiles.active,則該屬性生效。
如果上述兩個屬性都沒有配置,那麼只會建立沒有定義在profile中的bean。
條件化的bean宣告
只有滿足某個條件後,才會建立某個bean。
@Conditional 用在帶@bean的方法上,如果給定的條件計算結果為真,就建立這個bean。
自動裝配與歧義性
當定義了多個同一介面的bean時,Spring無法知道應該裝配那個bean。
解決辦法:首選(primary) 限定符(qualifier)
@Primary 與@Component組合使用,或者與@Bean組合使用
<bean ... primary = "true" />
@Qualifier 在注入的時候指定想要注入進去的是哪個bean。(使用bean ID指定)
可自定義限定符,而不是使用bean ID,這樣做的好處是與bean ID解藕,也是使用@Qualifier註解定義在類上。
可在注入點定義多個限定符,目的是縮小限定符的範圍。(這個知識點好像有問題,待求證 )
可以自己建立一個新的@Creamy註解來代替@Qualifier("Creamy") 。
bean的作用域
預設,所有bean都是以單例的形式建立的。
Spring定義了多種作用域:
(1)單例(Singleton):整個應用中,只建立一個例項。
(2)原型(Prototype):每次注入都建立一個新的例項。
(3)會話(Session):在web應用中。
(4)請求(Request):在web應用中。
@Scope 與@Component或@Bean一起使用。用來宣告bean的作用域。
例: @Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.INTERFACES)
<aop:scoped-proxy>
執行時值注入
將一個值注入到bean的屬性或者構造引數中,我們希望這個值是在執行時再確定。
Spring提供了兩種在執行時求值的方式:
(1)屬性佔位符(Property Placeholder)
(2)Spring表示式語言(SpEL)
@PropertySource 宣告屬性源,常常是一個檔案。
Environment類,有一下常用函式。
有4個 getProperty() 過載變體 | |
getRequiredProperty() | 要求這個屬性必需存在 |
containsProperty() | 檢查某個屬性是否存在 |
getPropertyAsClass() | 就將屬性解析為類 |
getActiveProfiles() | |
getDefaultProfiles() | |
acceptsProfiles() |
“ ${...} ” 佔位符。例:
<bean id="sgtPeppers" class="soubdsystem.BlankDisc" c:_title="${disc.title}" c:_artist="${disc.artist}">
@Value 作用同上
SpEL表示式要放在“ #{...} ” ,(內容多,請看書)。
第4章 面向切面的Spring
理解概念:通知,連線點,切點,切面,引入,織入。
@Aspect 表明該類不僅是一個POJO,而且還是一個切面。
@Pointcut 定義可重用的切點。
@EnableAspectJAutoProxy 啟動自動代理。
@Around 環繞通知。
第5章 構建spring web 應用程式
使用gradle 匯入程式碼即可,版本jdk1.8,tomcat9.0,gradle4.0
編譯,選擇"run on server"
第6章 渲染Web檢視
匯入程式碼後,需要修改WebConfig.java檔案,修改為:
將spring3修改為spring4.