问题:今天做项目的时候,在WebSocket的类中,使用@AutoWired注入属性的时候,发现没注入进去,部分代码如下:
@Slf4j
@Component
@ServerEndpoint("/ws/{conversationId}")
public class WebSocketClient {
@AutoWired
private UserService userService;
}
原因:WebSocket是多对象的,每一个用户连接到的都是不一样的WebSocket对象,而Spring管理的都是单例的对象,所以WebSocket并不是被Spring创建管理的,当然属性就注入不进去喽。
解决方案:将需要注入的对象改为静态的,让每一个WebSocket都共用这样一个属性,另外提一嘴,静态属性的注入与普通属性的注入不一样,直接在静态属性上面加@AutoWired也是不行的,下面提供示例代码:
@Slf4j
@Component
@ServerEndpoint("/ws/{conversationId}")
public class WebSocketClient {
private static UserService userService;
@Autowired
public void setUserService(UserService userService) {
WebSocketClient.userService = userService;
}
}