動態織入的AOP實現

2021-06-19 10:09:27 字數 2748 閱讀 7918

動態織入的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...