2012-03-14 18 views
9

Sto usando le annotazioni Spring e voglio usare l'inizializzazione pigra.Spring @Autowired @Lazy

Sto incontrando un problema che quando voglio importare un bean da un'altra classe sono costretto a usare @Autowired che non sembra utilizzare init pigro. Esiste comunque un modo per forzare questo comportamento pigro di init?

In questo esempio non voglio vedere "Caricamento genitore" in corso di stampa poiché sto caricando solo childBean che non ha dipendenze su 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); 

    } 

} 

risposta

11

Perché stai usando @Autowired Long lazyParent, Primavera risolverà che la dipendenza quando il contesto si avvia. Il fatto che lazyBean sia @Lazy è irrilevante.

Prova questo in alternativa, anche se non sono al 100% convinto questo wil lwork come si vuole:

@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() + "!"; 
    } 
} 

P.S. Spero che tu non sia il veramente a definire stringhe, doppie e lunghe come fagioli e che questo è solo un esempio. Destra...?

+3

Ho appena avuto questa orribile visione di un fagiolo 'Void'. Uno per TDWTF credo ... –

+6

Void Bean per dominarli tutti. Void Bean per trovarli. Void Bean per portarli tutti, e in Dipendenza Iniezione Legarli –

+0

@skaffman Posso chiedere perché non dovrei definire Stringhe come fagioli? – wings

Problemi correlati