簡體   English   中英

Spring 4-Autowire通用接口

[英]Spring 4 - Autowire generic interface

從Spring(v4.3.8)開始,當Spring嘗試加載依賴項注入時遇到一個問題。

我想基於T(Debit1或Debit2)的類型調用ManagerImpl1.java或ManagerImpl2.java實現的“管理”方法。 詳細信息如下:

由以下原因引起:org.springframework.beans.factory.NoUniqueBeanDefinitionException:沒有類型為'com.xxx.xxx.datacollection.infoprod.Manager'的合格Bean:預期為單個匹配的Bean,但是找到了2:ManagerImpl1,ManagerImpl2

Business.java:

@Component
public class Business<T extends Debit> {

    @Autowired
    private Manager<T> manager;

    public void treatment(Context<T> context, FindServiceReturnMessage response) {

        manager.manage(response, context);
    }

Manager.java:

public interface Manager<T extends Debit> {

    void manage(final FindServiceReturnMessage response, Context<T> context);
}

ManagerImpl1.java:

@Component
public class ManagerImpl1 implements Manager<Debit1> {

    @Override
    public void manage(final FindServiceReturnMessage response, Context<Debit1> context) {

    }
}

ManagerImpl2.java:

@Component
public class ManagerImpl2 implements Manager<Debit2> {

    @Override
    public void manage(final FindServiceReturnMessage response, Context<Debit2> context) {

    }
}

同樣,“借方1”和“借方2”實現接口“借方”。

我嘗試了幾件事但沒有成功...

您需要在Bean上添加一個限定符,如下所示:

@Component
@Qualifier("managerImpl2")
public class ManagerImpl2 implements Manager<Debit2> {

    @Override
    public void manage(final FindServiceReturnMessage response, Context<Debit2> context) 
    {

    }
}

然后,當您要使用它時,請再次使用@Qualifier批注:

@Component
public class Business<T extends Debit> {

    @Autowired
    @Qualifier("managerImpl2")
    private Manager<T> manager;

    public void treatment(Context<T> context, FindServiceReturnMessage response) {

        manager.manage(response, context);
    }
}

但是,正如@dvorog在評論中所說,由於泛型不存在於編譯中,因此您可能必須創建一個如下的Business接口:

public interface Business<T extends Debit> {

    public void treatment(Context<T> context, FindServiceReturnMessage response);
}

並實現BusinessImpl以在每次有新的Debit時指定它:

@Component
public class ManagerImpl2Business<Debit2> {

    @Autowired
    @Qualifier("managerImpl2")
    private Manager<Debit2> manager;

    public void treatment(Context<Debit2> context, FindServiceReturnMessage response) {

        manager.manage(response, context);
    }
}

這將重復一遍,並可能以一些if (T instanceof Debit1)維護的代碼或某些if (T instanceof Debit1) ,以使您的通用性正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM