2012-03-14 27 views
9

Używam adnotacji Spring i chcę użyć leniwego inicjowania.Wiosna @Aktowiowana @Lazy

Występuje problem, że gdy chcę zaimportować komponent bean z innej klasy, jestem zmuszony użyć @Autowired, która nie wydaje się używać leniwego init. Czy mimo to można wymusić to leniwy proces inicjowania?

W tym przykładzie nie chcę, aby "Ładowanie nadrzędnej fasoli" było kiedykolwiek drukowane, ponieważ ładuję tylko childBean, która nie ma zależności od lazyParent.

@Configuration 
public class ConfigParent { 
    @Bean 
    @Lazy 
    public Long lazyParent(){ 
     System.out.println("Loading parent bean"); 
     return 123L; 
    } 

} 

@Configuration 
@Import(ConfigParent.class) 
public class ConfigChild { 
    private @Autowired Long lazyParent; 
    @Bean 
    public Double childBean() { 
     System.out.println("loading child bean"); 
     return 1.0; 
    } 
    @Bean 
    @Lazy 
    public String lazyBean() { 
     return lazyParent+"!"; 
    } 
} 

public class ConfigTester { 
    public static void main(String[] args) { 
     ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigChild.class); 
     Double childBean=ctx.getBean(Double.class); 
     System.out.println(childBean); 

    } 

} 

Odpowiedz

11

Ponieważ używasz @Autowired Long lazyParent, Wiosna rozwiąże tę zależność, gdy rozpoczyna się kontekst. Fakt, że lazyBean jest niepoprawny.

Spróbuj to jako alternatywę, choć nie jestem w 100% przekonany WIL lwork jak chcesz go do:

@Configuration 
@Import(ConfigParent.class) 
public class ConfigChild { 

    private @Autowired ConfigParent configParent; 

    @Bean 
    public Double childBean() { 
     System.out.println("loading child bean"); 
     return 1.0; 
    } 

    @Bean 
    @Lazy 
    public String lazyBean() { 
     return configParent.lazyParent() + "!"; 
    } 
} 

PS: Mam nadzieję, że nie jesteś naprawdę definiowania ciągów, podwójnych i długich jako fasoli, i że to tylko przykład. Dobrze...?

+3

Po prostu miałem okropną wizję fasoli "Pustki". Jeden dla TDWTF Myślę, że ... –

+6

Void Bean, aby rządzić nimi wszystkimi. Fasola pustki, aby je znaleźć. Void Bean, aby je wszystkie, i iniekcji Dependency Bind im –

+0

@skaffman Czy mogę zapytać, dlaczego nie powinienem zdefiniować Strings jako fasoli? – wings