我正在编写一个spring应用程序,它是交互式的,基本上处理许多命令,如创建、列表、更新、删除各种类型的资源。
现在,只要假设应用程序的一次运行只处理一个命令,程序就会退出。
对于所有要验证命令的类,执行命令、每个资源所需的工厂类,都有一个单独的类,每个类都带有@Component注释,用于spring来管理所有组件。
还有一些通过@Bean方法手动定义的bean。
既然我的应用程序首先确定了执行哪种命令(创建、删除、列表、更新等),我希望创建该命令的唯一bean,并在任何需要的地方(从用户那里获取命令之后)自动处理,并且我希望避免创建与其他命令相关的几十个bean。
在搜索过程中,我了解了spring提供的Beans的延迟实例化。然而,我不确定这是否是我正在寻找的武器。
我试过什么
spring:
main:
lazy-initialization: true我试过了,但它并不是懒洋洋地创造豆子。
我的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
}在运行应用程序时,它打印我注释@组件的所有类以及@Bean方法创建的Bean。
我也尝试过在Application.properties中使用下面的内容,但仍然没有用。
spring.main.lazy-initialization=true另外,如果你愿意的话,请评论我是否应该像我正在使用的那样对每个类使用@组件,以及什么是更好的实践。
发布于 2020-04-06 16:42:34
我认为您误解了您传递的lazy标志的含义,这意味着对象只有在被调用时才会创建,但它并不表示它不会扫描该包。Spring将扫描所有包并存储bean定义名称,但只有在调用它时,如果您将lazy标志传递给它,它才会创建对象。
您可以通过检查传递lazy标志时创建的bean数量是否为true和false来验证此行为。您可以按如下所示进行检查
ApplicationContext context = SpringApplication.run(SpringBootApplication.class, args);
System.out.println("count:"+context.getBeanDefinitionCount());“2020年4月7日裁武条约”编辑
另一种方法是创建构造函数,并使用构造函数注入自动配置的属性,并在它们输入构造函数时打印出日志。
我在一个示例项目中做了同样的事情,下面是他的结果,第一个是急切的初始化,另一个是懒惰。
spring.main.lazy-initialization=false应用程序日志
Inside Constructor
calling bean
inside bean methodspring.main.lazy-initialization=true应用程序日志
calling bean
Inside Constructor
inside bean method2020年4月7日编辑
如果我回答了你的问题,请把它标记出来。谢谢
发布于 2021-06-16 14:24:18
长话短说:对于任何想要延迟初始化整个Spring上下文的人来说,将此属性设置为true是可行的方法:
spring.main.lazy-initialization=truePro提示:它可以与设置为false的@ lazy 注释结合使用;因此所有定义的bean都将使用延迟初始化,除了我们使用@Lazy(false)显式配置的那些bean。
这样,延迟初始化就变成了选择退出,而不是默认的opt。
https://stackoverflow.com/questions/61062721
复制相似问题