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