關於controller,service,dao層的問題記錄


出錯寫法:   

  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)){
                   }
            }
View Code

代碼注釋:

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


免責聲明!

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



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