1.前言
最近在項目中需要用到WebSocket,當我跟SpringBoot整合,然後做一些持久層的相關操作的時候,突然空指針異常,原因在於@Autowired或者@Resource無法自動注入,一開始以爲是我太久沒寫後端代碼,整合方式出了問題(QAQ),改了一堆配置還是沒解決,最後寫了個普通的Controller出來測試,發現完全OJBK。所以問題的源頭終於找到了,那就是WebSocket在搞鬼!
2.原因
spring管理的都是單例(singleton),和 websocket (多對象)相沖突。
項目啓動時初始化,會初始化 websocket (非用戶連接的),spring 同時會爲其注入 service,該對象的 service 不是 null,被成功注入。但是,由於 spring 默認管理的是單例,所以只會注入一次 service。當新用戶進入聊天時,系統又會創建一個新的 websocket 對象,這時矛盾出現了:spring 管理的都是單例,不會給第二個 websocket 對象注入 service,所以導致只要是用戶連接創建的 websocket 對象,都不能再注入了。
像 controller 裏面有 service, service 裏面有 dao。因爲 controller,service ,dao 都有是單例,所以注入時不會報 null。但是 websocket 不是單例,所以使用spring注入一次後,後面的對象就不會再注入了,會報null。
3.解決辦法
既然知道了原因,那就好解決了,只要把要注入的對象,申明爲static,以我的代碼爲例:
private static UserService userService;
@Autowired
public void setUserService(UserService userService){
WebSocketService.userService=userService;
}