如何延迟加载所有Spring Bean,无论它是由Springboot 2.2中的@Bean还是@Component定义的

问题描述 投票:0回答:1

我正在编写一个交互式的Spring应用程序,它基本上处理许多命令,例如创建,列出,更新,删除各种类型的资源。

现在,仅假设应用程序的单次运行仅处理单个命令,然后程序退出。

对于要验证命令的所有类,执行命令,每种资源所需的工厂类都有一个单独的类,并且每个类都用@Component注释进行注释,以便spring管理所有组件。

还有一些通过@Bean方法手动定义的bean。

现在,我的应用程序首先确定要执行的命令类型(创建,删除,列出,更新等),我希望仅在需要时(从用户处获得命令之后)创建并自动装配该命令的唯一bean,然后我想要避免创建数十个与其他命令相关的bean。

在搜索时,我了解了spring提供的Beans的惰性实例化。但是,我不确定这是否是我要寻找的武器。

我尝试了什么

  • 首先,我发现了@Lazy批注,但是由于我想延迟加载所有Bean,所以我不想在每个类的任何地方都编写@Lazy。
  • 然后我发现application.yml中的属性下面的设置起作用。
spring:
  main:
    lazy-initialization: true

我尝试过,但是仍然没有懒惰地创建bean。

我的application.yml文件看起来像这样

spring:
  main:
    lazy-initialization: true

我的主SpringBootApplication文件如下所示:

@Slf4j
@SpringBootApplication
public class SpringBootApplication {
    public static void main(String[] args) {
        System.out.println("Loading Application...");
        ApplicationContext context = SpringApplication.run(SpringBootApplication.class, args);



        final AtomicInteger counter = new AtomicInteger(0);
        log.info("**************** START: Total Bean Objects: {} ******************", context.getBeanDefinitionCount());

        Arrays.asList(context.getBeanDefinitionNames())
                .forEach(beanName -> {
                    log.info("{}) Bean Name: {} ", counter.incrementAndGet(), beanName);
                });

        log.info("**************** END: Total Bean: {} ******************", context.getBeanDefinitionCount());
    }
}

我的其他班级看起来像这样:


@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MyClass1 implements ResourceCreator<MyClass2, MyClass3> {
    private final RequestValidatorImpl requestValidator;
    private final ResourceCreator resourceCreator;

@Override
public MyClass2 toImplementFunction(MyClass3 myclass3) {
//logic
}

在运行应用程序时,它会打印我在@Component处注释的所有类以及通过@Bean方法创建的bean。

我也在Application.properties中尝试过使用,但仍然没有用。

spring.main.lazy-initialization=true

此外,如果您愿意,请评论我是否应该像我正在使用的那样对每个类使用@Component以及更好的做法。

java spring spring-boot
1个回答
0
投票

[我认为您误解了所传递的lazy标志的含义,这意味着仅在调用对象时才创建该对象,但并不表示不会扫描该程序包。 Spring将扫描所有程序包并存储bean定义名称,但是,如果您已将lazy标志传递给它,它将仅在调用它时创建对象。

您可以通过检查将lazy标志传递为true和false时创建的bean数量来验证此行为。您可以按照下面的说明进行检查

ApplicationContext context = SpringApplication.run(SpringBootApplication.class, args);
System.out.println("count:"+context.getBeanDefinitionCount());

如果我回答了您的问题,请标记为已回答。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.