依賴注入
控制反轉(zhuǎn)(Inversion of Control趾访,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計原則翼抠,可以用來減低計算機代碼之間的耦合度靡馁。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI)机久,還有一種方式叫“依賴查找”(Dependency Lookup)臭墨。
對于spring框架來說,就是由spring來負責控制對象的生命周期和對象間的關(guān)系膘盖。對于某個具體的對象而言胧弛,以前是它控制其他對象尤误,現(xiàn)在是所有對象都被spring控制,所以這叫控制反轉(zhuǎn)结缚。所有的類都會在spring容器中登記损晤,告訴spring是什么,需要什么红竭,然后spring會在系統(tǒng)運行到適當?shù)臅r候尤勋,把要的東西主動給對象,同時也把對象交給其他需要該對象的地方茵宪。所有的類的創(chuàng)建最冰、銷毀都由 spring來控制。
Spring通過Spring配置來裝配應(yīng)用對象稀火。有三種可選方案:
- 在XML中進行顯式配置暖哨。例:
聲明一個Bean對象<bean id = "xxx" class = "xxxx"/>
- 在Java中進行顯式配置。例:
- 新建Java類凰狞,添加注解
@Configuration
- 在JavaConfig中聲明bean篇裁,需要編寫一個方法,這個方法會創(chuàng)
建所需類型的實例赡若,然后給這個方法添加@Bean
注解
@Bean public XXX getXXX(){ return new XXX(); }
- 新建Java類凰狞,添加注解
- 隱式的bean發(fā)現(xiàn)機制和自動裝配达布。例:
- 在類名上添加注解
@Component
- 在XML配置中啟用組件掃描
<context:component-scan base-package="xxx"/>
- 在類名上添加注解
面向切面
在軟件開發(fā)中,散布于應(yīng)用中多處的功能被稱為橫切關(guān)注點(crosscutting
concern)逾冬。通常來講往枣,這些橫切關(guān)注點從概念上是與應(yīng)用的業(yè)
務(wù)邏輯相分離的,但是往往會直接嵌入到應(yīng)用的業(yè)務(wù)邏輯之中粉渠,比如日
志分冈、安全和事務(wù)管理。
面向切面編程(AOP)的作用就是把這些橫切關(guān)注點與業(yè)務(wù)邏輯相分離霸株。幾個專業(yè)術(shù)語:
- 通知(Advice) :切面的工作 雕沉,定義了切面是什么以及何時使用。Spring切面可以應(yīng)用5種類型的通知:
- 前置通知(Before):在目標方法被調(diào)用之前調(diào)用通知功能去件;
- 后置通知(After):在目標方法完成之后調(diào)用通知坡椒,此時不會關(guān)
心方法的輸出是什么; - 返回通知(After-returning):在目標方法成功執(zhí)行之后調(diào)用通
知尤溜; - 異常通知(After-throwing):在目標方法拋出異常后調(diào)用通知倔叼;
- 環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知的方
法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為宫莱。
- 連接點(Join point):在應(yīng)用執(zhí)行過程中能夠插入切面的一個點丈攒。
- 切點(Poincut):匹配通知所要織入的一個或多個連接點。
- 切面(Aspect):切面是通知和切點的結(jié)合。通知和切點共同定義了切面的全部內(nèi)容:它是什么巡验,在何時和何處完成其功能际插。
- 引入(Introduction):允許我們向現(xiàn)有的類添加新方法或?qū)傩浴?/li>
- 織入(Weaving):把切面應(yīng)用到目標對象并創(chuàng)建新的代理對象的過程。切面會在指定的連接點被織入到目標對象中显设。(編譯期:AspectJ框弛、類加載期:AspectJ 5、運行期:Spring AOP)
編寫切點有以下要點:
- 首先你要有能實現(xiàn)業(yè)務(wù)代碼的類捕捂,然后Spring要有這個類的控制權(quán)(組件)瑟枫,詳見依賴注入。
- 編寫你的切面類指攒,用@Aspect注解為切面類慷妙。而且要在spring配置中獲取這個類。
- 編寫切面方法幽七,即通知。
推薦閱讀:
控制反轉(zhuǎn)(IoC)與依賴注入(DI)
05 Spring Aop實例(AOP 如此簡單)@Aspect溅呢、@Around 注解方式配置