2012-03-14 17 views
9

Estoy usando anotaciones de Spring y quiero utilizar la inicialización perezosa.Spring @Autowired @ Lazy

Me está surgiendo el problema de que cuando quiero importar un bean de otra clase me veo forzado a usar @Autowired que no parece usar init lazy. ¿Hay alguna forma de forzar este comportamiento de inicio perezoso?

En este ejemplo, no deseo que se imprima "Cargando pariente principal" ya que solo estoy cargando childBean que no tiene dependencias en 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); 

    } 

} 

Respuesta

11

Debido a que usted está utilizando @Autowired Long lazyParent, Primavera resolverá esa dependencia cuando el contexto se pone en marcha. El hecho de que lazyBean es @Lazy es irrelevante.

Trate esto como una alternativa, aunque no estoy 100% convencido de que esto temáticas de trabajo Wil como quiera que a:

@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. Espero que no estés realmente definiendo Cadenas, Dobles y Longs como frijoles, y que esto es solo un ejemplo. Derecha...?

+3

Acabo de tener esta visión horrible de un frijol 'Void'. Uno para TDWTF, creo ... –

+6

Void Bean para gobernarlos a todos. Void Bean para encontrarlos. Void Bean para traerlos a todos, y en Inyección de Dependencia Enlazarlos –

+0

@skaffman ¿Puedo preguntar por qué no debería definir Cadenas como frijoles? – wings