如何在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)
正如您之前所说,没有直接的方法来处理它(在配置类中使用@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,因此如果您有大量的类但是最好尽量减少其他项目的类的可访问性(可能不是所有类都是必需的),这样做并不好。
我希望这有帮助。