我正在使用基于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"
标签接缝中设置<beans>
以做我想要的(虽然我没有测试过)。
答案 0 :(得分:17)
答案 1 :(得分:2)
如前所述,没有直接的方法来处理(在配置类中使用@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,因此如果您有大量的类但这样做并不好,那么最好尽量减少其他项目的类的可访问性(可能不是所有类的是必要的。)
我希望这会有所帮助。
答案 2 :(得分:1)
From Spring Boot 2.2,您可以将属性设置为true
(默认为false
)以启用延迟初始化:
spring.main.lazy-initialization=true