使用工具类用于从Spring的上下文中去获取到类的实例
@ServerEndpoint("/websocket/{userId}")
@Component //关键点1
public class WebSocket {
private static UserService userService = SpringContextHolder.getBean(UserService.class); //关键点2
//略去其他代码...
@OnMessage
public void onMessage(String message, Session session) {
if(!StringUtils.isEmpty(message)){
try {
log.info("收到用户【{}】的消息: {}",this.userId,message);
userService.helloService(); //关键点3
session.getBasicRemote().sendText("收到 "+this.userId+" 的消息 ");
}catch (Exception e){
e.printStackTrace();
}
}
}
}
工具类SpringContextHolder
此工具类用于从Spring的上下文中去获取到类的实例
@Component
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
/**
* 取得存储在静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
assertContextInjected();
return applicationContext;
}
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
assertContextInjected();
return (T) applicationContext.getBean(name);
}
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(Class<T> requiredType) {
assertContextInjected();
return applicationContext.getBean(requiredType);
}
/**
* 清除SpringContextHolder中的ApplicationContext为Null.
*/
public static void clearHolder() {
applicationContext = null;
}
/**
* 实现ApplicationContextAware接口, 注入Context到静态变量中.
*/
@Override
public void setApplicationContext(ApplicationContext appContext) {
applicationContext = appContext;
}
/**
* 实现DisposableBean接口, 在Context关闭时清理静态变量.
*/
@Override
public void destroy() throws Exception {
SpringContextHolder.clearHolder();
}
/**
* 检查ApplicationContext不为空.
*/
private static void assertContextInjected() {
Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
}
}
配置完上述三个关键点,当新建立websocket连接时,@Autowired也可成功注入service
参考:https://blog.youkuaiyun.com/weixin_45698637/article/details/118684875