websocket无法注入bean

本质原因:spring管理的都是单例(singleton)和 websocket (多对象)相冲突。
需要了解一个事实:websocket 是多对象的,每个用户的聊天客户端对应 java 后台的一个 websocket 对象,前后台一对一(多对多)实时连接,所以 websocket 不可能像 servlet 一样做成单例的,让所有聊天用户连接到一个 websocket对象,这样无法保存所有用户的实时连接信息。可能 spring 开发者考虑到这个问题,没有让 spring 创建管理 websocket ,而是由 java 原来的机制管理websocket ,所以用户聊天时创建的 websocket 连接对象不是 spring 创建的,spring 也不会为不是他创建的对象进行依赖注入,所以如果不用static关键字,每个 websocket 对象的 service 都是 null。

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

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

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

@Controller
@ServerEndpoint(value="/chatSocket")
public class ChatSocket {
    //  这里使用静态,让 service 属于类
    private static ChatService chatService;

    // 注入的时候,给类的 service 注入
    @Autowired
    public void setChatService(ChatService chatService) {
        ChatSocket.chatService = chatService;
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值