一个正常的SpringBeanUtil工具类本来是很简单的
@Component
public class SpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("classloader1:" + SpringBeanUtil.class.getClassLoader());
SpringBeanUtil.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
public static <T> T getBean(Class<T> requiredType) {
System.out.println("classloader2:" + SpringBeanUtil.class.getClassLoader());
return applicationContext.getBean(requiredType);
}
}
但是在项目运行过程中,getBean这个方法始终报java.lang.NullPointerException: null错。
我想了很久,一开始以为是setApplicationContext未注入,但是调试发现该方法是执行了的,所以ApplicationContext是有值得。
然后我又想,会不会SpringBeanUtil这个类不是单利模式,导致多实例问题。但是我仔细看 applicationContext是static的,也应该不会呀。
后来我又想,会不会是多个不同的classloader导致产生了多个不同类的SpringBeanUtil。这样,在springboot启动过程中,set方法确实调用了,但是 getbean的时候又使用的是另外一个classloader加载的类。
嗯,果然,两个打印行输出的classloader真不一样:
classloader:org.springframework.boot.devtools.restart.classloader.RestartClassLoader@4c788f80
classloader:sun.misc.Launcher$AppClassLoader@18b4aac2。
然后,参考另外一篇文章https://blog.csdn.net/feinifi/article/details/85237166。
简单干掉devtools就好啦。
很久不编程了,找个问题要几个小时;而且 感觉 搜索引擎越来越帮不上忙了,还是要一些先验知识