2013-02-26 15 views
47

Ich bin Anfänger im Frühjahr, ESP Inversion der Kontrolle. Ich war die Differenz zwischen den folgendenFrühling Standardverhalten für Lazy-Init

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

Zu meinem Verständnis: lazy-init = false erstellt die Bohne beim Start und lazy-init = true keine Bohne beim Start erstellen eher schafft die Bohne auf Anfrage für eine bestimmte Bohne. Korrigieren Sie mich hier, wenn meine Interpretation falsch ist.

Was genau ist das Standardverhalten von Lazy-Init? Wie würde es instanziieren?

Antwort

51

Das Standardverhalten ist falsch:

standardmäßig Application Implementierungen eifrig erstellen und configure alle Singleton Bohnen als Teil des Initialisierungsprozesses. Im Allgemeinen ist diese Vorinstanziierung wünschenswert, da Fehler in der Konfiguration oder Umgebung sofort entdeckt werden, im Gegensatz zu Stunden oder sogar Tagen später. Wenn dieses Verhalten nicht erwünscht ist, können Sie die Vorinstanzierung einer Singleton-Bean durch verhindern, indem Sie die Bean-Definition als "lazy-initialized" markieren. Eine lazy-initialisierte -Bean weist den IoC-Container an, eine Bean-Instanz zu erstellen, wenn sie zuerst angefordert wird, anstatt sie beim Start anzufordern ( ).

I suggest reading up

+0

GWT4Ever: Wenn das Standardverhalten falsch ist, warum müsste man lazy-init = "false" angeben, obwohl sie das Recht lazy-init = "default" verwenden können ? Warum zwei getrennte Werte falsch, Standard wenn ihr Verhalten gleich ist? – srk

+1

Dies wird von Zagyi beantwortet, es ist auch alles in der Verbindung. – Vjeetje

+0

aktualisierte Dokumentation ist verfügbar [hier] (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-dependency-resolution) –

17

lazy-init="default" Die Einstellung auf einem bean bezieht sich nur auf das, was durch das default-lazy-init Attribut des umschließenden Bohnen Element festgelegt ist. Der implizite Standardwert von default-lazy-init ist false.

Wenn in einer Bean kein lazy-init-Attribut angegeben ist, wird es immer instanziiert.

+0

Umformulierung meiner Antwort ein wenig zum leichteren Verständnis ... – zagyi

3

lazy-init ist das Attribut der Bohne. Die Werte von lazy-init können wahr und falsch sein. Wenn Lazy-Init True ist, wird diese Bean initialisiert, wenn eine Anfrage an Bean gestellt wird. Diese Bean wird nicht initialisiert, wenn der Spring-Container initialisiert wird und Wenn Lazy-Init falsch ist dann wird die Bean mit der Spring-Container-Initialisierung initialisiert.

16

Für diejenigen, hierher zu kommen und werden mit Hilfe von Java Config Sie die Bean zu lazy-init mit Anmerkungen wie folgt einstellen:

In der Konfigurationsklasse:

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

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

Für die Komponente Scannen und auto-Verkabelung:

@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

Wenn wir verwenden lazy-init = "default" Als ein Attribut im Element nimmt der Container den Wert default-lazy-init = "true | false" Attribut des Elements an und verwendet es als lazy-init = "true | falsch".

Wenn das default-lazy-init-Attribut in Element nicht vorhanden ist, wird sich lazy-init = "default" im Element wie lazy-init- "false" verhalten.