2013-02-26 11 views
47

Sono principiante a primavera, ESP Inversion of control. Ero perplesso comprendere la differenza tra il seguenteComportamento predefinito di primavera per lazy-init

<bean id="demo" class="Demo" lazy-init="false"/> 
<bean id="demo" class="Demo" lazy-init="true"/> 
<bean id="demo" class="Demo" lazy-init="default"/> 

Per la mia comprensione: lazy-init = false crea il fagiolo all'avvio e lazy-init = true non crea un fagiolo all'avvio piuttosto crea il fagiolo su richiesta per un particolare fagiolo. correggimi qui, se la mia interpretazione è sbagliata.

quale è esattamente il comportamento predefinito di lazy-init? Come sarebbe un'istanza?

risposta

51

Il comportamento predefinito è false:

Per impostazione predefinita, le implementazioni ApplicationContext avidamente creare e configurare tutte fagioli Singleton come parte del processo di inizializzazione. Generalmente, questa pre-istanziazione è auspicabile, poiché gli errori nella configurazione o nell'ambiente circostante vengono rilevati immediatamente, anziché ore o giorni dopo. Quando questo comportamento non è desiderabile, è possibile impedire la pre-istanziazione di un bean singleton entro contrassegnando la definizione di bean come inizializzata pigro. Un bean pigro-inizializzato indica al contenitore IoC di creare un'istanza di bean quando è richiesto per la prima volta anziché all'avvio.

I suggest reading up

+0

GWT4Ever: Se il comportamento predefinito è falso, perché si deve specificare lazy-init = "false" nonostante possano usare lazy-init = "default" a destra ? Perché due valori separati falsi, di default se il loro comportamento è lo stesso? – srk

+1

A questa risposta ha risposto Zagyi, anche questo è tutto nel link. La documentazione aggiornata – Vjeetje

+0

è disponibile [qui] (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-dependency-resolution) –

17

L'impostazione lazy-init="default" su un fagiolo riferisce solo a ciò che è impostato dall'attributo default-lazy-init del racchiude fagioli elemento. Il valore predefinito implicito di default-lazy-init è false.

Se non è specificato l'attributo lazy-init su un bean, viene sempre istanziato.

+0

Ha riformulato la mia risposta un po 'per facilitare la comprensione ... – zagyi

3

lazy-init è l'attributo di fagiolo. I valori di lazy-init possono essere veri e falsi. Se lazy-init è vero, quel bean verrà inizializzato quando viene effettuata una richiesta al bean. Questo bean non verrà inizializzato quando il contenitore molla viene inizializzato e se lazy-init è false quindi il bean verrà inizializzato con l'inizializzazione del contenitore a molla.

16

Per chi arriva qui e si utilizza Java di configurazione è possibile impostare il fagiolo a lazy-init utilizzando le annotazioni come questo:

Nella classe di configurazione:

@Configuration 
// @Lazy - For all Beans to load lazily 
public class AppConf { 

    @Bean 
    @Lazy 
    public Demo demo() { 
     return new Demo(); 
    } 
} 

Per la scansione dei componenti e auto-cablaggio:

@Component 
@Lazy 
public class Demo { 
    .... 
    .... 
} 

@Component 
public class B { 

    @Autowired 
    @Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request. 
    private Demo demo; 

    ....... 
} 
1

quando usiamo lazy-init = "default" come attributo nell'elemento, il contenitore prende il valore specificato da default-lazy-init = "true | false" attributo dell'elemento e lo utilizza come lazy-init = "true | false".

Se l'attributo default-lazy-init non è presente nell'elemento di lazy-init = "default" nell'elemento si comporterà come se lazy-init- "false".

Problemi correlati