前幾天工作中遇見的問題,在靜態的方法裏面,調用了別的類裏面的方法,結果拿到的對象值爲空。於是網上找了一波解決方案並寫下博客記錄一下,避免以後再次遇見坑。下面是大致的代碼(經過了更改)
public class TransExcelUtils {
@Autowired
private static OptService optService ;
public static void exportSheet(Map<String, Object> model) {
Map<String, String> resultData = optService.getName(name);
//打了斷點,這個optService的值爲null,根本取不到這個對象,所以運行的結果就是空指針異常
}
}
之後的更改就是加上@PostConstruct註解,就能完美運行結果了。
@Component
public class TransExcelUtils {
@Autowired
private OptService optService ;
public static TransExcelUtils transExcelUtils;
@PostConstruct
public void init() {
transExcelUtils = this;
transExcelUtils.optService = this.optService;
}
public static void exportSheet(Map<String, Object> model) {
Map<String, String> resultData = transExcelUtils.optService.getName(Name);
}
}
看別人的文章說的原因是這樣在springframework裏,我們不能@Autowired一個靜態變量,使之成爲一個spring bean。
而@PostConstruct的作用:在構造方法和init方法(如果有的話)之間得到調用,且只會執行一次。在重新運行項目的時候在init上面打了斷點,確實進入了斷點,說明確實是執行的。
這是網上的流程圖。