springboot+websocket使用@ServerEndPoint无法使用@Autowired注解注入Bean

最近有这么一个需求:做信息发布,后端更新布局和内容后,通知前端刷新页面,重新加载数据和布局。

  1. 使用@Autowired注入:
    在这里插入图片描述看起来一切都没有问题,但是当我运行的时候,我发现我的deviceService是空的!百度查,发现在@ServerEndPoint中是无法使用@Autowired注入Bean的。大概原理如下:
    在我们springboot项目启动的时候,WebSocket已经被注入了这个DeviceService的Bean,但是WebSocket的特点是:建立一个连接,会生成一个新的WebSocket对象,分析源码,也可以理解:每个请求后,建立一个连接生成一个新的WebSocket,故这样是不能获得自动注入的对象了。

解决方案大概如下:
获取到Spring容器,然后去进行手动注入。

因为新生成的WebSocket对象根本不存在与Spring容器中,所以传统的ContextLoader.getCurrentWebApplicationContext()自然也就无法使用。

  1. 我用到了ApplicationContextAware来在项目加载时就获得项目的Spring容器。代码如下:
    在这里插入图片描述有了spring容器,我们就可以在任何类中去拿到这个类的ApplicationContext,然后通过这个ApplicationContext我们就可以在新生成一个WebSocket对象时来手动注入Service层了。
    在这里插入图片描述
    问题就这么解决了。。。。。。。。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值