理想是美好的,但沒有意志,理想不過是瞬間即逝的彩虹。
Spring的兩個核心特性
Spring為企業級開發提供了豐富的功能,這些功能的底層都依賴於它的兩個核心特性:
1. 依賴注入(dependency injection,DI)
2. 面向切面編程(aspect-oriented programming,AOP)
依賴注入(IOC)
1. 通常程序功能的實現由兩個或多個類的對象共同協作完成,通過DI,對象的依賴關系將由系統中負責協調各對象的第三方組件在創建對象的時候進行設定,對象無需自行創建或管理它們的依賴關系。
依賴注入將對象所依賴的關系自動交給目標對象,而不是由對象自己去獲取依賴,這樣對象之間達到了松耦合的目地。
2. 通俗來理解依賴注入:
1) 類A的某個方法實現需要調用類B的對象,那么類A依賴類B(因為沒有類B對象,類A可能就無法完成某功能),這樣就形成的依賴關系A——>B。
2) 通常我們的做法,是直接在類A中直接new 一個類B的對象,也就是由類A本身創建依賴關系,這樣做的缺點是類A與類B之間緊耦合,而Spring的做法是將依賴關系的創建交給容器。
3) 容器在創建對象的時候將依賴關系注入到類A,這樣做達到了類A與類B松耦合的目地。
4) Spring通過裝配將對象的依賴關系注入,通過應用上下文將對象組裝起來。
3. 依賴注入的方式:
1) 構造器注入
2) 屬性注入
3) 字段注入(注解方式)
應用上下文
Spring通過應用上下文裝配bean的定義並把它們組裝起來。
Spring自帶了多種應用上下文的實現,下面是最常用的幾個:
1)ClassPathXmlApplicationContext
2)AnnotationConfigApplicationContext
3)AnnotationConfigWebApplicationContext
4)FileSystemXmlApplicationContext
5)XmlWebApplicationContext
裝配bean
1. Spring裝配bean的三種方案(按建議的優先使用順序):
1) 自動化裝配
2) 通過Java代碼配置
3) 通過XML配置
以上三種配置方案,建議盡可能地使用自動化配置的機制,顯示配置越少越好。
2. 自動化裝配bean
2.1 Spring從兩個角度來實現自動化裝配
1) 組件掃描:Spring會自動發現應用上下文中所創建的bean。
2) 自動裝配:Spring自動滿足bean之間的依賴。
2.2 Spring自動化裝配主要使用的注解:
1) @Component:標志要創建的bean
2) @ComponentScan:啟用組件掃描
3)@AutoWired:將bean的依賴注入。(也可用源於Java依賴注入規范的@Inject注解)
3. 通過Java代碼裝配bean
盡管在很多場景下通過組件掃描和自動裝配來實現Spring的自動化配置時更為推薦的方式,但是在如使用第三方庫中的組件(因為自動化配置需要將注解寫到具體的類上,而第三方庫的類都是封裝、編譯的),這時就可以使用Java配置。
通過Java顯示配置Spring:
1) 創建配置類:使用@Configuration注解聲明類為配置類。
2)聲明bean:使用@Bean注解在JavaConfig配置類中聲明bean。
4. 通過XML裝配bean
1) 創建XML文件,並以<bean>元素為根,在XML配置文件的頂部需要引入多個XML模式(XSD文件),這些文件定義了配置Spring的XML元素。
建議使用Spring Tool Suite插件,通過File->new->Spring Bean Configuration File ,能夠創建Spring XML配置文件,並可以選擇可用的配置命名空間(如aop)。
2) 使用<bean>元素聲明bean
3) 使用<constructor-arg>元素或c-命名空間的<c:_ref=""/>借助構造器注入依賴。
4) 使用<property>元素或p-命名空間的<p:name-ref=""/>裝配屬性。
面向切面編程(AOP)
在軟件開發中,散布於應用中多處的功能被稱為橫切關注點。通常來講,這些橫切關注點從概念上是與應用的業務邏輯相分離的,把這些橫切關注點與業務邏輯相分離、實現橫切關注點和它們所影響的對象之間的解耦正是面向切面編程(AOP)要解決的問題。
1. 定義AOP術語
1)通知(Advice)
通知定義了切面是什么及何時使用。
通知有5種類型:
前置通知(Before)
后置通知(After)
環繞通知(Around)
返回通知(After-returning)
異常通知(After-throwing)
2)連接點(Join-point)
連接點是應用執行過程中能夠插入切面的一個點。
3)切點(PoinCut)
切點定義了何處使用。切點的定義會匹配通知所要織入的一個或多個連接點。
4)切面(Aspect)
切面是通知和切點的結合,通知和切點共同定義了切面的全部內容-它是什么,在何時和何處完成其功能。
5)引入(Intriduction)
引入允許我們在無需修改現有類的情況下,向現有的類添加新方法或屬性,使它們具有新的行為和屬性。
6)織入(Weaving)
織入是把切面應用到目標對象並創建新的代理對象的過程,切面在指定的連接點被織入到目標對象。
在目標對象的生命周期有多個點可以織入:
編譯期
類加載期
運行期