有個工程師,在項目工程里加了些頁面和Service,Dao之類,然后啟動web工程,Spring一直報錯說找不到autowired定義的service接口的實現bean的定義,然后來求助我來幫忙解決。
我理所當然的按照常規步驟1,2,3...檢查他的代碼是否存在問題:
-
第一步,檢查service接口是否確實有實現類並且@Service標注了,這個是初學者讓出現問題,檢查結果確實沒問題Pass。
-
第二布,因為其service定義在新的package里,遂檢查其spring配置里,component-scan是否新增加了掃描package,檢查結果確實沒問題Pass。
-
第三步,懷疑Eclipse開發環境里,運行tomcat的時候,沒有publish成功,確認workspace里是自動build,並且clean & Rebuild,在clean tomcat server,問題依舊。
-
第四步,還是懷疑Eclipse開發環境里,運行tomcat的時候,沒有publish成功,遂檢查workspace的的.metadata/.plugins/org.eclipse.wst.server.core里所發布的內容,檢查結果確實class已經publish過去沒問題,Pass。
-
第五步,檢查Web工程里的Deployment Assembly,配置正確沒問題,Pass。
逐步檢查下來,常規的錯誤貌似都沒有犯,但怎么clean,再啟動依然報錯,找到Service接口,Ctrl+T,確實找到實現類,並且@Service標注。問題查到這里就有點奇怪了,這樣問題以前貌似沒碰到過。
有問題不能不解決,繼續琢磨,Ctrl+G找Service所有引用,發現有兩個地方被使用@Autowared注入,然后,然后,然后,點其中一個引用的地方,Ctrl+T找其實現類,很神奇的發現,光標就跳到引用這個service的類本身上。OMG,Finally,原來該Service的實現Bean在引用自身Service,結果循環引用導致無法實例化Bean而報出這個錯誤。對於一個中高級工程師來說,犯這個錯誤,我只能一頓痛扁,掙一頓免費晚餐,你,是否也曾經犯過這個傻呢......Spring里遇到的一個傻問題,autowired時報找不到bean定