有時候,常常會有的人以爲基礎知識有什麼用?面試那麼多,流於形式。無奈,一直我熱衷於java基礎的人,也忽略了不少細節,直至在一個bug面前,苦思冥想。 java
問題是因爲什麼引發的呢?多態。在父類繼承子類的時候,發生的故事。先描述一下背景。 面試
1. 寫了一個這樣的類,做用再也不描述
這裏寫了getter/setter方法,已經OK了。
spring
2. 在spring的配置文件中,我也遵照spring的規則配置完畢
app
以上,兩點,你們都不須要質疑。配置徹底正確。 spa
問題是什麼呢?在類中,調用merchantSalePlatRecordMapper方法的時候,出現空指針。經過代碼跟蹤發現這個對象爲NULL。再經過跟蹤代碼,發現這個對象的值已經設置完畢。 .net
迷惑在哪裏?迷惑在爲何設置的值裏沒有了東西? 指針
這種現象曾經出現過,主要是因爲,同一個ID的Bean被同事設置兩次,致使實際使用的Bean爲沒有賦值的Bean。他本覺得是會關聯上了(混淆了ref的做用)。因而,我也按照這個思路繼續思考,這個時候我就陷入了一個坑裏。期間,我查詢了對應的Bean,在配置文件中,的確是有一份。不會重複。 調試
後來,經過跟蹤代碼,我發現他的merchantSalePlatRecordMapper在一個類裏有兩份。並且名字不同?我當時以爲奇怪,可是我沒有仔細想(經驗不足)。後來,同事告訴我,RestrictUpCreateRecordHandler有子類,子類裏注入了merchantSalePlatRecordMapper。因而,咱們看一會兒類。 對象
此時也存在merchantSalePlatRecordMapper的getter/setter方法。 blog
看到這裏,我想你們應該明白。同事編寫的代碼,因爲merchantSalePlatRecordMapper是private做用域,那麼在子類和父類中,分別存在一份。那麼,同時又在兩個類中作了get/set方法,致使了子類的merchantSalePlatRecordMapper被注入,而父類中沒有執行注入。
總結:
1. 在這次調整中,對問題的細節把握不夠清晰,並且陷入了經驗主義,致使問題定位不許,修復時間過長。
2. 我鼓勵你們多作重構,提升代碼複用性,過度迷惑同事,暴露基礎薄弱的缺點。
3. 在分析問題以前,應該儘量的對問題把握清晰。相互關係梳理好,再作。避免陷入本身的泥潭。
在這裏推薦一種調試方法:Tomcat遠程調試(參考)。