java websocket使用@Autowired注入为null得问题
SpringBoot项目集成websocket,建立连接之后发现自动注入为NullException。
因为spring是单例而websocket是多对象(每建立一次连接就生成一个对象)
所以在项目启动的时候,会初始化websocket,并且注入到spring容器中,这个时候注入的service是不为null的,但是spring是单例,所以只会注入一次,当再次建立websocket连接时,这个时候对象就为NullException了。
解决方案:可以通过spring上下文获取获取bean
获取上下文工具类:
@Component
public class SpringContextUtil implements ApplicationContextAware {
/**
* 打印日志
*/
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* 获取上下文对象
*/
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
logger.info("set applicationContext");
}
/**
* 获取 applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过 name 获取 bean 对象
*
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过 class 获取 bean 对象
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过 name,clazz 获取指定的 bean 对象
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
业务代码中使用:
@Component
@ServerEndpoint(value = "/socket/{group}/{user}/{sessionId}")
@Slf4j
public class WebSocketServer {
private static AtomicInteger onlineCount = new AtomicInteger(0);
private static final int MAX_CONNECT = 500;
private MsgGroupEnum group;
private String user;
private Session session;
private String sessionId;
public AppDataService getAppData() {
return SpringContextUtil.getBean(AppDataService.class);
}
}
下一篇:
Java基础(手机类对象练习)
