3

これが私のシナリオです。ClassAClassBの2つのクラスがあります。ClassBはClassAを継承します。
両方にアノテーションを使用して、@ComponentSpringBeanにします。

@Component
public class ClassA{
    // parent
}

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

public class ClassC{

    @Autowired
    private ClassA classA;

    public void doSomething(){

    }
}

これで、上記のようにClassCでアノテーションを使用してClassAを挿入しようとすると、次の例外@autowired発生ます。

タイプ[ ClassA ]の一意のBeanは定義されていません:単一の一致するBeanが必要ですが、2が見つかりました:[ classAclassB ]

タイプ別に自動配線すると、SpringはClassAに割り当て可能な2つのBeanを検出するため、例外がスローされることを理解しています。

@Qualifier名前による注釈と自動配線を使用する以外に、この問題を解決する簡単な方法はありますか?

タイプごとに割り当て可能なBeanをチェックするだけでなく、それがまったく同じクラスタイプであるかどうかをチェックするようにSpringに指示できますか?

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 に答える