成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Spring.net中的Aop使用

開發 架構
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程(也叫面向方面),可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加 功能的一種技術。

一. 什么是AOP

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

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

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

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

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

          切面(Aspect)

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

連接點(Joinpoint)

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

通知(Advice)

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

切入點(Pointcut)

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

引入(Introduction)

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

目標對象(Target)

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

代理(Proxy)

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

織入 (Weaving)

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

二. 幾個重要接口 

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

  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代理被創建的時候執行,這樣可以避免在每次方法調用的時候都執行。如果兩個參數的matches方法對于一個給定的方法返回true,并且IMethodMatcher接口的IsRuntime方法也返回true,那么有三個參數的matches方法將在每個方法調用時被調用. 這使得切入點在通知將被執行前可以查看傳入到方法的參數。

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

三. 通知

3.1 通知生命周期

3.2 通知類型

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

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

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

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

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

方法攔截器接口

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

模擬環繞攔截通知

  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 靜態切入點

4.1.1 ProxyFactoryObject 顯式創建AOP代理

  1. AOP 配置文件  
  2.  <object id="UserValidateTarget" type="Stephen.SpringNet.AOPSample.Servcies.Impl.UserValidate, Servcies"></object> 
  3.    
  4.    <object id="RoundInterceptor" type="Stephen.SpringNet.AOPSample.Servcies.Interceptor.RoundInterceptor, Servcies"></object>   
  5.    
  6.    <object id="UserValidateProxy" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop"> 
  7.    
  8.      <property name="proxyInterfaces" value="Stephen.SpringNet.AOPSample.Servcies.IValidateService"/> 
  9.    
  10.      <property name="target" ref="UserValidateTarget"/> 
  11.    
  12.      <property name="interceptorNames"> 
  13.    
  14.        <list> 
  15.    
  16.          <value>RoundInterceptor</value> 
  17.    
  18.        </list> 
  19.    
  20.      </property> 
  21.    
  22.    </object> 

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

4.1.2 ObjectNameAutoProxyCreator 對象名稱自動切入點

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

  1. AOP 配置文件  
  2.  <object id="IValidateProxy" type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop">  
  3.      <property name="ObjectNames">  
  4.        <list>  
  5.          <value>*Validate</value>  
  6.        </list>  
  7.      </property>     
  8.      <property name="InterceptorNames" value="RoundInterceptor"></property>  
  9.    </object
  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.          } 

執行結果

ObjectNameAutoProxyCreatorMethodTest : Passed

Method:Validate開始執行

Method:Validate執行完畢

 

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

  1. AOP 配置  
  2.  <object id="ValidatePointCut" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop"> 
  3.      <property name="Pattern" value="UserValidate.Advance*"></property> 
  4.    </object> 
  5.    <aop:config> 
  6.      <aop:advisor advice-ref="RoundInterceptor" pointcut-ref="ValidatePointCut"/> 
  7.    </aop:config> 

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

 

4.1.4 DefaultAdvisorAutoProxyCreator+RegularExpressionMethodPointcutAdvisor 創建正則表達式AOP

  1. AOP 配置  
  2.  <object id="ProxyCreator" type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop"/>  <object id="ValidateRegularExpressionPointCut" type="Spring.Aop.Support.RegularExpressionMethodPointcutAdvisor, Spring.Aop"> 
  3.      <property name="advice" ref="RoundInterceptor"/> 
  4.      <property name="patterns"> 
  5.        <list> 
  6.          <value>UserValidate.Advance*</value> 
  7.        </list> 
  8.      </property> 
  9.    </object> 

4.1.5 特性Aop

可以通過Attribute類來實現AOP

  1. [AttributeUsage(AttributeTargets.Method)]  
  2.    public class AopAttribute:Attribute  
  3.  
  4.     {    
  5.  
  6.     } 
  1. AOP 配置  
  2.   <object id="aroundAdvisor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop"> 
  3.      <property name="Advice" ref="RoundInterceptor"/> 
  4.      <property name="Attribute" 
  5.                 value ="Stephen.SpringNet.AOPSample.Servcies.AopAttribute, Servcies" /> 
  6.    </object> 
  7.    <object id="ValidateAttributeProxy" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop"> 
  8.      <property name="proxyInterfaces" value="Stephen.SpringNet.AOPSample.Servcies.IValidateService"/> 
  9.      <property name="target" ref="UserValidateTarget"/> 
  10.      <property name="interceptorNames"> 
  11.        <list> 
  12.          <value>aroundAdvisor</value> 
  13.        </list> 
  14.      </property> 
  15.    </object> 

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

責任編輯:林師授 來源: 博客園
相關推薦

2009-06-22 11:48:08

Spring.NET

2009-07-29 14:12:45

ASP.NET tra

2009-03-13 13:46:41

.NETServer push服務端

2009-06-19 11:09:27

Spring AOP

2009-08-10 14:55:43

ASP.NET htt

2009-08-03 10:07:20

ASP.NET Ses

2009-11-03 13:48:02

VB.NET枚舉

2009-07-22 14:23:39

URL RewriteASP.NET

2024-03-25 03:00:00

.NET 6await編程

2009-12-24 14:30:56

VB.NET

2019-11-29 16:21:22

Spring框架集成

2009-11-04 09:18:12

ADO.NET _Re

2009-07-29 13:42:25

ASP.NET注釋

2009-11-12 10:06:01

ADO.NET讀取數據

2009-11-13 10:10:07

2009-10-13 15:20:02

VB.NET使用Dra

2009-10-16 14:07:18

VB.NET使用Mon

2021-03-01 23:26:41

日志Spring BootAOP

2009-07-27 09:29:38

ASP.NET中Jav

2009-07-27 10:22:16

ASP.NET中Coo
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品99久久 | 午夜丰满少妇一级毛片 | 亚洲成人久久久 | 久草精品视频 | 亚洲精品一区二三区不卡 | 精品国产乱码久久久久久老虎 | 亚洲最大的成人网 | www.天堂av.com| 九九视频在线观看视频6 | 亚洲协和影视 | 99pao成人国产永久免费视频 | 欧美精品一区二区三区在线 | 欧美精品一区久久 | 久久无毛 | 久久久久久久久99精品 | 国产在线a | 中文字幕一区在线观看视频 | 国产精品一区一区三区 | 日日干夜夜操 | 久久日韩精品一区二区三区 | 日本一区二区在线视频 | 日韩精品久久久久久 | 亚洲成网站| 午夜视频导航 | 亚洲午夜av久久乱码 | 久艹网站 | 亚洲精品国产第一综合99久久 | 国产精品福利一区二区三区 | av在线一区二区三区 | 国产日韩一区二区三免费 | 成人亚洲性情网站www在线观看 | av一区在线观看 | 日韩在线小视频 | 自拍第一页 | 欧美精品日韩 | 精品一区二区三区在线播放 | 亚洲二区视频 | 亚洲国产网站 | 人人操日日干 | 日本国产欧美 | 国产精品揄拍一区二区 |