關於工具類靜態方法調用@Autowired注入的service類問題


 @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的屬性

需要在工具類中注入Service,由於工具類中方法一般都是靜態的,所以要求該屬性也要是靜態的(Service)。但是由於Spring/SpringBoot正常情況下不能支持注入靜態屬性(會報空指針異常)。主要原因在於:Spring的依賴注入實際上是依賴於Set方法進行注入值的,Spring是基於對象層面的依賴注入,而靜態屬性/靜態變量實際上是屬於類的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM