標籤:spring面試 java 面試 aop spring
33 Spring AOP的概念
面向切面的編程,是一種編程技術,是OOP(物件導向編程)的補充和完善。OOP的執行是一種從上往下的流程,並沒有從左至右的關係。因此在OOP編程中,會有大量的重複代碼。而AOP則是將這些與業務無關的重複代碼抽取出來,然後再嵌入到業務代碼當中。常見的應用有:許可權管理、日誌、交易管理等。
實現AOP的技術,主要分為兩大類:一是採用動態代理技術,利用截取訊息的方式,對該訊息進行裝飾,以取代原有對象行為的執行;二是採用靜態織入的方式,引入特定的文法建立“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。Spring AOP實現用的是動態代理的方式。
http://blog.csdn.net/moreevan/article/details/11977115
34 AOP的相關概念
- 切面/方面(Aspect):AOP核心就是切面,它將多個類的通用行為封裝成可重用的模組,該模組含有一組API提供橫切功能。如,一個日誌模組可以被稱作日誌的AOP切面。根據需求的不同,一個應用程式可以有若干切面。在SpringAOP中,切面通過帶有@Aspect註解的類實現。
- 連接點(Joinpoint):程式執行過程中明確的點,如方法的調用或特定的異常被拋出。
- 通知/增強(Advice):在切入點上,可以應用的增強包括:around、before和throws。許多AOP架構套件括Spring都是以攔截器做通知模型,維護一個“圍繞”連接點的攔截器鏈。Spring中定義了四個advice:BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice。
- 切入點(Pointcut):將被增強(Advice)應用的連接點的集合(通常是Method集合)。Spring定義了Pointcut介面,用來組合MethodMatcher和ClassFilter,可以通過名字很清楚的理解,MethodMatcher是用來檢查目標類的方法是否可以被應用此通知,而ClassFilter是用來檢查Pointcut是否應該應用到目標類上。
- 目標對象(TargetObject):被通知(Advice)或被代理對象。
- AOP代理(AOP Proxy):AOP架構建立的對象,包含通知(Advice)。在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。
35 Spring AOP的增強/通知(Advice)類型
- Before Advice:在方法執行前執行。
- AfterAdvice:在方法執行之後調用的通知,無論方法執行是否成功。
- After ReturningAdvice:在方法執行後返回一個結果後執行。
- After ThrowingAdvice:在方法執行過程中拋出異常的時候執行。
- Around Advice:在方法執行前後和拋出異常時執行,相當於綜合了以上三種通知。(相關介面MethodIntercept)
- IntroductionAdvice(引入增強):引入通知是一種特殊的通知,它能將新的成員變數、成員方法引入到目標類中。它不能作用於任何切入點,因為它只作用於類層次,而不是方法層次。實現引入通知需要實現IntroductionAdvisor和IntroductionInterceptor介面。
http://chenjumin.iteye.com/blog/364948
36 Spring AOP 的關注點和橫切關注的區別
- 關注點是應用中一個模組的行為,一個關注點可能會被定義成一個我們想實現的一個功能。
- 橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日誌,安全和資料轉送,幾乎應用的每個模組都需要的功能。因此這些都屬於橫切關注點。
http://blog.csdn.net/shendl/article/details/526362
37 引入(Introduction)的概念
引入(Introduction):添加方法或欄位到被通知的類。Spring允許引入新的介面到任何被通知的對象。例如,你可以使用一個引入使任何對象實現IsModified介面,來簡化緩衝。Spring中要使用Introduction,可有通過DelegatingIntroductionInterceptor來實現通知,通過DefaultIntroductionAdvisor來配置Advice和代理類要實現的介面。
38 Spring有幾種自動代理器
代理器有三類:
- 基於Bean的名字的自動代理建立器,例如BeanNameAutoProxyCreator
- 基於Advisor(切面)匹配機制的自動代理建立器。對spring容器中的所有的Advisor掃描,並將其應用到匹配的Bean中。例如DefaultAdvisorAutoProxyCreator
- 基於Bean中的AspjectJ註解標籤的自動代理建立器,例如AnnotationAwareAspectJAutoProxyCreator
所有的自動代理建立器,都是實現了BeanPostProcessor。spring容器在執行個體化Bean時,BeanPostProcessor會對其加工,對滿足匹配規則的Bean自動建立代理對象。
http://blog.csdn.net/itomge/article/details/8861268
http://uule.iteye.com/blog/894055
39 Spring織入概念
織入(Weaving):把切面(Aspect)應用到目標對象來建立新的代理對象的過程,織入一般發生在如下幾個時機:
- 編譯時間:當一個類檔案被編譯時間進行織入,這需要特殊的編譯器才可以做的到,例如AspectJ的織入編譯器。
- 類載入時:使用特殊的ClassLoader在目標類被載入到程式之前增強類的位元組代碼。
- 運行時:切面在啟動並執行某個時刻被織入,SpringAOP就是以這種方式織入切面的,原理應該是使用了動態代理技術。
40 Spring AOP的實現方式1、經典的基於代理的AOP:使用Java代碼實現,編寫Advice、PointCut,然後提供給Advisor使用。開啟自動代理後,即可在applicationContext中獲得增強後的bean。
http://blog.sina.com.cn/s/blog_5198c7370100hw1p.html
2、@AspectJ註解驅動的切面:基於註解的開發(推薦使用),在項目中需要開啟AOP自動代理<aop:aspectj-autoproxy/>。
3、XML Schema方式:需要實現相應的增強介面,如BeforeAdvice、AfterAdvice等。然後利用一下配置如:
<aop:config>
<aop:aspectref="sleepHelper">
<aop:beforemethod="beforeSleep" pointcut="execution(**.sleep(..))"/>
<aop:aftermethod="afterSleep" pointcut="execution(**.sleep(..))"/>
</aop:aspect>
</aop:config>
http://hyhai7.iteye.com/blog/837497
Java面試--Spring技術要點--Spring AOP(面向切面編程)