我很難理解爲什麼使用@Autowired
的Spring Java Config中的某些內容不起作用。使用Autowired導致的NPE的Spring Java Config
首先,我試圖在Java配置類中移動我所有的@Autowired
註釋。這會使我的「POJO」變成真正的POJO。那麼我不僅可以在Spring上下文之外輕鬆測試它們,還可以輕鬆方便地使用模擬對象。
所以我第一次嘗試這樣的:
@Configuration
public class Module3ConfigClass {
@Autowired
private Module1Bean1 module1Bean1;
@Autowired
private Module2Bean1 module2Bean1;
@Bean
public Module3Bean1 module3Bean1() {
return new Module3Bean1(module1Bean1, module2Bean1);
}
}
然而,在調用Module3Bean1
構造時,無論是在豆類傳遞爲空。如果你沒有遵循我上面的命名規則,那麼這兩個bean將由一個單獨的Java Config配置文件創建。另外請注意,所有內容都是正確連線 - 我知道這一點,因爲當@Autowired
標籤位於Module3Bean1
內的相應私人成員字段中時,一切正常。
FWIW,我試着給module3Bean1()
方法添加一個@DependsOn
註解,但是結果相同。我想我真的很想理解這種行爲,這是否正確(我懷疑是這樣,但爲什麼)?
最後,我發現這裏顯示一個可接受的解決方法:
@Configuration
public class Module3ConfigClass {
@Bean
@Autowired
public Module3Bean1 module3Bean1(Module1Bean1 module1Bean1, Module2Bean1 module2Bean1) {
return new Module3Bean1(module1Bean1, module2Bean1);
}
}
這似乎沒什麼問題,但如果有人會照顧對此發表評論,這將是受歡迎的爲好。
豆類在自動裝配之前需要被創建。向我們展示這些bean在哪裏,另一個配置。你可能需要'@ Import'這個'@ Configuration'類。 – 2013-03-13 17:31:14
在上述兩種情況下,它們都是自動裝配的。首先是當自動裝配不在工廠(配置)過程中時,而第二個是在顯示的代碼中自動裝配的時候。所以假設這些都是簡單的bean,每個都在它們自己的(at)配置註釋類中並正確導入。我只是想知道爲什麼一些(在)Autowired bean出現在(at)配置類中,而有些(如上所示)則不會。 – JoeG 2013-03-13 17:41:48
然後我只能假設所有的bean都是在注入/自動裝配之前創建的。至於你的解決方法,我認爲這個方法可能會被調用兩次,一次用於@ Bean創建,一次用於'@ Autowired'。檢查你的日誌。 – 2013-03-13 17:45:26