有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

在配置中明确定义的bean会像您预期的那样被延迟加载。然而,用@Named注释的扫描类总是被急切地加载。我该怎么解决这个问题

感谢您的帮助


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


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


共 (2) 个答案

  1. # 1 楼答案

    正如您之前所说,没有直接的方法来处理这个问题(在配置类中使用@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,因此,如果您有大量的类,这并不好,但可以最大限度地减少其他项目中类的可访问性(可能并非所有类都是必需的)

    我希望这有帮助

  2. # 2 楼答案

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

    spring.main.lazy-initialization=true