先描述背景:

自定义了一个实现ApplicationContextAware的自定义类,之前测试都是用IDE的run as application方式启动项目,没有错误。

后来打包成jar文件通过java -jar运行即报空指针异常

Caused by: java.lang.NullPointerException: null
at com.ceair.b2t.messagecenter.SpringContextUtil.getBean(SpringContextUtil.java:41) ~[classes!/:na]

原因:

直接原因是applicationContext为空,即没有注入

背后的原因是实现ApplicationContextAware的自定义类和使用applicationContext的类加载顺序问题。

一定要把定义的ApplicationContextAware工具类加载顺序放到调用类的前面

解决方案:

就是在调用类上添加注解

@DependsOn("springContextUtil")

该注解用于声明当前bean依赖于另外一个bean。所依赖的bean会被容器确保在当前bean实例化之前被实例化。

题外话:

这样看来两种run项目方式至少在类加载顺序上是有区别的