看板 java 關於我們 聯絡資訊
今天我在我的config中autowired幾支class進來 像是這樣 @Autowired private A a; @Autowired private B b; 然後再set某些值進去 public A aSet(){ a.id = 'hello'; return a; } public B bSet(){ b.id = 'world'; return b; } } 然後run server時候會報錯 於是我改成以下這樣 @Autowired private A a; private A a; @Autowired @qulifier("aSet") private A aSet; @Autowired private B b; @Autowired @qulifier("bSet") private B bSet; 然後再set某些值進去 @bean public A aSet(){ public A aSet(){ a.id = 'hello'; return a; } @bean public B aSet(){ b.id = 'world'; return b; } 然後再丟到Map裡頭例如 public Map<String,Test> test(){ public Map<String,Test> test(){ Map<String,Test> mapTest = new ArrayList<String,Test>(); mapTest.put('1',aSet); mapTest.put('2',bSet); return mapTest; } 雖然run server可以過不會報錯 但是我map中的a和b是空值,沒有被set到hello和world; 後來我就印log發現a根本是null b也是null 根本沒拿記憶體位置 後來我就印log發現a根本是null b也是null 根本沒拿記憶體位置 請問是不能這樣set值嗎 還是我autowired錯了 這問題搞了我好久 網路上也有去找答案 但好像沒人用過這種寫法 所以都找不到問題點 煩請各位高手指點 補充完整的程式碼 @Configure public class someConfig { @Autowired private A a; @Autowired @qulifier("aSet") private A aSet; @Autowired @Autowired private B b; @Autowired @qulifier("bSet") private B bSet; @Bean public Map<String,ITest> test(){ Map<String,Test> mapTest = new ArrayList<String,Test>(); mapTest.put('1',a); System.out.println(a) <-- 此時會印null 沒有拿到實體 mapTest.put('2',b); <-- 此時會印null 沒有拿到實體 return mapTest; } @bean public A aSet(){ a.id = 'hello'; return a; } @bean public B aSet(){ b.id = 'world'; return b; } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.185.18.144 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1475861750.A.CD5.html
qrtt1: 要完整可以跑的程式啊,不知你在講什麼東西。10/08 09:28
※ 編輯: goldberg123 (111.185.18.144), 10/08/2016 11:26:53 ※ 編輯: goldberg123 (111.185.18.144), 10/08/2016 12:12:49 ※ 編輯: goldberg123 (111.185.18.144), 10/08/2016 12:25:48
kentyeh: 從程式碼來看,我覺得你最好先去看文件或找本書好好看一10/08 14:12
kentyeh: 一下,你可以把@Configure看成是@Bean的來源產生器,而10/08 14:12
kentyeh: @Autowired是注入人家產生好@Bean的接收者,先問一下 a與b10/08 14:13
kentyeh: 變數的注入來源在那裡?至於aSet()與bSet()完全不贊同這種10/08 14:13
kentyeh: 寫法,@Bean是用來產生注入來源,不是讓你用來修一個既有10/08 14:14
kentyeh: Bean的內容值,若要讓Bean有初值,你可以讓這個Bean的10/08 14:14
kentyeh: Bean的內容值,若要讓Bean有初值,你可以讓這個Bean的10/08 14:14
kentyeh: class implement InitializingBean或是這樣寫10/08 14:15
kentyeh: @Bean10/08 14:15
kentyeh: public A aSet(){10/08 14:15
kentyeh: A a = new A();10/08 14:15
kentyeh: a.id="hello";10/08 14:15
kentyeh: return a;10/08 14:15
kentyeh: }10/08 14:15
kentyeh: }10/08 14:15
kentyeh: 不要想用@Bean自已產生然後注入自已而是用上方改寫的aSet10/08 14:16
kentyeh: @Bean10/08 14:16
kentyeh: public Map test(){10/08 14:16
kentyeh: Map mapTest = new ArrayList<>();10/08 14:17
kentyeh: mapTest.put('1',aSet()); ....10/08 14:18
kentyeh: }10/08 14:18
※ 編輯: goldberg123 (111.185.18.144), 10/08/2016 15:20:41 ※ 編輯: goldberg123 (111.185.18.144), 10/08/2016 15:21:16
ssccg: 我覺得你根本沒搞清楚dependency injection在幹麻 10/08 15:25
ssccg: 同一個物件裡面自己產生(@Bean)又自己接收來用(@Autowired) 10/08 15:26
ssccg: 毫無意義,直接呼叫就好了 10/08 15:26
goldberg123: 抱歉~我再去看一次官方文件~謝謝兩位高手提點 10/08 15:41
pttworld: 加油。 10/08 15:42
ssccg: btw如果test需要a,b兩個dependency 10/08 15:47
ssccg: 可以寫成 @Bean public Map test(A a, B b) { ... } 10/08 15:48
qrtt1: 另外就是,你寫這個是想要達到什麼目的?看不太懂意圖 10/08 18:17
goldberg123: 我想先把bean inject進來,再依照需求對bean裡的屬性 10/09 12:29
goldberg123: 做塞值動作,所以我才會先autowired進來再去set值 10/09 12:29
goldberg123: 不過好像違背@autowired精神,當初考量到這樣寫是因為 10/09 12:30
goldberg123: 是我有一支class需要做成兩個不同的bean 10/09 12:32
goldberg123: 就是同一支class只是差在屬性不同 A的bean的id='A' 10/09 12:32
goldberg123: B的bean的id='B'這樣 10/09 12:33