先說下我遇到的問題,有一個接口 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;