Mam pojedynczego komponentu bean, który ma metodę, która tworzy wystąpienia prototypowej fasoli. Korzystam z metody documented here, aby uzyskać instancje prototypowego komponentu bean.Wiosna - Jak mogę zniszczyć moją fasolę o rozmiarze prototypowym?
public class SingletonService implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void go() {
MyPrototypeBean prototype = applicationContext
.getBean(MyPrototypeBean.class);
prototype.doSomething();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}
Na początku myślałem, że to było na tyle dobre, że moje wystąpienie „prototyp” pójdzie z zakresu gdy metoda „pójść” powrócił, co oznacza, że instancja by nie odwoływać i byłoby śmieci zebrane .
Jednak peer wskazał następujące oświadczenie z the documentation:
Kod klient musi posprzątać prototypowe o zakresie obiektów i zwolnić drogich zasobów, które fasoli (e) prototyp są gospodarstwa.
Wygląda na to, że Spring zachowa odniesienie, więc gc nigdy go nie odbierze? Jeśli tak, to w jaki sposób mogę powiedzieć Springowi, by zwolnił referencję? Dokumentacja wspomina, że mogę używać "niestandardowego procesora po stronie", ale nie jest jasne, gdzie ten procesor pasowałby i jaki kod by działał.
Dzięki wszystkim z góry za pomoc, Roy
Dzięki sztuce - więc można bezpiecznie powiedzieć, że powyższy kod jest wystarczający i nie może być przyczyną wycieku pamięci? –
cóż, to zależy od implementacji MyPrototypeBean, ale z perspektywy Spring jest w porządku. – artbristol
W celu pobrania fasoli wykorzystano metodę getBean (..). Rozumiem, że to dużo kosztuje z występami. jak powinieneś to odzyskać? – rayman