1,背景
由于筆者希望在非Spring管理的類中使用Spring中的配置,故在項目類定義了如下工具類:
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
public static String getProperty(String key) {
return applicationContext.getEnvironment().getProperty(key);
}
}
該工具類作為Spring的一個組件加載。由于其實現了ApplicationContextAware接口,加載時會運行該接口的方法setApplciationContext(ApplicationContext
applicationContext),在這個方法中進行了SpringUtils工具類的初始化。
2,問題
之后筆者將該工程打包,加入到另外一個工程進行開發,運行的時候發現一直報applicationContext為空的NullPointException。
3,原因
后多次驗證發現,使用該包的工程中,間接調用這個工具類的方法用@PostConstuct修飾了。而@PostConstuct修飾的方法在Spring容器啟動時會先于該工具類的setApplicationContext()方法運行。故這里是未運行setApplicationConext()方法初始化工具類的ApplicationContext就使用了它,所以回報空指針異常。
4,解決方法
在使用了該工具類的類上,加上@DepondensOn("springUtils")注解,強制初始化該工具類。
|