靜態方法調用spring注入的service類問題

問題: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

發佈了25 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章