動態織入的aop實現,有兩種方法:
第一類,借助於remoting命名空間下的幾個類,通過獲取當前上下文及反射的機制來實現,這需要被aop的類需要繼承自arshalbyrefobject
或者contextboundobject;
第二類,原理是基於動態**的思想,即在執行時動態構造乙個原有類的子類,這樣就可以在子類的過載方法中插入額外**。
這兩類方法,都有顯著的不足,前者直接要求我們繼承固定類,後者呢,除非父類方法被定義為virtual,或者方法定義於某個介面,否則就不能被過載,這就是得「攔截」並不是可以對任意的方法進行的。
動態織入侷限於clr的限制,不能實現對任何方法進行aop,如果要突破這個限制,只能採用靜態織入的方法,靜態織入採用。靜態織入突破oo設計模式,可以攔截所有的方法甚至建構函式或屬性訪問器,因為它是直接修改il。還有,因為它在執行前修改原有程式集,也就基本不存在執行時的效能損失問題了。它的不足,一方面是框架較複雜,實現較麻煩,依賴於對底層的il指令集的操縱;
一:繼承自contextboundobject的實現
幫助類:
public class securityaspect : imessagesink
private imessagesink _next;
public imessagesink nextsink
}public imessage syncprocessmessage(imessage msg)
public imessagectrl asyncprocessmessage(imessage msg, imessagesink replysink)
private void preprocess(imessage msg)
for ", callstr,
environment.username);
// call some security validating code}}
public class securityproperty : icontextproperty, icontributeobjectsink
public string name
}public void freeze(context newcontext)
public bool isnewcontextok(context newctx)
}[attributeusage(attributetargets.all)]
public class securityattribute : contextattribute
public override void getpropertiesfornewcontext(iconstructioncallmessage ccm)
}
呼叫方:
class program
}[security]
[tracing]
public class sampleclass: contextboundobject
}
二:virtual方法及介面的實現
幫助類:
public class loghandler : icallhandler
public imethodreturn invoke(imethodinvocation input, getnexthandlerdelegate getnext)
", input.methodbase.name);
console.writeline("引數:");
for (var i = 0; i < input.arguments.count; i++)
: ", input.arguments.parametername(i), input.arguments[i]);
}console.writeline("方法執行前的處理");
var retvalue = getnext()(input, getnext);
console.writeline("方法執行後的處理");
return retvalue;}}
public class loghandlerattribute : handlerattribute
}
呼叫方:
public inte***ce isample
class sample1 : isample
public void dosomethingnoaop()
}public class sampleclass
public void sample()
}class program
}
可以看到,第二種方法是用unity實現的,關於unity,這裡多說兩句:
unity的aop可以從3種標記的情況攔截:
transparentproxyinterceptor:直接在類的方法上進行標記,但是這個類必須繼承marshalbyrefobject;
virtualmethod:直接在類的虛方法上進行標記,如上文**;
inte***ceinterceptor:在介面的方法上進行標記,如上文**;
容器 AOP 實現動態部署(一)
集合大家基本都有個認識吧,如 jdk 中的list set map 等,都是很好的集合 容器和集合有什麼不同呢,我個人認為 容器應提供公共的服務 容器中的服務可以操作容器中所有物件 容器中選擇某個物件可以操作物件的屬性和方法 詳情請看下圖 空白處右鍵 容器出現容器 提供的服務,容器物件右鍵出現物件的...
使用AOP 註解實現記錄方法入參出參
有時候我們希望記錄某些方法的入參出參,但是有的時候切面可能把所有符合條件的切面的入參出參都記錄了,沒有很多的必要,有些方法記錄入參出參沒有過大的意義,所以我們可以利用註解 aop 實現針對註解方法的入參出參記錄 註解類 target retention retentionpolicy.runtime...
spring的AOP 基於XML實現AOP的過程
參考對應的 logaspect bean 或者 logaspect 類。logaspect類如下 package org.zttc.itat.spring.proxy import org.aspectj.lang.joinpoint import org.aspectj.lang.proceedi...