[問題] autowired問題一問

看板java作者 (SmallHanWinchest)時間7年前 (2016/10/08 01:35), 7年前編輯推噓0(0036)
留言36則, 5人參與, 最新討論串1/2 (看更多)
今天我在我的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

10/08 09:28, , 1F
要完整可以跑的程式啊,不知你在講什麼東西。
10/08 09:28, 1F
※ 編輯: 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

10/08 14:12, , 2F
從程式碼來看,我覺得你最好先去看文件或找本書好好看一
10/08 14:12, 2F

10/08 14:12, , 3F
一下,你可以把@Configure看成是@Bean的來源產生器,而
10/08 14:12, 3F

10/08 14:13, , 4F
@Autowired是注入人家產生好@Bean的接收者,先問一下 a與b
10/08 14:13, 4F

10/08 14:13, , 5F
變數的注入來源在那裡?至於aSet()與bSet()完全不贊同這種
10/08 14:13, 5F

10/08 14:14, , 6F
寫法,@Bean是用來產生注入來源,不是讓你用來修一個既有
10/08 14:14, 6F

10/08 14:14, , 7F
Bean的內容值,若要讓Bean有初值,你可以讓這個Bean的
10/08 14:14, 7F

10/08 14:14, , 8F
Bean的內容值,若要讓Bean有初值,你可以讓這個Bean的
10/08 14:14, 8F

10/08 14:15, , 9F
class implement InitializingBean或是這樣寫
10/08 14:15, 9F

10/08 14:15, , 10F
@Bean
10/08 14:15, 10F

10/08 14:15, , 11F
public A aSet(){
10/08 14:15, 11F

10/08 14:15, , 12F
A a = new A();
10/08 14:15, 12F

10/08 14:15, , 13F
a.id="hello";
10/08 14:15, 13F

10/08 14:15, , 14F
return a;
10/08 14:15, 14F

10/08 14:15, , 15F
}
10/08 14:15, 15F

10/08 14:15, , 16F
}
10/08 14:15, 16F

10/08 14:16, , 17F
不要想用@Bean自已產生然後注入自已而是用上方改寫的aSet
10/08 14:16, 17F

10/08 14:16, , 18F
@Bean
10/08 14:16, 18F

10/08 14:16, , 19F
public Map test(){
10/08 14:16, 19F

10/08 14:17, , 20F
Map mapTest = new ArrayList<>();
10/08 14:17, 20F

10/08 14:18, , 21F
mapTest.put('1',aSet()); ....
10/08 14:18, 21F

10/08 14:18, , 22F
}
10/08 14:18, 22F
※ 編輯: goldberg123 (111.185.18.144), 10/08/2016 15:20:41 ※ 編輯: goldberg123 (111.185.18.144), 10/08/2016 15:21:16

10/08 15:25, , 23F
我覺得你根本沒搞清楚dependency injection在幹麻
10/08 15:25, 23F

10/08 15:26, , 24F
同一個物件裡面自己產生(@Bean)又自己接收來用(@Autowired)
10/08 15:26, 24F

10/08 15:26, , 25F
毫無意義,直接呼叫就好了
10/08 15:26, 25F

10/08 15:41, , 26F
抱歉~我再去看一次官方文件~謝謝兩位高手提點
10/08 15:41, 26F

10/08 15:42, , 27F
加油。
10/08 15:42, 27F

10/08 15:47, , 28F
btw如果test需要a,b兩個dependency
10/08 15:47, 28F

10/08 15:48, , 29F
可以寫成 @Bean public Map test(A a, B b) { ... }
10/08 15:48, 29F

10/08 18:17, , 30F
另外就是,你寫這個是想要達到什麼目的?看不太懂意圖
10/08 18:17, 30F

10/09 12:29, , 31F
我想先把bean inject進來,再依照需求對bean裡的屬性
10/09 12:29, 31F

10/09 12:29, , 32F
做塞值動作,所以我才會先autowired進來再去set值
10/09 12:29, 32F

10/09 12:30, , 33F
不過好像違背@autowired精神,當初考量到這樣寫是因為
10/09 12:30, 33F

10/09 12:32, , 34F
是我有一支class需要做成兩個不同的bean
10/09 12:32, 34F

10/09 12:32, , 35F
就是同一支class只是差在屬性不同 A的bean的id='A'
10/09 12:32, 35F

10/09 12:33, , 36F
B的bean的id='B'這樣
10/09 12:33, 36F
文章代碼(AID): #1NzzpspL (java)
文章代碼(AID): #1NzzpspL (java)