【spingboot基礎知識】相關問題彙總

1、websocket中注入其他類失敗

本質原因: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。

解決方案:

spring 或 springboot 的 websocket 裏面使用 @Autowired 注入 service 或 bean 時,報空指針異常,service 爲 null(並不是不能被注入)。 解決方法:將要注入的 service 改成 static,就不會爲null了。

參考代碼:

參考:https://blog.csdn.net/m0_37202351/article/details/86255132

2、springboot循環依賴的問題

什麼是依賴循環,比如:我現在有一個ServiceA需要調用ServiceB的方法,那麼ServiceA就依賴於ServiceB,那在ServiceB中再調用ServiceA的方法,就形成了循環依賴。Spring在初始化bean的時候就不知道先初始化哪個bean就會報錯。

最好的解決辦法是實現解耦,最簡單的方法是在其中某個類注入時在@Autowired註解後添加 @Lazy註解即可。

3、springboot實現異步服務

普通JAVA可通過實現多線程來實現異步服務。

在spingboot中,可在Application啓動類中增加@EnableAsync 註解,並在想要實現異步的方法上添加註解@Async即可。

啓動類:

@SkyArkApplication
@EnableAsync
public class DealApplication {
//    private static LogProcesserService logProcesserService;

    public static void main(String[] args) {

        SpringApplication.run(DealApplication.class, args);
    }
}

想要實現的異步方法:

    @Async
    @Override
    public void testSend(javax.websocket.Session session, String sid) {
        try {
            int i = 0;
        }catch(Exception e){
            e.printStackTrace();
        }
    }

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章