由于之前使用websocket的时候,需要使用容器中的bean,而websocket是多例模式,所以无法从bean中获取(准确的说是注入了,但是只有第一次注入成功了,以后的每次连接到来都是一个新的对象,所以里面没有完成ioc的注入);
我这里使用了手动从spring容器中getBean的方法拿数据;
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtil.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext(){
return applicationContext;
}
public static Object getBean(String beanName){
return applicationContext.getBean(beanName);
}
public static <T> T getBean(Class<T> clazz){
return (T)applicationContext.getBean(clazz); //打包以后这里会报空指针
}
}
程序执行正常,但是打包以后运行,提示。getBean空指针,追了一下,是上面执行初始化的时候并没有执行set方法;然后就执行get,所以空指针。我捕获以后。发现过一会。还是会执行set方法,证明是有注入的,只是顺序出了问题。原来的程序能执行只是恰巧在那之前执行了set的初始化;
所以肯定是依赖出了问题,,突然想到我这是手动注入并没有依赖关系,所以顺序完全看运气,。。。所以我把调用这个方法的类改成了懒加载,等到需要的时候再加载。不会在初始化的时候就被加载,让set先执行。。。总之这不是一个好方法。建议使用别的方案处理websocket;
由于set方法实现了接口ApplicationContextAware
我们可以在启动类拿到执行run的返回值,手动调用这个set方法,传入返回值进行手动初始化