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

时间:2012-08-30 23:33:36

标签: java spring dependency-injection

我正在使用基于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>以做我想要的(虽然我没有测试过)。

3 个答案:

答案 0 :(得分:17)

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

.add_row

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

答案 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