2012-08-30 8 views
13

estoy usando configuración basada en Java para configurar mi contexto de aplicación de primavera como esta:¿Cómo cargar todos los frijoles perezosamente con @ComponentScan en Spring?

@Configuration 
@Lazy 
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class}) 
public class MyAppConfig { 
    ... 
} 

Frijoles definidas explícitamente en la configuración son cargados con pereza, como era de esperar. Sin embargo, las clases escaneadas anotadas con @Named siempre se cargan con entusiasmo. ¿Como puedo resolver esto?

Cualquier ayuda es apreciada.


Tenga en cuenta que para las clases en el paquete MyProject, puedo solucionar este anotando con @Lazy también. Pero el otro proyecto no tiene una dependencia de Spring y quiero mantenerlo así (de ahí @Named y no @Component).


Tenga en cuenta también que esto no parece ser un problema en la configuración basada en XML. Allí, estableciendo default-lazy-init="true" en las costuras de etiqueta <beans> para hacer lo que quiero (aunque no lo he probado).

+3

Así que trata de la adición de pequeñas ' 'y deje reposo en la configuración de Java. Si no hay forma de hacerlo con '@ Configuration', no dude en [plantear un problema] (https://jira.springsource.org/secure/Dashboard.jspa). –

+0

verifique esto: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/context/annotation/Lazy.html – Elbek

+2

Hay un informe de error abierto al respecto: https: // jira.spring.io/browse/SPR-10459 –

Respuesta

12

partir de la versión 4.1 RC2, este error se corrige, y se puede realizar la carga diferida de exploración componente con:

@ComponentScan(basePackages = ["..."], lazyInit = true) 

https://jira.spring.io/browse/SPR-10459

+0

Impresionante. Esto ayuda a simplificar mis configuraciones junit. – Basil

2

Como dijo antes, no hay una manera directa de manejar eso (usando @Lazy en la clase de configuración). Pero puede intentar con este enfoque:

Supongo que OtherProject es un proyecto que no está utilizando Spring e imagine que estas clases no están anotadas.

A continuación, se deben definir en MYPROJECT una configuración que se parece a lo siguiente:

@Configuration 
// Avoid use this line if classes aren't annotated @ComponentScan("com.otherProject") 
public class MyProjectConfig { 

    @Bean(name = "lazyBean") 
    @Lazy 
    public LazyBean lazyBean(){ 
     System.out.println("Loading LazyBean bean"); 
     return new LazyBean(); // Or use a static method factory, this is only an example 
    } 
} 

uso de este, el grano "lazyBean" se crearán cuando algún caso lo inyecta o cuando explícitamente lo llama, pero nunca a tiempo de inicio

Tenga en cuenta que necesita definir un nuevo bean por clase que desea utilizar, por lo que esto no es bueno si tiene toneladas de clases pero es bueno para minimizar el acceso de las clases de su otro proyecto (quizás no todas las clases son necesarias).

Espero que esto ayude.

+0

En realidad, las clases del otro proyecto * están * anotadas, pero con '@ Named'. Por lo tanto, quería aprovechar el '@ ComponentScan' y evitar tener que definir todos los beans explícitamente. Pero gracias por su tiempo, aceptaré su respuesta. – rolve

Cuestiones relacionadas