最近有这么一个需求:做信息发布,后端更新布局和内容后,通知前端刷新页面,重新加载数据和布局。
- 使用@Autowired注入:
看起来一切都没有问题,但是当我运行的时候,我发现我的deviceService是空的!百度查,发现在@ServerEndPoint中是无法使用@Autowired注入Bean的。大概原理如下:
在我们springboot项目启动的时候,WebSocket已经被注入了这个DeviceService的Bean,但是WebSocket的特点是:建立一个连接,会生成一个新的WebSocket对象,分析源码,也可以理解:每个请求后,建立一个连接生成一个新的WebSocket,故这样是不能获得自动注入的对象了。
解决方案大概如下:
获取到Spring容器,然后去进行手动注入。
因为新生成的WebSocket对象根本不存在与Spring容器中,所以传统的ContextLoader.getCurrentWebApplicationContext()自然也就无法使用。
- 我用到了ApplicationContextAware来在项目加载时就获得项目的Spring容器。代码如下:
有了spring容器,我们就可以在任何类中去拿到这个类的ApplicationContext,然后通过这个ApplicationContext我们就可以在新生成一个WebSocket对象时来手动注入Service层了。
问题就这么解决了。。。。。。。。。。。。。