保留中のスレッドのリストなど、いくつかの内部フィールドを備えたサービス(シングルトンフィット)が必要です(はい、すべてがスレッドセーフになるように記述されています)。問題は、@autowire
このBeanの場合、フィールドが空に見えることです。デバッグプロキシが、入力されたフィールドを持つインスタンスに正しくバインドされている(フィールド CGLIB$CALLBACK_X
は入力されたBeanに正しくリンクされている)が、提供されるフィールドは空であることがわかります。
次のコード行は、私が話していることの一般的な考え方を示しています。
@Service
public class myService{
@Autowired
private Monitor monitor;
public List getSomething(){
return monitor.getList();
}
}
@Service
public class myStatefulService{
//This field will be populated for sure by someone before getSomething() is called
private List list;
public synchronized List getSomething(){
return this.list;
}
//Called by other services that self inject this bean
public synchronized void addToList(Object o){
this.list.add(o);
}
}
monitor
getList呼び出し中に変数をデバッグします
monitor => instance of correct class
fields:
CGLIB$BOUND => true
CGLIB$CALLBACK_0.advised => proxyFactory (correct)
CGLIB$CALLBACK_1.target (reference to the correct instance of myStatefulService class)
fields:
list => [.........] (correctly populated)
CGLIB$CALLBACK_2 .....
......
......
......
list => [] (the list that would be populated is empty instead)