2012-09-15 67 views
3

我發現了很多關於類成員變量的setter依賴注入的例子,但是發現很難找到任何關於使用spring的方法內部局部變量的setter依賴注入的例子。如何使用彈簧依賴注入局部變量?

我該怎麼做?

+1

局部變量的依賴注入甚至意味着什麼?請向我們展示一些代碼,並解釋您想要實現的目標! –

+1

你的意思是構造函數注入?或者注入沒有setter的變量?... –

+0

也許我不清楚爲什麼要使用DI。 我看到鏈接[鏈接](http://www.tutorialspoint.com/spring/setter_based_dependency_injection.htm) 從示例類TextEditor方法spellCheck(),我認爲如果spellChecker是像下面這樣的局部變量: SpellChecker spellChecker =新的SpellChecker(); spellChecker.checkSpelling(); 然後如何替換'新的SpellChecker();'與DI? 或在這種情況下不應該使用DI? – user1169587

回答

1

在給出依賴注入能力之前,您給出的由TextEditor類使用的SpellChecker示例可能看起來像這樣。您正在使用它的方法內創建類SpellChecker的新實例。

public class TextEditor { 

    public void doSomething() { 
     new SpellChecker().checkSpelling(); 
    } 

} 

如果你想分離的代碼,並能夠通過一個模擬的單元測試的目的,或通過您的依賴注入容器提供的另一種實現方式,以取代拼寫檢查,你必須改變類,並提供一個字段,這實例可以被注入。

public class TextEditor { 

    @Autowired 
    private SpellChecker spellChecker; 

    public void doSomething() { 
     spellChecker.checkSpelling(); 
    } 

} 

因爲這仍然是不容易測試,因爲你需要使用反射來注入模擬成私有字段,你可以提供一個二傳手或者取出修改從外地民營使該字段包可見。因此,同一包中的單元測試可以訪問此字段並提供模擬。

+0

是的,我的問題是「你必須改變類並提供一個可以注入此實例的字段」,這是否意味着它無法注入局部變量'spellChecker',但必須將其更改爲成員變量使用DI? 作爲一個側面問題,我已經在代碼示例之前縮進了四個空格,但爲什麼它仍然顯示在一行上?你用什麼方法發佈上述示例代碼? @ stefanglase @ Don @ Matt – user1169587

+1

是的,您必須更改類並引入依賴項的字段。有些方法可以捕獲和注入類似'New SomeClass()'這樣的語句的地方,但是你的類會告訴與執行時會發生什麼不同的東西。有關此功能,請參閱PowerMock。並回答你的第二個問題:你不能在註釋中格式化代碼。 – stefanglase

+0

對不起,我的愚蠢,「但你的班級會告訴與執行時發生的事情不同的是什麼」。無論如何,對於春天來說,DI不能用於局部變量嗎?或者DI不是爲局部變量設計的? – user1169587