2009-12-17 22 views
7

我今天在Spring 3.0上偶然發現了一個相當奇怪的問題:如何處理@Component和@Repository/@Service註釋之間的區別是什麼?

有一個抽象類A及其具體實現A_ImplA_Impl註釋爲@Repository並且由Spring自動掃描(<context:component-scan><context:annotation-config/>都在上下文中聲明)。 AA_Impl部署在單獨的JAR中(不確定是否重要)。一切正常。

現在,我正在審查該代碼,並且@Repository在語義上看起來不太合適(所討論的類與持久性無關),所以 - 以我無限的智慧 - 我決定將其更改爲更多通用的@Component。不用說,一切都炸了,讓我看起來像個白癡。 (這Spring上下文初始化過程中出現)錯誤是Spring的ClassPathResource.getInputStream()方法抱怨A類不在那裏(是的,我已經人工檢查;加普通類加載器發現它只是罰款)

沒有別的改變 。如果我將@Component替換爲@Repository上下文初始化,如果我將它們交換回來,則不會出現上述錯誤。 Spring documentation claims there's no difference之間@Component@Repository這顯然是一個該死的謊言:-)所以我想知道 - 什麼的區別?

回答

4

我一直在使用@Component沒有麻煩。

作爲可能性出現在我腦海中的唯一一件事(雖然不是那麼聰明),你的@Component可能不是春天的。例如,Tapestry有一個以相同方式命名的註釋。其他框架也可能有它。所以檢查你的進口。

+0

好點,但它絕對是Spring的'@ Component'。如果不是這樣,它就不會被拿起來 - 但它是和它在這個過程中打破了背景。 – ChssPly76 2009-12-17 19:29:06

+0

hm。是「沒有找到類型的bean」的例外情況,還是另一個? – Bozho 2009-12-17 19:30:27

+0

不,從'ClassPathResource.getInputStream()'拋出'FileNotFoundException'異常,因爲類加載器無法爲'A.class'打開'InputStream'。我並不太在乎解決這個錯誤本身 - 我確信這是Spring的錯誤,當我有機會並確認它時,我會逐步完成代碼 - 正如我想知道的那樣(以及爲什麼)@Repository和@Component處理有所不同。 – ChssPly76 2009-12-17 19:37:30

0
|Annotation | Meaning            | 
+------------+-----------------------------------------------------+ 
| @Component | generic stereotype for any Spring-managed component | 
| @Repository| stereotype for persistence layer     | 
| @Service | stereotype for service layer      | 
| @Controller| stereotype for presentation layer (spring-mvc)  | 

使用@Service@Repository註解是從數據庫連接的角度很重要。

  1. 您的所有Web服務類型DB連接
  2. 使用@Repository你所有的存儲過程DB連接

如果你沒有使用合適的註釋,你可能會面臨犯覆蓋異常使用@Service通過回滾事務。在壓力負載測試期間,您會看到與回滾JDBC事務相關的異常。

+0

有人可以澄清「Web服務類型的數據庫連接」和「存儲過程數據庫連接「?我想知道薩蒂什是否將「服務層」誤解爲​​指的是Web服務。 – spaaarky21 2013-01-06 07:08:47

相關問題