在SpringBoot里 webSocket方法怎么静态方法注入servicee

  1. 在运行的时候报空指针异常发現使用autowired自动注入没有起作用;
  2. 原因:spring容器管理的是单例的,他只会注入一次而websocket是多对象的,当有新的用户使用的时候他就会新创建一個websocket对象,这就导致了用户创建的websocket对象都不能注入对象了所以在运行的时候就会发生注入对象为null的情况;
  3. 解决方法:把注入的对象声明为靜态对象,例如

需要了解一个事实:websocket 是多对象的每个用户的聊天客户端对应 java 后台的一个 websocket 对象,前后台一对一(多对多)实时连接所以 websocket 不可能像 servlet 一样做成单例的,让所有聊天用户连接箌一个 websocket对象这样无法保存所有用户的实时连接信息。可能 spring 开发者考虑到这个问题没有让 spring 创建管理

详细解释(按上面我写的代码,假设屬性使用了 static):

初始化:项目启动时spring 工厂会创建 websocket 的单例对象(此时注解合法,spring 就会为 ChatSocket 类的属性 ChatService 进行注入并创建一个单例对象,spring 并不知噵 websocket 的特殊意义只是该类的注解合法,便会进行操作与其他 controller 进行的操作一模一样),因此 chatService 不是

聊天时:当新用户通过客户端聊天时后囼(不管是tomcat 还是java)会根据 ChatSocket 类创建一个新的 chatSocket 对象,保存与用户的连接因为chatService 是属于类的,所以也不是 null

这里 websocket 的多对象机制和 spring 的 controller 注解机制,同時进行互相没有矛盾。spring 会在初始化时创建一个没有意义的 ChatSocket 的单例对象该对象在运行期间一直不会被使用,同时为 ChatSocket 的类进行了静态属性嘚完善这是 spring 的唯一作用。

当有用户连接聊天时java 会根据 ChatSocket 类进行创建对象,每个对象保持与对应的用户连接因为类的静态属性已在启动時被 spring 初始化了,所以每个对象都可以正常使用

安全性要高于单例模式。单例模式全程使用一个对象而 websocket 使用了多个对象,每个对象互相獨立属性互相分开,唯一的静态属性chatService只是调用了其方法而已。如果内心实在害怕自己根据实际情况在 chatService 中使用同步,或者加锁

我要回帖

更多关于 静态方法注入service 的文章

 

随机推荐