11、springboot项目启动时对容器中的bean进行延迟初始化

springboot项目启动时对容器中的bean进行延迟初始化

预初始化:

Spring Boot在启动应用时,会启动Spring容器,当启动Spring容器时,Spring会自动初始化容器中所有的singleton Bean------这是默认行为
预初始化的好处:

1、项目启动时,就初始化了容器中所有的组件,因此后续提供服务时速度更快

2、项目启动时,就需要初始化了应用的所有的组件,这样就可提前发现项目中某个组件的错误。

延迟初始化:

启动Spring容器时,不初始化容器中任何Bean,而是等到应用需要某个Bean时,才去初始化该bean。
延迟初始化的好处:

降低内存开销------所有组件是按需启动的,因此有些组件可能根本不需要被启动,从而降低了系统开销

启动延迟初始化有如下3种方式:
方法1: 调用SpringApplicationBuilder对象的lazyInitialization(true)方法。
方法2: 调用SpringApplication对象的setLazyInitialization(true)方法。
方法3: 在application.properties文件中配置如下代码:spring.main.lazy-initialization=true

方法二:调用SpringApplication对象的setLazyInitialization(true)方法。

1、先在User类添加一个构造器,在方法体打印一句话,然后启动主配置类,发现打印成功,说明在启动项目的时候,就会预初始化容器中的这个User对象。

2、用方法二取消预初始化,启动延迟初始化。

问题: 如图,启动了延迟初始化,可是为什么这个User对象还是被预初始化了?

原因:
此处设置的延迟初始化仅对Spring Boot应用自动扫描的组件有效

对于用@Import或@ImportResouce方式额外导入的配置类或配置文件------它们可以指定自己的预初始化行为。

这个User对象就是通过xml 配置文件和@ImportResouce注解额外导入的,所以此处的延迟初始化对User对象无效。(XML自定义配置文件配置User对象

因此上面所设置的启动延迟初始化的行为,对@Import或@ImportResouce所导入的配置文件是无效的。

这时候我们再定义一个Dog类,用注解@Component修饰,意味着这个类是spring容器中的一个组件,springboot应用会自动加载该组件。

默认的预初始化:

启动延迟初始化:

可以看出启动延迟初始化后,这个受springboot自动管理的Dog对象就没有在启动的时候被预初始化了。

针对这句:

对于用@Import或@ImportResouce方式额外导入的配置类或配置文件------它们可以指定自己的预初始化行为。

因此上面所设置的启动延迟初始化的行为,对@Import或@ImportResouce所导入的配置文件是无效的。

可以这么指定自己的与初始化行为:

对于自定义xml配置文件中的单个bean,想要其延迟初始化,可以在指定bean添加lazy-init="false"。

如果想要整个自定义的xml配置文件的bean都延迟初始化,那么就在文件头添加: default-lazy-init="true"

从启动日志中也可以看出没有初始化这个bean对象。

相关推荐
Tigshop开源商城1 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
Tigshop开源商城3 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
养肥胖虎3 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
REDcker3 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
晓杰'3 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
无所事事O_o4 小时前
二次验证码TOTP 使用说明
后端·二次验证码·谷歌验证器
ltl4 小时前
Multi-Head Attention:为什么要分多个头
后端
kobesdu4 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx235 小时前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven
matlabgoodboy5 小时前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序