使用WebSocket进行依赖注入为null的解决办法
前阵子写了利用websocket和移动端进行通信的内容,现在想要把通信过程中的会话信息通过业务存储到数据库中,需要整合Websocket,@ServerEndpoint注解所标注的类,类似于我们写的@Controller标注的Controller层,
结果@Autowire注入的Service层的bean为null,然后检查配置,各种姿势测试这个bean,发现和
@ServerEndpoint有关。先看代码
你要用 @ServerEndpoint实现ws,就注定不能用@Autowired注入bean,那咋整?new一个?肯定不行。思来想去,你不就是要个bean么,我@Autowired把你召唤不出来,那我拿spring上下文把你getBean(“name”)一下如何,那么问题又来了,容器启动的时候spring上下文已经加载了,怎样拿到这个上下文?
拿到上下文就好说了,直接getBean就OK。
getBean
@Component
public class SpringContextUtilimplements ApplicationContextAware {
/**
* Spring应用上下文环境
*/
private static ApplicationContextapplicationContext;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取对象 这里重写了bean方法,起主要作用
*/
public static Object getBean(String beanId)throws BeansException {
return applicationContext.getBean(beanId);
}
}