2011-12-23 20 views
14

Tengo un bean singleton que tiene un método que crea instancias de un bean prototipo. Estoy usando el método documented here para obtener instancias del prototipo de frijol.Spring - ¿Cómo puedo destruir los granos de mi prototipo?

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; 
    } 
} 

Al principio pensé que esto era lo suficientemente bueno, que mi instancia de 'prototipo' iría fuera de alcance cuando el método de 'ir' regresó, lo que significa que la instancia no habría referencia y sería el recolector de basura .

Sin embargo, un compañero señaló la siguiente declaración de the documentation:

El código de cliente debe limpiar objetos prototipo con ámbito y liberar recursos caros que el frijol (s) prototipo está sosteniendo.

Parece que Spring conservará una referencia, por lo que el gc nunca lo detectará? Si ese es el caso, ¿cómo le digo a Spring que publique la referencia? La documentación menciona que puedo usar un 'postprocesador de frijol personalizado', pero no está claro dónde encajaría ese procesador y qué código se ejecutaría.

Gracias a todos de antemano por su ayuda, Roy

Respuesta

12

Creo que eres mala interpretación de la documentación. Solo dice que Spring no administrará el ciclo de vida del prototipo de frijol, por lo que los métodos de @PreDestroy (etc.) deben ser llamados por su propio código. Spring no retendrá una referencia.

+0

Gracias Arte - por lo que es seguro decir que el código anterior es suficiente y que no sería la causa de una pérdida de memoria? –

+1

bueno, eso depende de la implementación de MyPrototypeBean, pero desde la perspectiva de Spring está bien. – artbristol

+0

Para recuperar el bean usaste el método getBean (..). Entendí que cuesta mucho con las actuaciones. ¿cómo deberías recuperarlo entonces? – rayman

Cuestiones relacionadas