本文介紹了反射+AOP-通過Invoke調(diào)用方法時(shí)未截獲通知的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
通過反射:
Class c = Class.forName("mypackage.DiodeService");
Method m = c.getDeclaredMethod("blink");
Object t = c.newInstance();
Object o = m.invoke(t);
調(diào)用DiodeService中的方法:
@ValueGreaterThan
public void blink(){
log.info("Diode service: blink()");
}
在注釋@ValueGreaterThan為偵聽方面:
@Around(value = "mypackage.CommonJoinPointConfig.valueGreaterThanAspect())") public void around(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("Value greater than aspect {}", joinPoint); }
BUT:當(dāng)通過”Invoke”調(diào)用方法時(shí),從不截取周圍的通知。
當(dāng)diodeService.blink()
調(diào)用時(shí),正常截取周圍的建議
請注意,有什么想法嗎?
推薦答案
Spring AOP基于運(yùn)行時(shí)編織,這是因?yàn)?strong>基于代理的性質(zhì)。這意味著目標(biāo)Bean是一個(gè)由Spring管理的Bean。在Spring運(yùn)行時(shí),該Bean被轉(zhuǎn)換為代理。
如果DiodeService
是Spring代理(由Spring管理),則Spring AOP將正常工作,即對blink
的任何調(diào)用都將截獲通知。
如果DiodeService
直接實(shí)例化而不是通過Spring實(shí)例化,blink
周圍的通知將永遠(yuǎn)不會被截取。這是通過調(diào)用newInstance
,
來實(shí)例化DiodeService
時(shí)的情況
Object t = c.newInstance()
這篇關(guān)于反射+AOP-通過Invoke調(diào)用方法時(shí)未截獲通知的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,