如何在Spring中使用@ComponentScan懒洋洋地加载所有bean?

我正在使用基于Java的配置来设置我的Spring应用程序上下文,如下所示:

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

在配置中明确定义的Bean会像您期望的那样懒惰地加载。 但是,用@Named注释的扫描类总是急切地加载。 我怎么解决这个问题?

任何帮助表示赞赏。


请注意,对于MyProject包中的类,我可以通过使用@Lazy注释它们来解决这个问题。 但是另一个项目没有依赖Spring,我想保持它(因此@Named而不是@Component )。


另请注意,这不会成为基于XML的配置中的问题。 在那里,在标签接缝中设置default-lazy-init="true"来做我想要的(虽然我没有测试过)。

从版本4.1 RC2开始,此错误已得到修复,您可以使用以下命令完成组件扫描的延迟加载:

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

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

正如您之前所说,没有直接的方法来处理它(在配置类中使用@Lazy)。 但你可以尝试这种方法:

我认为OtherProject是一个不使用Spring的项目,并且假设这些类没有注释。

然后你应该在Myproject中定义一个看起来像这样的配置:

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

使用它,bean“lazyBean”将在某个实例注入它或明确调用它时创建,但永远不会在初始时创建。

请注意,您需要为每个要为其使用的类定义一个新bean,因此如果您有大量的类但是最好尽量减少其他项目的类的可访问性(可能不是所有类都是必需的),这样做并不好。

我希望这有帮助。