2017-04-18 127 views
1

在我的項目自動裝配多級繼承類我裏面的它通過多級繼承使用@Autowired註解相關的波紋管如何在春天MVC

@Component 
@Scope("prototype") 
class A{ 


} 

@Component 
@Scope("prototype") 
class B extends A{ 

} 

@Component 
@Scope("prototype") 
class C extends B{ 

} 

現在三班我想C級對象Manager類

@Component(value = "manager") 
@Scope("prototype") 
class Manager { 

@Autowired 
A a; 

@Autowired 
B b; 

@Autowired 
C c; 

...... 
} 

這裏一個 CLAS的S對象被彈簧容器注入,但同時注入對象爲Ç它是作爲波紋管抱怨

nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.abc.bca.generator.sss.B] is defined: expected single matching bean but found 2: b,c 

當我使用@Qualifier對於C類作爲

@Autowired 
@Qualifier('c') 
C c 

@Autowired 
@Qualifier('c') 
B c 

它仍然顯示相同的錯誤,所以我怎樣才能得到對象爲C類。

+0

我認爲限定符註釋應該在類上,而不是在字段上。試試看。 –

+0

我只是試過你的代碼(沒有@Qualifiers)。我沒有看到任何例外..重新檢查您的問題 – pvpkiran

+0

在我的情況下,它是同樣的例外 –

回答

5

這不會起作用,因爲擴展類的(子類)的bean具有父類的類名稱作爲bean名稱,因爲它們處於相同類型(父類型)中。所以這三個將具有相同的豆名'a'。 用不同的名稱註釋'@Bean(name = "a")''@Bean(name = "b")''@Bean(name = "c")'將解決您的問題。

例如:

class A{ 
} 

class B extends A{ 
} 

class C extends B{ 
} 



@Configuration 
public class BeanConfiguration{ 
    @Bean(name = "a") 
    public void A getA(){ 
     A a = new A(); 
     //bla bla bla 
     return a; 
    } 
    @Bean(name = "b") 
    public void B getB(){ 
     B a = new B(); 
     //bla bla bla 
     return b; 
    } 

    @Bean(name = "c") 
    public void C getC(){ 
     C c = new C(); 
     //bla bla bla 
     return c; 
    } 
} 

現在你可以自動裝配A,B,C從任何你想去的地方。

+0

如何可以使用'@ Bean',如果可能請詳細說明您的答案 –

+0

@Rajesh Hatwar,我編輯了答案的解釋。 – maya16

+0

對不起,我嘗試了你的建議,但沒有運氣 –