16

我正在使用基于 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>标签接缝做我想做的事(虽然我还没有测试过)。

4

3 回答 3

21

从 4.1 RC2 版本开始,此错误已修复,您可以通过以下方式完成组件扫描的延迟加载:

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

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

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

我希望这有帮助。

于 2012-09-27T16:41:19.467 回答
2

从 Spring Boot 2.2开始,您可以将属性设置为true(默认为false)以启用延迟初始化:

spring.main.lazy-initialization=true
于 2019-07-05T14:20:08.247 回答