做百度移動(dòng)端網(wǎng)站軟件下載江門關(guān)鍵詞優(yōu)化公司
有這樣一個(gè)場(chǎng)景:
訂單服務(wù)與用戶服務(wù)的循環(huán)依賴
假設(shè)在一個(gè)電商系統(tǒng)中,我們有兩個(gè)服務(wù)類:OrderService 和 UserService。
OrderService 需要訪問(wèn)用戶服務(wù)來(lái)獲取或更新訂單關(guān)聯(lián)的用戶信息。例如,當(dāng)處理訂單時(shí),可能需要檢查用戶的信用狀態(tài)或地址信息。
@Service
public class OrderService {@Autowiredprivate UserService userService;public void processOrder(Order order) {User user = userService.getUserById(order.getUserId());// ...進(jìn)一步的業(yè)務(wù)邏輯}
}
UserService 同樣也需要訪問(wèn)訂單服務(wù),比如為了統(tǒng)計(jì)用戶的購(gòu)買行為或者計(jì)算用戶的積分,這可能涉及到查詢某個(gè)用戶下的所有訂單。
@Service
public class UserService {@Autowiredprivate OrderService orderService;public User getUserWithOrders(int userId) {User user = getUserById(userId);List<Order> orders = orderService.getOrdersByUserId(userId);user.setOrders(orders);return user;}
}
在這個(gè)案例中,OrderService 類中注入了 UserService,而 UserService 類中又注入了 OrderService。這就構(gòu)成了一個(gè)循環(huán)依賴:OrderService → UserService → OrderService。
啟動(dòng)時(shí)會(huì)報(bào)錯(cuò)類似這樣:
Description:The dependencies of some of the beans in the application context form a cycle:xxxxxxx
解決
使用@Layz懶加載策略解決;
調(diào)整后的代碼:
@Service
public class OrderService {@Autowiredprivate UserService userService;public void processOrder(Order order) {User user = userService.getUserById(order.getUserId());// ...進(jìn)一步的業(yè)務(wù)邏輯}
}
@Service
public class UserService {private OrderService orderService;public UserService(@Lazy OrderService orderService) {this.orderService= orderService;}public User getUserWithOrders(int userId) {User user = getUserById(userId);List<Order> orders = orderService.getOrdersByUserId(userId);user.setOrders(orders);return user;}
}