同類中不帶註解的方法呼叫帶註解的方法,註解失效?
阿新 • • 發佈:2021-07-21
正好工作中遇到的問題,在這裡記錄。
一、問題背景:
自定義的註解,在方法攔截器中進行攔截,必須在同類實行巢狀呼叫,而且不能改動呼叫方式。
上層方法的呼叫:
二、內部邏輯:
大家都知道,想讓註解生效,根據spring的原理,必須使用代理物件去呼叫帶註解的方法,而同類方法呼叫,類似this呼叫,this是當前物件,從而導致註解失效。
所以問題就變為:讓this成為代理物件。this又從哪裡來呢?this代表當前物件,即userServiceCry,可userServiceCry的代理物件和目標物件(target物件)是分開的(這是因為spring是通過cglib實現代理的)。
userServiceCry物件在走完代理內容之後,就會把原始物件傳遞回來賦值給this,根據事務的傳遞性,我們必須讓userServiceCry將代理物件傳遞給this。
這時候我們再來看看,代理物件呼叫方法的流程。
方法攔截器:
代理物件最終會走進MethodInterceptor介面的實現類的intercept方法中,走完這個攔截方法,就會把原始物件傳過去,去走方法的實現體。
此時我們把代理物件傳過去就可以啦。
三、結語:
記住一定要呼叫invokeSuper方法,而不是invoke方法。這涉及到代理類其實是原始的子類的問題,有興趣的可以私信我。