2011-12-23 8 views
14

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

Odpowiedz

12

Myślę, że nieporozumienie dokumentację. Mówi się tylko, że Spring nie będzie zarządzał cyklem życia prototypowej fasoli, więc metody @PreDestroy (etc.) muszą być wywoływane przez twój własny kod. Wiosna nie zachowuje odniesienia.

+0

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? –

+1

cóż, to zależy od implementacji MyPrototypeBean, ale z perspektywy Spring jest w porządku. – artbristol

+0

W celu pobrania fasoli wykorzystano metodę getBean (..). Rozumiem, że to dużo kosztuje z występami. jak powinieneś to odzyskać? – rayman

Powiązane problemy