java如何在春季用@ComponentScan惰性地加载所有bean?
我使用基于Java的配置来设置Spring应用程序上下文,如下所示:
@Configuration
@Lazy
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class})
public class MyAppConfig {
...
}
在配置中明确定义的bean会像您预期的那样被延迟加载。然而,用@Named
注释的扫描类总是被急切地加载。我该怎么解决这个问题
感谢您的帮助
注意,对于MyProject
包中的类,我也可以通过用@Lazy
注释它们来解决这个问题。但是另一个项目对Spring没有依赖性,我希望保持这样(因此@Named
而不是@Component
)
还要注意的是,这在基于XML的配置中并不是一个问题。在那里,在<beans>
标签接缝中设置default-lazy-init="true"
来做我想做的事情(尽管我还没有测试过)
# 1 楼答案
正如您之前所说,没有直接的方法来处理这个问题(在配置类中使用@Lazy)。但你可以尝试这种方法:
我假设OtherProject是一个不使用Spring的项目,假设这些类没有注释
然后,您应该在Myproject中定义如下配置:
使用这种方法,当某个实例注入bean或显式调用它时,将创建bean“lazyBean”,但不会在初始时间创建
请注意,您需要为要使用的每个类定义一个新bean,因此,如果您有大量的类,这并不好,但可以最大限度地减少其他项目中类的可访问性(可能并非所有类都是必需的)
我希望这有帮助
# 2 楼答案
From Spring Boot 2.2,您可以将属性设置为
true
(默认为false
),以启用延迟初始化: