因为websocket需要开一个自己的线程,如果采用注解的话就是把它当做一个普通的组件放在容器里,调用的时候会一直在spring的线程里,而不是自己独立的线程。所以无法注入service.
解决方法:
spring-boot启动类
@SpringBootApplication
@MapperScan("com.hiramgames.dao")
public class HiramgamesApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(HiramgamesApplication.class, args);
myWebSocket.setApplicationContext(applicationContext);
}
}
webSocket处理类
在WevSocket处理类中注入SessionManager类
@Component
@ServerEndpoint(value = "/test/{userId}")//socket访问地址
public class WebSocketHandler {
//无法使用@Autowired直接注入,运行时会报空指针异常,因为SessionManager没有被注入进来
//@Autowired
//private static SessionManager sessionManager;
//SessionManager
private static SessionManager sessionManager;
/**
* 无法通过@Resource注解导入的解决方案
*/
public static void setApplicationContext(ApplicationContext context) {
sessionManager = context.getBean(SessionManager.class);
}
}