1. 程式人生 > >Spring 註解 new建立物件後失效

Spring 註解 new建立物件後失效

       遇到這麼一個情況,想寫一個Util工具類用於記錄操作日誌,在無法使用static關鍵字情況下,使用new來建立物件,隨後執行一直報異常,

java.lang.NullPointerException
	at net.wrtrd.adsystem.sql.dao.impl.LogMapperImpl.insertLog(LogMapperImpl.java:16)
	at net.wrtrd.adsystem.services.LogService.insertLog(LogService.java:25)
	at net.wrtrd.adsystem.util.LogWriteUtil.saveLogInfo(LogWriteUtil.java:19)
	at net.wrtrd.adsystem.util.LogWriteUtil.addLogInfo(LogWriteUtil.java:45)
	at net.wrtrd.adsystem.control.UserManageAction.getUserInfoAllJson(UserManageAction.java:100)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(

 很顯然是“空指標”異常,經除錯發現在剛進入方法時,1.service物件存在,說明註解生效   2.當執行至new建立物件時,service注入的物件消失。

解決:

經查詢發現,spring的建立物件步驟在class載入時就已經通過spring容器建立成功了,所以在此時一旦自行New,所有的相應注入即會失敗,在使用時就產生了衝突,你既然要我通過spring來自行建立,你又來自行干預,那我肯定就有意見了,然後我就讓你報錯讓你報錯讓你報錯.......   注意,這裡並不是說使用了註解以後就不能new,測試結果是,能例項化,並且相應的方法也是可以使用的。但是,例項化後相應Class 相關的注入也就會集體失效,除非你所有步驟都用new的方式,否則它還是會報錯。

 至於正確的解決方案,使用了註解,還是老老實實別使用New 二者不可兼得。  

本來是有Class,可以截圖,便於形象描述,由於更改程式碼後,相應的已被刪除,另外至於為什麼註解無法使用static,原因很簡單,static是宣告這個屬性/方法屬於Class所有,是無法例項化的,而註解注入是一個例項化的操作,只是它將這個步驟交由了sprign容器來管理,所以很顯然它是無法使用static的。