1.spring為了降低java開發的複雜性,采取了4種關鍵政策:
- 基于pojo的輕量級和最小侵入性程式設計
- 通過依賴注入和面向接口實作松耦合
- 基于切面和慣例進行聲明式程式設計
- 通過切面和模闆減少樣闆式樣闆式代碼
2.如果一個對象隻通過接口而不是具體的實作或初始化過程來表明依賴關系,name這種依賴就是能夠在對象本身毫不知情的情況下,用不同的具體實作進行替換
public class aa implements bb {
private Quest quest ;
public aa(Quest quest){
this.quest = quest
}
public void lala(){
quest.embak();
}
}
3.建立元件之間的行為通常稱為裝配,如采用xml方式,<bean><constructor-arg ref='aa'/></bean>
或使用java來描述配置:
@configuration
@bean
4.spring 通過應用 上下文(application context)來裝載 bean,上下文負責對象的建立群組裝,spring自帶了多種上下文的實作,他們的差別在于如何加載配置,建立應用對象之間的協作關系的行為通常稱為裝配,也就是依賴注入,,spring提供了三種主要的裝配機制:
- xml顯式
- java中進行顯式配置
- 隐式的bean發現機制和自動裝配
5.spring夠自動化裝配,那何苦要要顯示的将這些bean裝配在一起呢?
比如想要将第三方的元件裝配到你的應用中,這種情況是沒有辦法在他的類上上添加注解的,或者是将配置檔案中的内容引入你應用中也需要顯式裝配
6.如何建立可被發現的bean?
- 在實作類上注解@component注解,在另外一個類上注解@configuration和@componentScan注解,xml方式:<context:component-scan base-package=""/>
- 為元件掃描的bean命名
預設spring的bean命名方式是類名的第一個字母變小寫,也可以指定bean的名稱@component("name"),也可以使用@Named("name"),@named注解不常用.
- 設定元件掃描的基礎包
@componentScan(basepages={"",""})
@componentScan(baseClasses={.class,.class})
- 通過為bean添加注解實作自動裝配
@Autowired,注意應用上下文在建立的時候,如果沒有比對到bean,spring會抛出一個異常,為了避免異常的出現,可以在@Autowired的required的屬性設定為false;但是如果沒有進行null檢查,可能會出現空指針
也可以使用java規範的@Inject注解,
7.通過java代碼來裝配bean
使用java來配置而不是xml是因為java更強大,并且安全,對重構友好
@configuration
@bean
8.通過xml進行裝配
隻作了解:<bean id="aaa" class = "xxx.xx"></bean> //指定全限定名,并且指定名稱
構造器引入bean :<bean><constructor-arg ref=""></bean>
c命名空間:<bean id="aa" class= "" c:cd-ref = ""></bean>
還有p屬性注入命名空間........
9..導入和混合配置
-
在javaconfig中引用xml:@configuratin @import(.class)@ImportResouce("classPath:xxx.xml")
進階裝配bean
1.環境與profile
@profile注解指定某個bean屬于哪一個profile,并且確定對應的profile處于激活的狀态
如@profile("dev"),隻要在規定的profile激活時,相應的bean才會被建立
xml中也可以配置profile:<bean profile="dev"></bean>
注意:spring在确定哪個profile處于就激活狀态時,需要依賴于active和default.優先級是active>default,如果都麼有配置,那麼spring隻會建立那些沒有定義profile的bean
如:@activeprofile("dev")
2.條件化的bean
@conditional(xxx.class),傳回true和false,true才繼續執行
3.處理自動裝配的歧義性
如果有多個bean的話 ,spring建立上下文時候無法做出選擇,會抛異常
- primary首選bean,@compent @primary
- @qualifier限定自動轉配的bean,進一步縮小範圍,@Qualifier("xxx")
- 當需要在一個類中引入多個通用的bean,可以使用自定義的限定符注解,可以使用注解的方式
4.bean的作用域
84