2012-04-25 126 views
2

我想知道如果彈簧加載一個接口,當聲明爲一個實現類的@autowired屬性,而不註釋接口爲a @component彈簧接口加載

讓我再描述一下我的問題: 我有一個接口和它的實現類具有相同的名稱,但它們駐留在不同的包中。我註釋了執行情況爲@Component("myImplementation")。 但我最終,上面寫着一個例外:

conflicts with existing, non-compatible bean definition of same name and class 

我在想,不包括<context:component-scan接口的,你覺得呢?

PS:我的界面不@Component註釋,應用程序運行在DEVELOPPEMENT environement就好了,我只Proguard的混淆後得到的錯誤

+0

很好的問題,試着通過實現例如和post結果來排除組件掃描。 – 2012-04-25 15:20:34

+0

你的意思是排除組件掃描權的接口? – Genjuro 2012-04-25 15:23:29

+0

你能更詳細地描述你的情況嗎? ''context:component-scan>'的配置有什麼特別之處嗎? – axtavt 2012-04-25 15:26:07

回答

0

嗯,我想在不同的包中移動界面會工作,因爲你將創建對象接口和相應的實現bean的引用將被自動連接到那些對象引用。但是你應該遵循命名約定。區分接口和實現類時會有問題,因爲名稱相同。按照像

interface SomeInterface { 
//.... 
} 

標準的實現類SomeInterface

class SomeInterfaceImpl implements SomeInterface { 
// implementation.... 
} 
+0

我同意命名約定,但我混淆了我的代碼,所以我可以結束與接口的名稱= a和它的實現= a(當然在不同的包) – Genjuro 2012-04-25 15:47:55

1

的註解與@Component,而不是你的註釋接口通常是設置的東西,以正確的方式您的實現。 Spring的自動佈線將查找匹配類型的託管bean,並且您的實現將匹配輸入到該接口的字段。如果您的界面沒有註釋@Component或任何Spring構造型註釋,則在組件掃描期間不應將其加載到上下文中。所以,如果接口和實現具有相同的類名稱,則不應該有問題。

您確定您已經試過而不是註釋界面?你確定你的項目中沒有其他的類還有其他的類,它的名字和界面及其實現一樣嗎?

+0

我的接口沒有用Component(「myImpl 「),只有我的實現是。 但仍然,我神祕地告知,該名稱是同時接口和實施。 我想用限定符(「myImpl」)使用自動裝配。 – Genjuro 2012-04-26 09:11:01

+0

你可以包括你的界面的開始行和實現?具體來說就是package語句,聲明行和類中的任何註釋(可以忽略導入)。另外,您是否檢查過您的項目中是否有另一個帶註釋的類,它與您的實現具有相同的名稱? Spring應該只關注帶註釋的類,所以如果你的接口確實沒有註釋,那麼它不應該引起問題。 – sdouglass 2012-04-26 15:36:36

+0

該項目運行得很好,我只在用proguard混淆後纔得到這個錯誤。 現在儘管實現在同一個包中並且名稱不同,但也會出現相同的問題。 ps:沒有其他類使用相同的組件名稱+我的界面乾淨的註釋。我想知道proguard是否有問題。調試過程是這樣一個噩夢:( – Genjuro 2012-04-26 16:18:23

1

proguard.conf應包含以下內容:

## ... preserve class annontation (Java EE 1.6 DI) 
# Spring3 
#-keep @org.springframework.stereotype.Service class * 
-keep @org.springframework.stereotype.Controller class * 
#-keep @org.springframework.stereotype.Component class * 
#-keep @org.springframework.stereotype.Repository class * 

proguard forums有更詳細的解答。