问题:
使用WebSocket时,发送消息,会出现用@Autowired注入的bean对象为null。
原因:
因为@Autowired的所有对象,都是在系统启动的时候加入了spring的上下文中,而WebSocket是多实例的,所以造成注入的bean对象为null。
解决方法:
直接从spring上下文中获取已加载的bean对象。
获取spring上下文的代码
package com.yt.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* spring上下文获取类
* @author tyg
* @date 2020-08-31 15:21
*/
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
/** Spring上下文 */
private static ApplicationContext applicationContext;
/**
* 将spring上下文同步到当前的applicationContext
* @param applicationContext 上下文
* @throws BeansException bean异常
* @author tyg
* @date 2020-08-31 15:21
*/
@Override
public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException {
ApplicationContextUtil.applicationContext = applicationContext;
}
/**
* 获取已注入到spring上下文中的对象
* @param beanName 类名称
* @param t 返回指定的对象
* @throws BeansException bean异常
* @author tyg
* @date 2020-08-31 15:21
*/
public static <T> @NotNull T getBean(String beanName, Class<T> t) throws BeansException {
return (T) applicationContext.getBean(beanName);
}
}
调用示例:
// chatMessageServiceImpl是spring启动时就加载的bean。
ChatMessageServiceImpl chatMessageService = ApplicationContextUtil.getBean("chatMessageServiceImpl", ChatMessageServiceImpl.class);