出錯寫法:
1>、AlarmRecordController art=new AlarmRecordController();
2>、private static SystemService systemService;
3>、@Autowired private static JccmEquipmentInfoServiceI jccmEquipmentInfoService;
錯誤原因: (1)controller層調用service層,service調用dao層,這個調用關系是單向的,不可以反過來
(2)這三層的類都不能通過new創建,要通過注入方式,統一由spring管理(錯誤1)
(3)2和3的錯誤是在編譯的時候出現錯誤,是因為在靜態方法中調用了這個兩個變量,所以加了static 造成編譯的時候出現空指針異常,原因不是spring未注入,而是被static方法給'清空'了
此處如果必須用static方法調用的話可參考下面代碼:(靜態方法調用spring注入的service類問題)

@Component //此處注解不能省卻(0) public class NtClient { /** * 日志 */ private static String clazzName = NtClient.class.getName(); /** * 此處是要使用的service需要spring注入(1) */ @Autowired private NotifyTimeService notifyTimeService; private static NtClient ntClient; /** * 注意此處注解(2) *使用注解@PostConstruct把需要使用的service加載到上面定義的靜態內部對象中 * 先進行init()方法,再進行@Autowired注入 */ @PostConstruct public void init() { ntClient = this; ntClient.notifyTimeService = this.notifyTimeService; } /** * 主要使用場景(3) */ public static void insertParam(int id){ /** * 注意此處的調用方法(4) */ if(ntClient.notifyTimeService.deleteNotifyTime(id)){ } }
代碼注釋:
(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的屬性