日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析Spring.net中的Aop使用

一. 什么是AOP

十余年的雷山網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都營銷網(wǎng)站建設的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整雷山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“雷山網(wǎng)站設計”,“雷山網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程(也叫面向方面),可以通過預編譯方式和運行期動態(tài)代理實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加 功能的一種技術(shù)。AOP實際是GoF設計模式的延續(xù),設計模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標的一種實現(xiàn)。

主要的功能是:日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等等。

主要的意圖是:將日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等代碼從業(yè)務邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業(yè)務邏輯的方法中,進而改變這些行為的時候不影響業(yè)務邏輯的代碼。

可以通過預編譯方式和運行期動態(tài)代理實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的一種技術(shù)。AOP實際是GoF設計模式的延續(xù),設計模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標的一種實現(xiàn)。

在Spring中提供了面向切面編程的豐富支持,允許通過分離應用的業(yè)務邏輯與系統(tǒng)級服務(例 如審計(auditing)和事務(transaction)管理)進行內(nèi)聚性的開發(fā)。應用對象只實現(xiàn)它們應該做的——完成業(yè)務邏輯——僅此而已。它們并 不負責(甚至是意識)其它的系統(tǒng)級關注點,例如日志或事務支持。

          切面(Aspect)

切面是你要實現(xiàn)的交叉功能。它是應用系統(tǒng)模塊化的一個切面或領域。切面的最常見(雖然簡單)例子是日志記錄。日志記錄在系統(tǒng)中到處需要用到,利用繼承來重用日志模塊不適合。然而,你可以創(chuàng)建一個日志記錄切面,并且使用AOP在系統(tǒng)中應用。

連接點(Joinpoint)

連接點是應用程序執(zhí)行過程中插入切面的地點。這個地點可以是方法調(diào)用,異常拋出,或者甚至是要修改的字段。切面代碼在這些地方插入到你的應用流程中,添加新的行為。

通知(Advice)

通知切面的實際實現(xiàn)。它通知應用系統(tǒng)新的行為。在日志例子中,日志通知包含了實現(xiàn)實際日志功能的代碼,如向日志文件寫日志。通知在連接點插入到應用系統(tǒng)中。

切入點(Pointcut)

切入點定義了通知應該應用在哪些連接點。通知可以應用到AOP框架支持的任何連接點。當然,你并不希望把所有切面應用到所有可能的連接點上。切入點讓你指定通知應用到什么地方。通常通過指定類名和方法名,或者匹配類名和方法名式樣的正則表達式來指定切入點。一些AOP框架允許動態(tài)創(chuàng)建切入點,在運行時根據(jù)條件決定是否應用切面,如方法參數(shù)值。

引入(Introduction)

引入允許你為已存在類添加新方法和屬性。例如,你可以創(chuàng)建一個稽查通知來記錄對象的***修改時間。只要用一個方法setLastMofified(Date)以及一個保存這個狀態(tài)的變量。可以在不改變已存在類的情況下將這個引入,給他們新的行為和狀態(tài)。

目標對象(Target)

目標對象是被通知對象。它既可以是你編寫的類也可以是你要添加制定行為的第三方類。如果沒有AOP,這個類就必須要包含它的主要邏輯以及其他交叉業(yè)務邏輯。有了AOP,目標對象就可以全身心地關注主要業(yè)務,忘記應用其上的通知。

代理(Proxy)

代理是將通知應用到目標對象后創(chuàng)建的對象。對于客戶對象來說,目標對象(應用AOP之前的對象)和代理對象(應用AOP之后的對象)是一樣的。也就是,應用系統(tǒng)的其他部分不用為了支持代理對象而改變。

織入 (Weaving)

織入是將切面應用到目標對象從而創(chuàng)建一個新的代理對象的過程。切面在指定接入點被織入到目標對象中。

二. 幾個重要接口 

用于找到用于通知的相關的類型和方法

 
 
 
 
  1. View Code   
  2.  public interface IPointcut  
  3.    
  4.  {  
  5.    
  6.      ITypeFilter TypeFilter { get; }  
  7.    
  8.      IMethodMatcher MethodMatcher { get; }  
  9.    
  10.  } 

用于匹配相關類型

 
 
 
 
  1. View Code   
  2.  public interface ITypeFilter  
  3.    
  4.  {  
  5.    
  6.      bool Matches(Type type);  
  7.    
  8.  }  
  9.    
  10.  public interface IMethodMatcher  
  11.    
  12.  {  
  13.    
  14.      bool IsRuntime { get; }  
  15.    
  16.      bool Matches(MethodInfo method, Type targetType);  
  17.    
  18.      bool Matches(MethodInfo method, Type targetType, object[] args);  
  19.    
  20.  } 

Matches(MethodInfo, Type)方法用來測試這個切入點是否匹配目標類的指定方法。這將在AOP代理被創(chuàng)建的時候執(zhí)行,這樣可以避免在每次方法調(diào)用的時候都執(zhí)行。如果兩個參數(shù)的matches方法對于一個給定的方法返回true,并且IMethodMatcher接口的IsRuntime方法也返回true,那么有三個參數(shù)的matches方法將在每個方法調(diào)用時被調(diào)用. 這使得切入點在通知將被執(zhí)行前可以查看傳入到方法的參數(shù)。

絕大多數(shù)的IMethodMatcher接口是static的,這也就意味著它們的IsRuntime屬性返回false.在這種情況下,有三個參數(shù)的Matches方法將永遠不會被調(diào)用.

三. 通知

3.1 通知生命周期

3.2 通知類型

一、攔截環(huán)繞通知(around advice):Spring.NET中最基本的通知類型是攔截環(huán)繞通知(interception around advice),即方法攔截器。攔截環(huán)繞通知繼承IMethodInterceptor接口。注意其中IMethodInvocation.Proceed()方法的調(diào)用。該方法會依次調(diào)用攔截器鏈上的其它攔截器。大部分攔截器都需要調(diào)用這個方法并返回它的返回值。當然,也可以不調(diào)用Proceed方法,而返回一個其它值或拋出一個異常,但一般不太會這么做。

二、前置通知(before advise):是在IMethodInterceptor.Proceed()方法調(diào)用前的通知。繼承自IMethodBeforeAdvice接口。

三、異常通知(throws advise):是在IMethodInterceptor.Proceed()方法調(diào)用時發(fā)生異常的通知。繼承自IthrowsAdvice接口。IthrowsAdvice接口沒有定義任何方法:它是一個標識接口(按:之所以用標識接口,原因有二:1、在通知方法中,只有***一個參數(shù)是必須的。如果聲明為接口的方法,參數(shù)列表就被固定了。2、如果***個原因可以用重載的接口方法解決,那么這個原因就是使用標識接口的充分原因了:實現(xiàn)此接口的類必須聲明一或多個通知方法,接口方法做不到這一點),用以表明實現(xiàn)它的類聲明了一或多個強類型的異常通知方法。

四、后置通知(after returning advise):是在IMethodInterceptor.Proceed()方法調(diào)用后的通知。繼承自IAfterReturningAdvice接口。后置通知對切入點的執(zhí)行沒有影響,如果通知拋出異常,就會沿攔截器鏈向上拋出,從而中斷攔截器鏈的繼續(xù)執(zhí)行。

3.2.1 Interception Around Advice(環(huán)繞攔截通知,后面的講解以環(huán)繞攔截通知為例子)

方法攔截器接口

 
 
 
 
  1. View Code   
  2.  public interface IMethodInterceptor : IInterceptor  
  3.    
  4.  {  
  5.    
  6.      object Invoke(IMethodInvocation invocation);  
  7.    
  8.  } 

模擬環(huán)繞攔截通知

 
 
 
 
  1. View Code   
  2.  public class DebugInterceptor : IMethodInterceptor   
  3.  {  
  4.    
  5.      public object Invoke(IMethodInvocation invocation)   
  6.  {  
  7.    
  8.          Console.WriteLine("Before: invocation=[{0}]", invocation);  
  9.    
  10.          object rval = invocation.Proceed();  
  11.    
  12.          Console.WriteLine("Invocation returned");  
  13.    
  14.          return rval;  
  15.    
  16.      }  
  17.    
  18.  } 

注意 IMethodInvocation 的 Proceed 方法,proceed方法返回方法的返回值.

四. 切入點操作

4.1 靜態(tài)切入點

4.1.1 ProxyFactoryObject 顯式創(chuàng)建AOP代理

 
 
 
 
  1. AOP 配置文件  
  2.   
  3.    
  4.       
  5.    
  6.     
  7.    
  8.       
  9.    
  10.       
  11.    
  12.       
  13.    
  14.         
  15.    
  16.          RoundInterceptor 
  17.    
  18.         
  19.    
  20.       
  21.    
  22.     

不過由于顯式的創(chuàng)建AOP在要創(chuàng)建多個代理的時候需要重復的配置因此Spring提供了自動代理

4.1.2 ObjectNameAutoProxyCreator 對象名稱自動切入點

可以用特定的文本值或通配符匹配目標對象的名稱,并為滿足條件的目標對象創(chuàng)建AOP代理。該類支持模式匹配字符串,如:"*name","name*",”*name*“和精確文本如"name"。我們可以通過下面這個簡單的例子了解一下自動代理的功能。

 
 
 
 
  1. AOP 配置文件  
  2.    
  3.        
  4.          
  5.          *Validate  
  6.          
  7.           
  8.        
  9.     
 
 
 
 
  1. 測試方法  
  2.  [TestMethod]  
  3.          public  void ObjectNameAutoProxyCreatorMethodTest()  
  4.          {  
  5.              var context = ContextRegistry.GetContext();  
  6.              IDictionary validates = context.GetObjectsOfType(typeof(IValidateService));  
  7.              foreach (DictionaryEntry validate in validates)  
  8.              {  
  9.                  ((IValidateService) validate.Value).Validate(null);  
  10.    
  11.              }  
  12.          } 

執(zhí)行結(jié)果

ObjectNameAutoProxyCreatorMethodTest : Passed

Method:Validate開始執(zhí)行

Method:Validate執(zhí)行完畢

4.1.3 SdkRegularExpressionMethodPointcut 通過正則表達式來匹配需要執(zhí)行的類或方法

 
 
 
 
  1. AOP 配置  
  2.   
  3.       
  4.     
  5.     
  6.       
  7.     

pattern 的屬性 UserValidate.Advance* 表示 匹配 UserValidate 類中的以Advance開頭的方法

4.1.4 DefaultAdvisorAutoProxyCreator+RegularExpressionMethodPointcutAdvisor 創(chuàng)建正則表達式AOP

 
 
 
 
  1. AOP 配置  
  2.     
  3.       
  4.       
  5.         
  6.          UserValidate.Advance* 
  7.         
  8.       
  9.     

4.1.5 特性Aop

可以通過Attribute類來實現(xiàn)AOP

 
 
 
 
  1. [AttributeUsage(AttributeTargets.Method)]  
  2.    public class AopAttribute:Attribute  
  3.  
  4.     {    
  5.  
  6.     } 
 
 
 
 
  1. AOP 配置  
  2.    
  3.       
  4.      
  5.                 value ="Stephen.SpringNet.AOPSample.Servcies.AopAttribute, Servcies" /> 
  6.     
  7.     
  8.       
  9.       
  10.       
  11.         
  12.          aroundAdvisor 
  13.         
  14.       
  15.     

原文鏈接:http://www.cnblogs.com/vipyoumay/archive/2012/07/07/2580420.html


當前標題:淺析Spring.net中的Aop使用
文章出自:http://www.dlmjj.cn/article/djieede.html