专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  高性能、无侵入的 Java 性能监控神器 ·  4 小时前  
Java编程精选  ·  手把手教你Java文件断点下载 ·  昨天  
芋道源码  ·  抱歉,最近我劝各位真的别轻易离职...... ·  昨天  
芋道源码  ·  一款轻便、安全、免费的远程桌面工具 ·  昨天  
芋道源码  ·  如何加快 SQL 查询速度的同时保持 ... ·  昨天  
51好读  ›  专栏  ›  ImportNew

一文理解 Spring Bean 异步初始化的实现思路

ImportNew  · 公众号  · Java  · 2024-05-21 09:19

正文

请到「今天看啥」查看全文



突然划到看到这个时候,我眼睛都直了:


在服务启动时,异步初始化 beans。

不是说好不支持吗?怎么突然变卦了呢?

于是我点到这个 New Features 后面的链接,准备一探究竟:

https://github.com/spring-projects/spring-framework/issues/19487


这个 issue 是 2016 年提出来的,提问的这个哥们给出了一个自己实际的案例,然后还是想要官方能够支持 Bean 的异步初始化。

在今年 2 月的时候,这个下面有一个官方回答:


把链接指引到了 13410 这个 issue 里面。

而 13410 就是我们前面提到的这个 2011 年提出的 issue:


所以兜兜转转,还是回到了最开始的地方。

两年过去了,这个问题下最新的回答是 2024 年 2 月 28 日,也是来自官方的回答:


这个回答可以说非常关键了,是整个 Bean 的异步初始化的实现思路 ,我带你盘一下关键点,强烈建议你自己去看看,并且根据这部分的描述找到对应的代码。

在这个回答里面提到说会引入 backgroundInit 标识,以及在 @Bean 里面加入  bootstrap=BACKGROUND 枚举,通过这样的方式来支持 Bean 的异步初始化。
会在 preInstantiateSingletons 方法中,覆盖每个加了 BACKGROUND 的 Bean 的整个 getBean 步骤。

因为是异步处理,相应的 Future  会存储起来,这样依赖的 Bean 就会自动等待 Bean 实例完成。

此外,所有常规的后台初始化都会在 preInstantiateSingletons 结束时强制完成。只有被额外标记为 @Lazy 的 Bean 才允许稍后完成(直到第一次实际访问)。

最后这个回答中还强调了一点:因为是异步化操作,所以项目中还需要搞一个叫做 bootstrapExecutor 的线程池,来支持这个事情。

没有,那就异步化不了。

尝鲜


气氛都烘托到这里了,那高低得给你整一个 Demo 跑跑才行啊。

目前 Spring 6.2.0 版本还没正式发布,最新的 SpringBoot 里面也还没有集成 Spring 6.2.0 版本。

所以我们不能通过新建一个 SpringBoot 项目来尝鲜,得搞一个纯粹的 Spring 项目。

没想到歪师傅写到这里的时候遇到了一个卡点:怎么去创建一个 Spring 项目来着?


这几年要创建一个新的项目,都是直接使用 SpringBoot 的脚手架来搞了,这突然一下让我搞一个纯粹的 Spring 项目出来,还真的有点懵逼。

于是我还去网上搜索了一番。搜索的问题是:如何创建一个 Spring 项目。

这个问题,我当年刚入行的时候肯定也搜过。

要是放在几年前,徒手撸一个 Spring 项目的架子出来就像是呼吸一样简单。

这几年属于是被 SpringBoot 喂的太好了。






请到「今天看啥」查看全文