如何在春天懒洋洋地用@ComponentScan装满所有的豆子?

2022-09-03 05:48:20

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

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

在配置中显式定义的 Bean 会像您预期的那样延迟加载。但是,带有注释的扫描类始终会急切地加载。我该如何解决这个问题?@Named

任何帮助是值得赞赏的。


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


另请注意,这在基于 XML 的配置中不会成为问题。在那里,设置标签接缝以做我想做的事情(尽管我还没有测试过)。default-lazy-init="true"<beans>


答案 1

从 4.1 版 RC2 开始,此 bug 已修复,您可以使用以下命令在组件扫描时完成延迟加载:

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

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


答案 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,因此,如果您有大量类,这并不好,但可以最大限度地减少其他项目类的可访问性(也许并非所有类都是必需的)。

我希望这有帮助。


推荐