我今天在Spring 3.0上偶然發現了一個相當奇怪的問題:如何處理@Component和@Repository/@Service註釋之間的區別是什麼?
有一個抽象類A
及其具體實現A_Impl
。 A_Impl
註釋爲@Repository
並且由Spring自動掃描(<context:component-scan>
和<context:annotation-config/>
都在上下文中聲明)。 A
和A_Impl
部署在單獨的JAR中(不確定是否重要)。一切正常。
現在,我正在審查該代碼,並且@Repository
在語義上看起來不太合適(所討論的類與持久性無關),所以 - 以我無限的智慧 - 我決定將其更改爲更多通用的@Component
。不用說,一切都炸了,讓我看起來像個白癡。 (這Spring上下文初始化過程中出現)錯誤是Spring的ClassPathResource.getInputStream()
方法抱怨A
類不在那裏(是的,我已經人工檢查;加普通類加載器發現它只是罰款)
沒有別的改變 。如果我將@Component
替換爲@Repository
上下文初始化,如果我將它們交換回來,則不會出現上述錯誤。 Spring documentation claims there's no difference之間@Component
和@Repository
這顯然是一個該死的謊言:-)所以我想知道 - 什麼是的區別?
好點,但它絕對是Spring的'@ Component'。如果不是這樣,它就不會被拿起來 - 但它是和它在這個過程中打破了背景。 – ChssPly76 2009-12-17 19:29:06
hm。是「沒有找到類型的bean」的例外情況,還是另一個? – Bozho 2009-12-17 19:30:27
不,從'ClassPathResource.getInputStream()'拋出'FileNotFoundException'異常,因爲類加載器無法爲'A.class'打開'InputStream'。我並不太在乎解決這個錯誤本身 - 我確信這是Spring的錯誤,當我有機會並確認它時,我會逐步完成代碼 - 正如我想知道的那樣(以及爲什麼)@Repository和@Component處理有所不同。 – ChssPly76 2009-12-17 19:37:30