1. 程式人生 > 其它 >同類中不帶註解的方法呼叫帶註解的方法,註解失效?

同類中不帶註解的方法呼叫帶註解的方法,註解失效?

正好工作中遇到的問題,在這裡記錄。

一、問題背景:

自定義的註解,在方法攔截器中進行攔截,必須在同類實行巢狀呼叫,而且不能改動呼叫方式。

上層方法的呼叫:

二、內部邏輯:

大家都知道,想讓註解生效,根據spring的原理,必須使用代理物件去呼叫帶註解的方法,而同類方法呼叫,類似this呼叫,this是當前物件,從而導致註解失效。

所以問題就變為:讓this成為代理物件。this又從哪裡來呢?this代表當前物件,即userServiceCry,可userServiceCry的代理物件和目標物件(target物件)是分開的(這是因為spring是通過cglib實現代理的)。

userServiceCry物件在走完代理內容之後,就會把原始物件傳遞回來賦值給this,根據事務的傳遞性,我們必須讓
userServiceCry將代理物件傳遞給this。
這時候我們再來看看,代理物件呼叫方法的流程。
方法攔截器:

代理物件最終會走進MethodInterceptor介面的實現類的intercept方法中,走完這個攔截方法,就會把原始物件傳過去,去走方法的實現體。

此時我們把代理物件傳過去就可以啦。

三、結語:
記住一定要呼叫invokeSuper方法,而不是invoke方法。這涉及到代理類其實是原始的子類的問題,有興趣的可以私信我。