問題:1.在靜態方法中調用@Autowired或@Resource註解的Spring注入的service的方法問題。
分析:1.首先,靜態方法中不可調用非靜態方法,這與JVM加載類的機制有關。
2.spring自動注入,使用spring框架的很常用如果在靜態方法中調用此注入類的方法,發現注入爲'null';原因不是spring未注入,而是被static方法給'清空'了。
解決方法一:
0 @Component //此處註解不能省卻(0)
1 public class NtClient {
2 /**
3 * 日誌
4 */
5 private static String clazzName = NtClient.class.getName();
6 /**
7 * 此處是要使用的service需要spring注入(1)
8 */
9 @Autowired
10 private NotifyTimeService notifyTimeService;
11 private static NtClient ntClient;
12 /**
13 * 注意此處註解(2) */
14 @PostConstruct
15 public void init() {
16 ntClient = this;
17 ntClient.notifyTimeService = this.notifyTimeService;
18 }
19 /**
20 * 主要使用場景(3)
21 */
22 public static void insertParam(int id){
23 /**
24 * 注意此處的調用方法(4)
25 */
26 if(ntClient.notifyTimeService.deleteNotifyTime(id)){
27 }
28 }
29 }
註釋:(0)處作用是將(2)ntClient = this;this進行賦值(注:如果無註解ntClient 將null) (1)處爲spring自動注入,使用spring框架的很常用,但是如果在靜態方法中調用此注入類的方法,發現注入爲'null';原因不是spring未注入,而是被static方法給'清空'了,在無法先於static方法初始化之前想了一個辦法 (2)處爲想到的辦法:通過(注:@PostConstruct修飾的方法會在服務器加載Servle的時候運行,並且只會被服務器執行一次。PostConstruct在構造函數之後執行,init()方法之前執行。PreDestroy()方法在destroy()方法執行執行之後執行)的方法public void init()先給該類賦值,然後通過(1)出注入進來。這樣不影響dao等service下面調用的注入! (3)處要處理的特殊方法static(經典是 main()方法,自己想想基礎,它裏面可以使用的方法調用的模式) (4)處是使用這樣模式的調用方式notifyTimeService現在是作爲ntClient的屬性
————————————————
版權聲明:本文爲CSDN博主「菜鳥柱子」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xinpz/article/details/81061515