¿Cómo cargar todos los beans perezosamente con @ComponentScan en Spring?

Estoy usando una configuración basada en Java para configurar mi contexto de aplicación Spring de esta manera:

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

Los frijoles definidos explícitamente en la configuración se cargan perezosamente, como es 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 @Lazy al @Lazy con @Lazy también. Pero el otro proyecto no depende de Spring y quiero mantenerlo así (por lo tanto, @Named y no @Component ).


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

A partir de la versión 4.1 RC2, este error es reparado, y puede realizar la carga diferida en el escaneo de componentes con:

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

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

Como dijiste antes, no hay una forma directa de manejar eso (usando @Lazy en la clase de configuración). Pero puedes probar con este enfoque:

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

Luego debe definir en Myproject una configuración que se vea así:

 @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 } } 

Usando esto, el bean “lazyBean” se creará cuando alguna instancia lo inyecte o cuando lo llame explícitamente, pero nunca en el momento de inicio.

Tenga en cuenta que necesita definir un nuevo bean por clase que quiera usar, por lo que no es bueno si tiene toneladas de clases pero es bueno para minimizar el acceso de las clases de su otro proyecto (tal vez no todas sus clases sean necesarias) .

Espero que esto ayude.