2016-06-03 19 views
6

Sono nuovo al framework Spring. Sono stato confuso riguardo al concetto di singleton in primavera e alla raccolta dei rifiuti. Ho letto molte domande e articoli per ottenere la risposta alla mia domanda che in che modo lo scope Singleton di Spring viene raccolto automaticamente da n.. Ho solo avuto le risposte sulla garbage collection del prototipo, ma gli articoli riguardanti lo scope Singleton non mi erano chiari. Qualcuno potrebbe dare i dettagli su questo problema.Come Spring Singleton Scope è Garbage Collection?

+1

cosa c'è in GC? –

+0

Conosco i singleton nel core Java ma non ho la conoscenza del funzionamento interno di Spring. Quindi voglio sapere che gli oggetti Spring con scope singleton sono raccolti garbage – Anant666

+0

indipendentemente dal fatto che la classe stessa sia disponibile per GC o meno, il suo contenuto è un'altra questione. –

risposta

6

In primavera, la maggior parte delle classi che scrivi saranno Singletons. Ciò significa che c'è sempre un'istanza di queste classi create. Queste classi vengono create quando il contenitore Spring viene avviato e distrutto quando il contenitore Spring si arresta.

Il motivo per cui gli oggetti Singleton Spring sono diversi dai semplici oggetti Java, è che il contenitore mantiene un riferimento a questi e possono essere utilizzati ovunque nel codice in qualsiasi momento.

Ti fornirò un esempio utilizzando il contenitore Spring per illustrare cosa intendo. Questo è NON come dovresti farlo normalmente quando scrivi un'app di Spring, questo è solo un esempio.

@Component 
public class ExampleClass implements ApplicationContextAware { 
    /* 
    * The ApplicationContextAware interface is a special interface that allows 
    * a class to hook into Spring's Application Context. It should not be used all 
    * over the place, because Spring provides better ways to get at your beans 
    */ 
    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     MyBean bean = applicationContext.getBean("MyBean"); 
    } 
} 

Quello che il codice di cui sopra non è dire alla Primavera "Voglio che l'istanza di MyBean che avete scoperto quando il contenitore ha iniziato" (Classpath Scanning). Spring dovrebbe avere un'istanza (proxy) di questa classe già creata e disponibile per il tuo uso.

Dal Spring Documentation

contenitore La molla IoC crea esattamente un'istanza dell'oggetto definita da tale definizione bean. Questa singola istanza è memorizzata in una cache di tali bean singleton e tutte le richieste e i riferimenti successivi per quel bean denominato restituiscono l'oggetto memorizzato nella cache.

Poiché il bean è stato memorizzato nella cache all'interno del contesto dell'applicazione, non è mai idoneo per la garbage collection finché il contesto dell'applicazione non viene distrutto.

+0

Grazie a @James per un URL di risposta e documentazione così dettagliato. – Anant666