2013-02-26 14 views
47

Jestem początkującym, aby wiosną, ESP Inwersja kontroli. Byłem zaskoczony zrozumienie różnicy między następującymiWiosenne domyślne zachowanie 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"/> 

mojego rozeznania lazy-init = false tworzy fasoli na starcie i leniwej inicjalizacji = true nie tworzy fasoli na starcie raczej tworzy fasoli na życzenie dla konkretnej fasoli. Popraw mnie tutaj, jeśli moja interpretacja jest zła.

jakie jest domyślne zachowanie lazy-init? W jaki sposób utworzy on instancję?

Odpowiedz

51

Domyślnym zachowaniem jest fałszywe:

Domyślnie implementacje ApplicationContext chętnie utworzyć i skonfigurować wszystkie singleton fasoli jako część procesu inicjalizacji. Ogólnie rzecz biorąc, to wstępne tworzenie instancji jest pożądane, ponieważ błędy w konfiguracji lub otoczeniu są wykrywane natychmiast, w przeciwieństwie do godzin lub nawet dni później. Gdy pożądane zachowanie to nie jest pożądane, można zapobiec wstępnemu utworzeniu pojedynczego komponentu bean przez oznaczenie definicji fasoli jako zainicjowanej przez leniwy. Leniwy inicjowany komponent bean mówi kontenerowi IoC, aby najpierw utworzyć instancję typu bean, gdy jest ona wymagana, a nie podczas uruchamiania.

I suggest reading up

+0

GWT4Ever: Jeśli domyślnym zachowaniem jest fałsz, dlaczego trzeba podać lazy-init = "false", mimo że można użyć lazy-init = "default" right ? Dlaczego dwie oddzielne wartości są fałszywe, domyślne, jeśli ich zachowanie jest takie samo? – srk

+1

Odpowiedzi udziela Zagyi, również w linku. – Vjeetje

+0

zaktualizowana dokumentacja jest dostępna [tutaj] (http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-dependency-resolution) –

17

Ustawienie lazy-init="default" na fasoli odnosi się tylko do tego, co jest ustalana przez atrybut otaczający fasoli elementu default-lazy-init. Domyślna domyślna wartość to default-lazy-init: false.

Jeśli w komponencie bean nie ma określonego atrybutu lazy-init, jest on zawsze chętnie tworzony.

+0

Przeformułowałem moją odpowiedź, by łatwiej zrozumieć ... – zagyi

3

leniwa inicjalizacji jest cechą fasoli. Wartości lazy-init mogą być prawdziwe i fałszywe. Jeśli lazy-init jest prawdziwe, to komponent bean zostanie zainicjowany po wysłaniu żądania do komponentu bean. Ten komponent bean nie zostanie zainicjowany po zainicjowaniu kontenera sprężynowego i , jeśli inicjowanie leniwego jest fałszywe, wówczas komponent bean zostanie zainicjowany inicjalizacją kontenera sprężynowego.

16

Dla tych, którzy przyjeżdżają tutaj i są przy użyciu config Java można ustawić Bean do leniwej inicjalizacji za pomocą adnotacji, takich jak to:

w klasie konfiguracji:

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

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

do skanowania elementów i auto-wiring:

@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

Gdy używamy lazy-init = "default" jako atrybut w elemencie, kontener pobiera wartość określoną przez default-lazy-init = "true | false" atrybut elementu i używa go jako lazy-init = "true | fałszywy".

Jeśli atrybut default-lazy-init nie jest obecny w elemencie, lazy-init = "default" w elemencie będzie zachowywał się tak, jakby lazy-init- "false".

Powiązane problemy