2012-10-24 88 views
3

這是我的場景。我有兩個類類A類BClassB繼承ClassA
我使用@Component這兩個註釋來使它們成爲Spring bean。自動裝配分層bean

@Component 
public class ClassA{ 
    // parent 
} 

@Component 
public class ClassB extends ClassA{ 
    // child 
} 

public class ClassC{ 

    @Autowired 
    private ClassA classA; 

    public void doSomething(){ 

    } 
} 

現在,每當我嘗試使用@autowired標註在ClassC注入如上圖所示ClassA的,我得到下面的異常。

類型的無獨特豆[ClassA的]被定義:預期單一匹配豆但發現2:[CLASSACLASSB]

我明白的是,當自動佈線通過類型,春天發現兩個豆可分配到類A,所以它會引發異常。

是否有使用@Qualifier註釋和自動佈線的名字除了解決此問題的一個簡單的方法?

我可以指示春天不僅檢查一個bean是按類型分配還要檢查一下,看它是否是完全一樣的類類型?

回答

2

是的,使用@Primary註釋。

如果這是不可行的,並且您不想使用@Qualifier,那麼您將不得不手動解決它。喜歡的東西:

@Autowired 
private List<ClassA> candidates; 

private ClassA actual; 

@PostConstruct 
public void postConstruct() { 
    for (ClassA candidate : candidates) { 
     if (AopProxyUtils.ultimateTargetClass(candidate).equals(ClassA.class)) { 
      actual = candidate; 
      break; 
     } 
    } 
    org.springframework.util.Assert.notNull(actual , "No bean of exact type ClassA found."); 
} 
+0

這會爲我工作。 – Sashi

+0

「會有」?不是嗎? – pap

+0

對不起,我在完成之前意外提交了我的評論。對於我提出的問題,使用主註釋是正確的答案。不幸的是,在我的情況下,ClassA和ClassB是JPA數據倉庫,主註解似乎不適用於他們。相反,我決定使用自定義限定符,它的功能就像一個魅力。 [鏈接](http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/annotation/CustomAutowireConfigurer.html) – Sashi

相關問題