Avere molti bean inutilizzati in un contesto Spring Bean comporta uno spreco di risorse significative?

StackOverflow https://stackoverflow.com/questions/98320

  •  01-07-2019
  •  | 
  •  

Domanda

Il mio livello di modello viene utilizzato da una manciata di progetti diversi e vorrei utilizzare un singolo file di configurazione XML Spring per il modello indipendentemente da quale progetto lo utilizza.

La mia domanda è:Poiché non tutti i bean vengono utilizzati in tutti i progetti, sto sprecando risorse in modo significativo se non viene istanziata?Non sono sicuro di quanto sia pigro Spring nel caricarli poiché fino ad ora non è mai stato un problema.

Qualche idea?

È stato utile?

Soluzione

Tratto da Manuale di riferimento di primavera:

Il comportamento predefinito per le implementazioni di ApplicationContext consiste nel preistanziare con entusiasmo tutti i bean singleton all'avvio.La pre-istanziazione significa che un ApplicationContext creerà e configurerà con entusiasmo tutti i suoi bean singleton come parte del suo processo di inizializzazione.Generalmente questa è una buona cosa, perché significa che eventuali errori nella configurazione o nell'ambiente circostante verranno scoperti immediatamente (anziché ore o addirittura giorni dopo).

Tuttavia, ci sono momenti in cui questo comportamento non è quello desiderato.Se non si desidera che un bean singleton venga pre-istanziato quando si utilizza un ApplicationContext, è possibile controllarlo selettivamente contrassegnando una definizione di bean come inizializzata lazy.Un bean inizializzato in modo lento indica al contenitore IoC se un'istanza del bean deve essere creata o meno all'avvio o quando viene richiesta per la prima volta.

Quando si configurano i bean tramite XML, questo caricamento lento è controllato dall'attributo 'lazy-init' sull'[elemento bean] ;Per esempio:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

Ma, a meno che i tuoi bean non utilizzino risorse come blocchi di file o connessioni a database, non mi preoccuperei troppo del semplice sovraccarico di memoria se fosse più semplice per te avere questa configurazione per più profili (ma diversi).

Altri suggerimenti

Oltre agli altri commenti:è anche possibile specificare un intero file di configurazione da inizializzare pigramente, utilizzando l'attributo 'default-lazy-init' nel menu <beans/> elemento;Per esempio:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

Questo è molto più semplice che aggiungere il file lazy-init attribuisci ad ogni fagiolo, se ne hai molti.

Per impostazione predefinita, i bean Spring sono singleton e vengono istanziati quando viene creato il contesto dell'applicazione (all'avvio).Quindi, supponendo che tu non abbia sovrascritto il comportamento predefinito, verrà creata una singola istanza di ogni bean.

Dipende dagli oggetti.

Tuttavia, il codice inutilizzato è "cruft" e aumenterà il costo della manutenzione.

Meglio eliminare gli arbitri e le classi.Puoi sempre ripristinare dal controllo della versione se sono necessari in seguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top