首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Springboot 2.2中加载所有Springboot,无论它是由@Bean还是@Component定义的

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

Stack Overflow用户
提问于 2020-04-06 15:00:44
回答 2查看 2.3K关注 0票数 2

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

现在,只要假设应用程序的一次运行只处理一个命令,程序就会退出。

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

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

既然我的应用程序首先确定了执行哪种命令(创建、删除、列表、更新等),我希望创建该命令的唯一bean,并在任何需要的地方(从用户那里获取命令之后)自动处理,并且我希望避免创建与其他命令相关的几十个bean。

在搜索过程中,我了解了spring提供的Beans的延迟实例化。然而,我不确定这是否是我正在寻找的武器。

我试过什么

  • 首先找到了@Lazy注释,但是由于我想懒惰地加载所有Beans,所以我不想在每个类中到处编写@Lazy。
  • ,然后我发现在application.yml中的属性下面设置可以完成工作。

代码语言:javascript
复制
spring:
  main:
    lazy-initialization: true

我试过了,但它并不是懒洋洋地创造豆子。

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

代码语言:javascript
复制
spring:
  main:
    lazy-initialization: true

我的主SpringBootApplication文件如下所示:

代码语言:javascript
复制
@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());
    }
}

我的其他类如下所示:

代码语言:javascript
复制
@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
}

在运行应用程序时,它打印我注释@组件的所有类以及@Bean方法创建的Bean。

我也尝试过在Application.properties中使用下面的内容,但仍然没有用。

代码语言:javascript
复制
spring.main.lazy-initialization=true

另外,如果你愿意的话,请评论我是否应该像我正在使用的那样对每个类使用@组件,以及什么是更好的实践。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-06 16:42:34

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

您可以通过检查传递lazy标志时创建的bean数量是否为true和false来验证此行为。您可以按如下所示进行检查

代码语言:javascript
复制
ApplicationContext context = SpringApplication.run(SpringBootApplication.class, args);
System.out.println("count:"+context.getBeanDefinitionCount());

“2020年4月7日裁武条约”编辑

另一种方法是创建构造函数,并使用构造函数注入自动配置的属性,并在它们输入构造函数时打印出日志。

我在一个示例项目中做了同样的事情,下面是他的结果,第一个是急切的初始化,另一个是懒惰。

spring.main.lazy-initialization=false应用程序日志

代码语言:javascript
复制
Inside Constructor
calling bean
inside bean method

spring.main.lazy-initialization=true应用程序日志

代码语言:javascript
复制
calling bean
Inside Constructor
inside bean method

2020年4月7日编辑

如果我回答了你的问题,请把它标记出来。谢谢

票数 2
EN

Stack Overflow用户

发布于 2021-06-16 14:24:18

长话短说:对于任何想要延迟初始化整个Spring上下文的人来说,将此属性设置为true是可行的方法:

代码语言:javascript
复制
spring.main.lazy-initialization=true

Pro提示:它可以与设置为false的@ lazy 注释结合使用;因此所有定义的bean都将使用延迟初始化,除了我们使用@Lazy(false)显式配置的那些bean。

这样,延迟初始化就变成了选择退出,而不是默认的opt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61062721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档