2012-10-24 83 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

相关问题