Spring 父類變數注入失敗的解決

2022-09-29 15:57:30 字數 2690 閱讀 9280

目錄

昨天遇到乙個action裡面service注入失敗,換種說法應該說是根本沒有發生注入,本來很簡單的乙個問題,但由於在專案中多個action進行了繼承,才最終導致了這個看似奇怪的問題。

收到同事問題,「有個action請求一直呼叫報控指標,service一直是空的導致的!」

初步看了**及配置,沒有發現什麼問題,起初懷疑是action沒有get方法所致,然後加上仍然無效;然後單步做了各種變數名的替換,一直一樣問題 ,這過程中一直關注j**a**確忽略了頁面請求,通過頁面請求發現**真正邏輯是頁面請求了乙個子類action的方法,而這個方法裡面呼叫了父類的乙個方法,此時父類裡面的service一直無法注入,對於上面所提的這種需求,實際上是需要在子類做spring注入的同時也進行父類的spring注入,那麼這種需要這樣的配置:

經過上面的設定以後,請求子類的action方法,子類方法中呼叫父類方法時,就不會出現父類不發生注入的問題了。

在使用spring + hibernate框架,或者ssh2等框架的時候,在開發中只有乙個基本的dao是現在的非常流行的做法。然後,在看過多份這種**以後,都是在每個業務類中宣告了乙個dao屬性,並且在bean配置中,對每個業務類分別注入dao。具體情形示例如下:

basedao**:

public class basedao

}services**:

//第乙個業務類

public class servicea

protected basedao baswww.cppcns.comedao;

public void setbasedao(basedao basedao) }

//第二個業務類

public class serviceb

protected basedao basedao;

public void setbasedao(basedao basedao)

}spring的bean配置如下:

這樣的做法是現在的主流。這樣做不是說那裡錯了,還是那句老話:這樣做肯定不優美,誰讓人有時候是一根筋呢?

能夠想到的辦法是用乙個父類來包含一些業務層公用的業務邏輯和屬性。所以可以將上面的**和配置。

services**改寫如下:

//所有業務類的父類

public class baseservice

}//第乙個業務類

public class servicea extends baseservice

}//第二個業務類

public class serviceb extends baseservice

}spring的bean配置改寫如下:

這樣一來是不簡潔了很多?尤其在實際專案有太多bean的時候。然後,這裡不會達到我們預想的結果,因為這裡會出現如下的錯誤:

exception:

org.springframework.web.util.nestedservletexception: request processing failed; nested exception is

j**a.lang.nullpointerexception

root cause:

j**a.lang.nullpointerexception:......

而出錯**就是每個業務中呼叫basedao的那行**。這說明注入失敗了。翻閱spring的bean注入詳解之後,很快就可以找應該設定子類bean配置的parent屬性。所以這裡可以修改設定。

spring的bean配置改寫如下:

這個時候再執行,就不會報錯了。原理是:在spring的子類bean配置中,其parent屬性作用是指定其父類,並繼承父類的注入屬性。不僅如此,子類還可以修改或者覆蓋父類的屬性值。例如上述**中的子類修改父類的basedao到屬性:

而對於父類的list等集合屬性,子類可以繼承父類的值,並且在其基礎上進行增加新的值:

www.cppcns.com

listvalue1

listvalue2

listvalue3

listvalue4

www.cppcns.comgt;

上面的方法是在xml配置檔案中進行的配置。而對現在spring3流行的annotation方式,其實更加的方便,完整示例如下:

basedao**:

@component

public class basedao

}services**:

//所有業務類的父類

public class baseservice squad

//第乙個業務類

@component

public class servicea extends baseservice

}//第二個業務類

@component

public class serviceb extends baseservice

}action層**:

@controller

@requestmapping(value = "/testaction")

public class testaction

}這裡根本就不需要進行parent屬性子類的配置,可以完美的提取父類,並且可以順利的使用父類的公用屬性。至於原理,沒有去看原始碼的處理方式,估計和上述xml配置是異曲同工的,只是在這裡增加了對父類的檢測。

本文標題: spring 父類變數注入失敗的解決

本文位址:

spring抽象父類注入

有時候為了管理或者避免不一致性,希望具體服務統一繼承抽象父類,同時使用 autowired為抽象父類注入依賴。搜了了網上,有些解決方法實現實在不敢恭維,靠子類去注入依賴,那還有什麼意義,如下 父類 public abstract classbasecar component public class...

Spring 靜態變數 建構函式注入失敗的解決方案

目錄 案例 如下 component public class helloworld public static string hello world 解決方案一 value註解加在setter方法上面 component public class helloworld public void se...

spring注入static變數

在spring中預設是不能注入static變數的,因為static是類變數,而spring是基於例項物件進行注入的.但是我們有時候需要static的變數進行操作.比如我們經常使用的jedis,如果每次呼叫jedis的時候都要例項化一遍,是非常麻煩的.解決辦法如下 1.我們先通過set方法注入乙個je...