先描述背景:
自定义了一个实现ApplicationContextAware的自定义类,之前测试都是用IDE的run as application方式启动项目,没有错误。
后来打包成jar文件通过java -jar运行即报空指针异常
Caused by: java.lang.NullPointerException: null
at com.sunjianbo.messagecenter.SpringContextUtil.getBean(SpringContextUtil.java:41) ~[classes!/:na]
原因:
直接原因是applicationContext为空,即没有注入
背后的原因是实现ApplicationContextAware的自定义类和使用applicationContext的类加载顺序问题。
一定要把定义的ApplicationContextAware工具类加载顺序放到调用类的前面
解决方案:
就是在调用类上添加注解
@DependsOn("springContextUtil")
该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。
题外话:
这样看来两种run项目方式至少在类加载顺序上是有区别的