1. 程式人生 > >java 反射呼叫Service導致Spring注入Dao失效

java 反射呼叫Service導致Spring注入Dao失效

  1. 反射簡介
       反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
       對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及
       動態呼叫物件的方法的功能稱為java語言的反射機制。
  2. 問題:
       在專案中打算做一個通用的匯出方法,但是這個方法是寫在一個普通的工具類中的,這
       個工具類中我們通過使用反射的方法去呼叫其他的service層,通過service層查詢相關導
       出的資料用來填充匯出的excel,但是當我們使用反射進入到service層之後卻發現service
       層中的dao物件卻為空。經過調查由於使用反射,導致dao注入失敗。原因是自動裝配是在
       spring環境下當使用該類的例項時由spring容器完成了類的例項化過程,當然包括對依賴對
       象的例項化過程而通過反射建立例項時,是根據你呼叫的建構函式完成的例項化過程,沒有
       容器的自動化建立例項了,所以需要自己對依賴物件進行注入。所以依賴spring容器例項化
       和自己用反射例項化是兩種獨立的方式,不能相互滲透的。
  3. 程式碼解析
        a:原本我們使用反射呼叫service層錯誤的方式
             Class<?> classType = Class.forName(serviceClass);
             Method m = classType.getDeclaredMethod("method名稱",new Class[]{parameters.class});
             List<?> list = m.invoke(classType.newInstance(),parameters);
             注意:這裡我們就是使用classType.newInstance()方法才會使service中的dao注入失敗。
     
        b:正確的方法,通過spring容器取得物件
              WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
              Class<?> classType = Class.forName(serviceClass);
              Method m = classType.getDeclaredMethod("method名稱",new Class[]{parameters.class});
              List<?> list = m.invoke(wac.getBean("service的id物件名稱"),parameters);
            

文章目錄