@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是基於對象層面的依賴注入,而靜態屬性/靜態變量實際上是屬於類的。