javascript
《 Spring 实战 》(第4版) 读书笔记 (未完结,更新中...)
前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到教程。
Pxx? 表示在書的第 xx 頁。
Spring 框架的核心是 Spring 容器。
1. (P7.) 構(gòu)造器注入是依賴注入的方式之一。
緊耦合:在 A 類的無參構(gòu)造器中直接 new 出一個 B 類。
Spring 松耦合:在 A 類中使用有參構(gòu)造器,把 B 類的超類類型 X 作為構(gòu)造參數(shù)傳入。
這樣不需要 A 類管理 B 類,并且可以根據(jù)不同情況傳入不同的實際參數(shù),只是 X 的子類就可以注入到 A 中使用。A
2. (P15) .A 類中有一個 x 方法,B 類有 y ,z 方法。在 x 方法執(zhí)行前后分別執(zhí)行 y,z 方法要顯示的寫出調(diào)用代碼 。
Spring aop :把 A 類聲明為一個切面。把 A 聲明為一個 bean , 定義切入點 ( 包含 x 方法 ) ,分別配置 y,z 為前置、后置通知。這樣 A 類完全不知情時就已經(jīng)調(diào)用執(zhí)行 B 類的對應(yīng)方法了。
3. (P34.) 裝配 (wiring):創(chuàng)建應(yīng)用對象之間協(xié)作關(guān)系的行為,這也是依賴注入(DI)的本質(zhì)。
Spring 有三種主要裝配機制:在 xml 中進行顯示配置、在 java 中進行顯示配制、隱式的 bean 發(fā)現(xiàn)機制和自動裝配。
Spring? 從兩個角度來實現(xiàn)自動化裝配 :組件掃描 (component scanning)- Spring 會自動發(fā)現(xiàn)應(yīng)用上下文中所創(chuàng)建的 bean 。 自動裝配 (autowiring) - Spring 自動滿足 bean 之間的依賴。4. (P37.)? 掃描包的方式:
1)@ComponentScan 默認會掃描與配置類相同包的類。
2)指定掃描包: @ComponentScan(basePackages="單個類名")、 @ComponentScan(basePackages={“第一個包名”,“第N個包名”}) 、@ComponentScan(basePackagesClasses={A.class,B.class})?
最后一種方式利于重構(gòu)代碼,A 、B 類是接口類型的話,改變實現(xiàn)類的類名,在掃描包時不受影響。
5.?(P38.)?
import?static org.junit.Assert.*; 導(dǎo)入此類,可以調(diào)用方法 assertNotNull(要檢查的對象); 來檢查對象是否為 null 。6?.?(P38.) Spring 應(yīng)用上下文中所有的 bean 都會給寫一個 ID , 這個 bean 所給寫的 ID 為類名的第一個字母變小寫。
可以顯示的給 bean 命名,有 2 種方式 :@Compnent ("這個位置寫名字") 、@Named ("這個位置寫名字") 。
----------?---------- ---------- ---------- ---------- ---------- ---------- ---------- 創(chuàng)建于 2018.11.10?
7?.?(P41.) 注解 @Autowired? 可用在構(gòu)造方法上,屬性的 Setter 方法上,以及任何方法上。當有且僅有一個 bean 匹配依賴需求,就會裝配起來。當沒有匹配時會拋出異常。此時可設(shè)置 @Autowired 的屬性 required 為 false :@Autowired(required = false),不作檢查,但這樣沒有匹配到 bean ,則 bean 處于未裝配狀態(tài),如果代碼也未作 null 檢查,可能會出現(xiàn) NPE(空指針異常)。
@Autowired 可用@Inject 代替。
8?.?(P44.)? JavaConfig 是配置代碼,不包含任何業(yè)務(wù)邏輯,應(yīng)當單獨放到一個包中。
9 .?(P45.)? @Bean 會告訴 Spring? 這個方法將會返回一個對象,該對象要注冊為 Spring 應(yīng)用上下文中的 bean 。bean 的 ID 與帶有 @Bean 注解的方法名是一樣的。設(shè)置不同名字可以重命名方法名,也可以通過 name 屬性指定不同的名字:@Bean(name = "新名字") 。
10 .?(P48.)? 可用 Spring? Tool? Suite 創(chuàng)建 XML 配置文件,并可選擇對應(yīng)的命名空間。
11 .?(P49.)? XML 中的 <bean> 類似于 JavaConfig 中的 @Bean 。 <bean class = "此處要寫全限定名(全類路徑)"> 。
Spring 發(fā)現(xiàn) <bean> 默認調(diào)用構(gòu)造器創(chuàng)建 bean。
12 .?(P56.)? 裝配通用規(guī)則:對于強依賴使用構(gòu)造器注入,對于可選性的依賴使用屬性注入。
在 XML 中,<property> 對應(yīng)屬性的 Setter 方法,<constructor-arg> 對應(yīng)類的構(gòu)造器。
13 .?(P62.)? 導(dǎo)入其它配置
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 更新于 2018.11.11
14. (P62.)? @Profile(“dev”) 注解指定 bean 屬于哪一個 profile 。當注解應(yīng)用配置在類級別上時,表示Spring 這個配置類中的 bean只有在 dev profile 激活時才會創(chuàng)建。若?dev profile 沒有激活,那么帶有@Bean 注解的方法都會被忽略掉。
Spring 確定哪個 profile 處于激活狀態(tài),依賴兩個獨立的屬性:spring.profiles.active 和 spring.profiles.default 。可以有多種配置方式來設(shè)置這兩個屬性:1)作為 DispatcherServlet 的初始化參數(shù)。2)作為 web 應(yīng)用上下文參數(shù)。3)作為 JNDI 條目。4)作為環(huán)境變量。5)作為 JVM 的系統(tǒng)屬性。6)在集成測試類上,使用 @ActiveProfiles 注解設(shè)置。15. (P75.)? 只有滿足某種條件才創(chuàng)建 bean ,即條件化,使用注解: @Conditional ( Xxx.class ) 。xxx可以傳一個任意的實現(xiàn)了Conditon 接口的實現(xiàn)類。
16. (P80.)? 當只有一個 bean 匹配時,Spring 會自動裝配。多個 bean匹配時,確定首選 bean 的方式 :
@Primary + @Component 組合,或者 @Bean + @Component 組合,多個 bean匹配時,可以確定優(yōu)先選擇對象。
XML 中可以配置 :
<bean id="xxx" class ="xxxx" primary ="true" > 來確定首選 bean 。17. (P81.)? 指定注入 bean 方式: @Autowired + @Qualifier(" 要注入的 bean 的ID ") 。這種方式是和類名緊耦合的。
可以用自定義限定符注解 :在一個類 A 上加上注解 @Qualifier("cold") 假定表示這個類有 cold 特性。
同時把 bean? 交給 Spring 管理,于是在 A 類上就有2個注解 :@Component + @Qualifier("這個位置是特性,可任意填寫") 或者:@Bean?+ @Qualifier("特性描述") 。
當有多個特性時是不能把 @Qualifier 寫多次的,會編譯報錯。這時就用處定義注解:public @interface Cold( ) ...?public @interface Red( ) ... 等。
當在方法上、類上要注入對應(yīng)特性 bean 時注解寫為:@Component + @Cold + @Red ,組合起來使用就行了。
18. (P84.) Sprng 應(yīng)用上下文中的所有 bean 都是單例的,不論注入多少次,每次注入的都是同一個 bean。
指定作用域來創(chuàng)建 bean 使用注解:@Scope("prototype") 表示該 bean? 作用域類型為 原型類型。可用常量代替“prototype” ,且常量更安全。
可以基于作用域來創(chuàng)建 bean :1.單例(Singleton):在整個應(yīng)用中,只創(chuàng)建一個實例。2.原型(Prototype):每次注入或者通過 Spring 應(yīng)用上下文獲取的時候,都會創(chuàng)建一個新的 bean 實例。3.會話(Session):在 web 應(yīng)用中,為每個會話創(chuàng)建一個 bean 實例。4.請求(Request):在 web 應(yīng)用中,為每個請求創(chuàng)建一個 bean 實例。可以在 XML 中配置為:
<bean id ="xxx" class="xxx" scope="prototype"> 表示作用域類型為:原型類型?應(yīng)用場景如:購物車則把作用域設(shè)置為:會話類型。
其實,注入的并不是真正的 bean ,而是一代理對象,代理對象會報露出與原 bean 相同的方法,當service 真正調(diào)用該方法時,代理會對其進行懶解析,并將調(diào)用委托給會話作用域內(nèi)真正的 bean。
19. (P89.) Spring 提供了兩種在運行時求值的方式:屬性占位符(Property placeholder)、Spring 表達式語言 (SpEL)。
注入外部值可以用 Spring Environment 來檢索屬性。
20. (P103.) Spring 切面有 5 種類型:
1.前置通知(Before):在目標方法被調(diào)用前 調(diào)用通知功能。2.后置通知(After):在目標方法完成之后 調(diào)用通知,此時不關(guān)心方法的輸出是什么。3.返回通知(After-returnning):在目標方法成功執(zhí)行之后 調(diào)用通知。4.異常通知(After-throwing):在目標方法拋出異常后 調(diào)用通知。5.環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知方法調(diào)用之前和調(diào)用之后執(zhí)行的自定義行為。21. (P105.) Spring 提供了 4 種類型的 AOP 支持:
1.基于代理的經(jīng)典 Spring AOP。2.純 POJO 切面。3.@AspectJ 注解驅(qū)動切面。4.注入式 Aspect 切面 (適用于 Spring 各個版本)。22. (P106.) Spring 的切面由包裹了目標對象的代理類實現(xiàn)。代理類處理方法的調(diào)用,執(zhí)行額外的切面邏輯,并調(diào)用目標方法。
23. (P110.)? 注解 @Aspect 用于定義切面。
切點定義方式:
@Pointcut(“execution( ** xxx.xxx.xxx.類名.方法名(..))”)也可以把以上這一行注解給在一個空參 void 方法 A 上。在其它方法上通知注解的切點寫法為:@Before( "A"?),表示 這個前置通知的切點同于 A 方法的切點。
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 更新于 2018.11.16
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的《 Spring 实战 》(第4版) 读书笔记 (未完结,更新中...)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详谈Windows消息循环机制
- 下一篇: MFC中Windows窗口消息循环及多线