[問題] autowired問題一問

作者: goldberg123 (SmallHanWinchest)   2016-10-08 01:35:46
今天我在我的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) <
作者: qrtt1 (有些事,有時候。。。)   2016-10-08 09:28:00
要完整可以跑的程式啊,不知你在講什麼東西。
作者: kentyeh (kent)   2016-10-08 14:12:00
從程式碼來看,我覺得你最好先去看文件或找本書好好看一一下,[email protected]@Bean的來源產生器,而@[email protected],先問一下 a與b變數的注入來源在那裡?至於aSet()與bSet()完全不贊同這種寫法,@Bean是用來產生注入來源,不是讓你用來修一個既有Bean的內容值,若要讓Bean有初值,你可以讓這個Bean的Bean的內容值,若要讓Bean有初值,你可以讓這個Bean的class implement InitializingBean或是這樣寫@Beanpublic A aSet(){A a = new A();a.id="hello";return a;}}[email protected]寫的aSet@Beanpublic Map test(){Map mapTest = new ArrayList<>();mapTest.put('1',aSet()); ....}
作者: ssccg (23)   2016-10-08 15:25:00
我覺得你根本沒搞清楚dependency injection在幹麻同一個物件裡面自己產生(@Bean)又自己接收來用(@Autowired)毫無意義,直接呼叫就好了
作者: goldberg123 (SmallHanWinchest)   2016-10-08 15:41:00
抱歉~我再去看一次官方文件~謝謝兩位高手提點
作者: pttworld (批踢踢世界)   2016-10-08 15:42:00
加油。
作者: ssccg (23)   2016-10-08 15:47:00
btw如果test需要a,b兩個dependency可以寫成 @Bean public Map test(A a, B b) { ... }
作者: qrtt1 (有些事,有時候。。。)   2016-10-08 18:17:00
另外就是,你寫這個是想要達到什麼目的?看不太懂意圖
作者: goldberg123 (SmallHanWinchest)   2016-10-09 12:29:00
我想先把bean inject進來,再依照需求對bean裡的屬性做塞值動作,所以我才會先autowired進來再去set值[email protected],當初考量到這樣寫是因為是我有一支class需要做成兩個不同的bean就是同一支class只是差在屬性不同 A的bean的id='A'B的bean的id='B'這樣

Links booklink

Contact Us: admin [ a t ] ucptt.com