3

这是我的场景。我有两个班级ClassAClassBClassB继承ClassA
@Component对它们都使用了注释来使它们成为 Spring bean。

@Component
public class ClassA{
    // parent
}

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

public class ClassC{

    @Autowired
    private ClassA classA;

    public void doSomething(){

    }
}

现在,每当我尝试在ClassC@autowired中使用注释来注入ClassA时,如上所示,我得到以下异常。

没有定义类型 [ ClassA ] 的唯一 bean:预期的单个匹配 bean 但找到了 2: [ classAclassB ]

我知道当按类型自动连接时,spring 会找到两个可分配给ClassA的 bean,因此它会引发异常。

除了使用@Qualifier注释和按名称自动连接之外,是否有一种简单的方法可以解决此问题?

我可以指示 spring 不仅检查可按类型分配的 bean,而且检查它是否是完全相同的类类型?

4

1 回答 1

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.");
}
于 2012-10-25T13:32:37.703 回答