@Autowired 和 @Resource注解, 一個接口有多個實現類的時候Spring注入遇到的問題


先說下我遇到的問題,有一個接口 CompensationService, 有兩個實現類 MusicCompensationStrategyImpl  和  TakeDeliveryCompensationStrategyImpl

在另一個類中需要用到其中的兩個實現類,我直接CompensationService  com = new  MusicCompensationStrategyImpl () , 然后調用此實現類實現的方法,但是這個實現類注入了一個接口(此接口是一個@FeginClients接口,調用另一個服務),所以就出現了空指針異常,此接口注入不進來。

問題的原因是,我new個對象只是在JVM堆中產生了個對象,而Fegin是交給了Spring容器來管理,雖然此spring容器也是在JVM中,但是畢竟是兩個不同的容器,如同兩堵牆不能想通,果斷棄之。

如下圖 和 代碼:

 

@Slf4j
@Service(value = "takeDeliveryCompensationStrategyImpl")
public class TakeDeliveryCompensationStrategyImpl implements CompensationService {

    @Autowired
    private TakeDeliveryServiceOrderService takeDeliveryServiceOrderService;

    @Override
    public Result<String> compensationMethod(OrderForm orderForm, Long accountId) {
        Result<String> takeDeliveryServiceOrder = takeDeliveryServiceOrderService.createTakeDeliveryServiceOrder(orderForm);
        return takeDeliveryServiceOrder;
    }
}

 

如下:

@Slf4j
@Service("musicCompensationStrategyImpl")
@AllArgsConstructor
public class MusicCompensationStrategyImpl implements CompensationService {

    CompensationOrderService compensationOrderService;
    AccountRemoteService accountRemoteService;

    @Override
    public Result<String> compensationMethod(OrderForm orderForm, Long accountId) {

 

又用@Autowired注解,啟動報錯,信息顯示無法不知該注入那個實現類,因為這個注解是按照類型來的,出現了兩個實現類,也不知道按照那個, 果斷棄之。

 

最后用@Resource注解,這個是按照name來的,在每個實現類上加上,如 @Service("musicCompensationStrategyImpl"),類名全程(首字母小寫, 看我上面的代碼),然后在要調用的類注入  @Resource(name = "musicCompensationStrategyImpl")

@Resource(name = "musicCompensationStrategyImpl")
private CompensationService compensationServiceMusic;
@Resource(name = "takeDeliveryCompensationStrategyImpl")
private CompensationService compensationServiceTake;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM