Java 如何在春季用@ComponentScan惰性地加载所有bean?

Java 如何在春季用@ComponentScan惰性地加载所有bean?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我使用基于Java的配置来设置Spring应用程序上下文,如下所示: @Configuration @Lazy @ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class}) public class MyAppConfig { ... } 在配置中显式定义的bean被延迟加载,正如您所期望的那样。然而,用@Named注释的扫描类总是被急切地加载。我怎样才能解决这个问题 感谢您的帮助 请注意,对于M

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

@Configuration
@Lazy
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class})
public class MyAppConfig {
    ...
}
在配置中显式定义的bean被延迟加载,正如您所期望的那样。然而,用
@Named
注释的扫描类总是被急切地加载。我怎样才能解决这个问题

感谢您的帮助


请注意,对于
MyProject
包中的类,我也可以通过使用
@Lazy
注释它们来解决这个问题。但是另一个项目对Spring没有依赖性,我希望保持这样(因此
@命名为
,而不是
@组件



还请注意,这在基于XML的配置中并不是一个问题。在这里,在
标签中设置
default lazy init=“true”
来做我想做的事情(尽管我还没有测试过)。

正如您之前所说,没有直接的方法来处理这个问题(在配置类中使用@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或显式调用它时,将创建bean“lazyBean”,但不会在初始化时创建

请注意,您需要为要使用的每个类定义一个新bean,因此,如果您有大量的类,那么这并不好,但可以最大限度地减少其他项目类的可访问性(可能并非所有类都是必需的)


我希望这会有所帮助。

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

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

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

spring.main.lazy-initialization=true

所以试着添加一个小的
XML文件,剩下的留给Java配置。如果使用
@配置
无法做到这一点,请不要犹豫。检查此项:打开了一个关于此项的错误报告:实际上,其他项目的类已注释,但命名为
@
。因此,我想利用
@ComponentScan
,避免显式定义所有bean。但是谢谢你的时间,我会接受你的回答。嗨,非常感谢你的回答!我注意到,对于整个配置类,lazyInt=true必须与@Lazy结合使用;否则,它将不起作用。这在“懒惰”方面似乎是多余的。这是预期的行为吗?在SpringBoot2.0中如何做到这一点?