簡體   English   中英

為什么Spring @Autowired注入另一個objecjt?

[英]Why Spring @Autowired inject another objecjt?

我正在使用Spring Boot v1.5.8.RELEASE。

我定義了一個WebSocketHandler ,其中保存了會話列表。 在另一個@Component我已自動連線此處理程序以到達其會話。 但是,它始終為零尺寸(盡管原始尺寸不是)。 我不能自動連接同一單個對象嗎? 為什么? @Component默認不是單例嗎?

這是代碼:

WebSocketHandler.java

@Component
public class WebSocketHandler extends TextWebSocketHandler {

    public CopyOnWriteArrayList<WebSocketSession> sessions = new CopyOnWriteArrayList<WebSocketSession>();

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        System.out.println("SIZE: "+ sessions.size()); // -> This grows as clients connected
    }

    public CopyOnWriteArrayList<WebSocketSession> getSessions() {
        return sessions;
    }
}

MyComponent.java

@Component
public class MyComponent {

    @Autowired
    WebSocketHandler wshandler;

    @Scheduled(fixedRate=20000)
    public void mytask() {
        System.out.println(wshandler.sessions.size()); // THIS IS ALWAYS ZERO           
        // wshandler.getSessions().size() -> no difference
    }
}

這是一個虛擬錯誤。 在我直接從示例中復制的WebSocketHandler的配置中,我已經在創建處理程序。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketHandler(), "/mywebsocket").setAllowedOrigins("*");     
    }
}

因此,修復很容易:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    MyWebSocketHandler wshandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(wshandler, "/mywebsocket").setAllowedOrigins("*");      
    }
}

多虧Dovmo ,我也將類的名稱更改為MyWebSocketHandler,因為Spring已經有了WebSocketHandler。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM