Spring bean 加载顺序导致的 bug 问题

Stella981
• 阅读 457

Spring bean 加载顺序导致的 bug 问题

点击上方蓝色“大数据实战演练”,选择“设为星标”或“置顶”

回复“资源”领取独家整理的学习资料!

Spring bean 加载顺序导致的 bug 问题

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

一、问题描述

今天启动 spring boot 项目的时候,有时候会报加载不到配置文件的属性。配置文件的属性是用 @Value 获取的,属性有时候会是 null 。

程序经过简化,是这样的,有一个 InitConfig 类,用来让静态工具类能获取到配置文件的属性值。内容是这样的:

Spring bean 加载顺序导致的 bug 问题

在静态工具类中,通过 InitConfig.load(); 来获取配置文件中的属性值,这是没问题的,因为 @Configuration 类会在 spring 程序启动过程中就执行了。

但如果在 @Service 修饰的类中,调用 InitConfig.load(); 如下图所示:

Spring bean 加载顺序导致的 bug 问题

这样,有时候就会获取不到配置文件中的属性值。如下图所示:

Spring bean 加载顺序导致的 bug 问题

很奇怪,经过研究尝试,终于了解了其中的缘由。现在给大家分享一下。

二、spring bean 加载顺序

之前我一直以为 @Configuration 会比 @Service、@Component 优先执行。其实不对。看下面的代码片段:

文件结构:

Spring bean 加载顺序导致的 bug 问题

Aaa.java 文件:

Spring bean 加载顺序导致的 bug 问题

Bb.java 文件:

Spring bean 加载顺序导致的 bug 问题

再结合上面的 InitConfig.java 文件。当项目启动的过程中,你会发现这样的结果:

Spring bean 加载顺序导致的 bug 问题

Aaa.java 先执行,Bb.java 其次,InitConfig.java 文件最后执行。这样就验证了 @Configuration 并不会比 @Service、@Component 优先执行。

我猜测的应该是,spring 将上面带有注解的类都放在一起,统一加载。默认是根据 包名+文件名称 来判断加载顺序的。

@Configuration、@Service、@Component 都会将修饰的类交给 spring 来管理,文件初始化的时候,会加载属性,无参构造方法等。

三、设置 spring bean 加载顺序

有这么一个注解,@DependsOn,它可以指定依赖哪个 bean ,让自己在该 bean 之后加载。这样就可以实现 bean 顺序的设置。

@Configuration@DependsOn({"initConfig", "aaa"})public class Bb {    ...}

@DependsOn 可以指定多个 bean ,用 String[] 表示,有顺序。@DependsOn({"initConfig", "aaa"}) 表示在执行 Bb.java 之前,会首先执行 InitConfig.java,然后再执行 Aaa.java。bean 名称默认为 首字母小写的文件名。

四、小结

@Configuration、@Service、@Component 都会将修饰的类交给 spring 来管理,但就注解这个层面来说,貌似是没有加载顺序的。默认为 包名+文件名 来判断加载顺序。

如果需要指定加载顺序,可以使用 @DependsOn 注解。

文中还用到了 @PostConstruct 注解。它是 jdk 中的一个注解, 被 @PostConstruct 修饰的方法会在服务器加载 Servlet 的时候运行,并且只会被服务器调用一次。

好啦,以上基本就是对 Spring bean 加载顺序导致问题 bug 的思考,如果上述描述有欠缺或错误,欢迎指正,感谢。

往期推荐

[

spring boot 项目中自动执行 sql 语句

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247485283%26idx%3D1%26sn%3D0b753a6915031e2ab2f5ad5036abc030%26chksm%3Dfcda01eacbad88fc6e9307883e16c35739c315e80a577cbd0f1bc0cfd947f2b94783d13b9726%26scene%3D21%23wechat_redirect)

[

spring boot 如何统一处理 Filter、Servlet 中的异常信息

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484985%26idx%3D1%26sn%3D5963ac7646c61b65eed53b5f454ade5e%26chksm%3Dfcda00b0cbad89a6413f754cb119da853ce1be86c1daa1cbaf26a9be55814dfb811f1a331c9d%26scene%3D21%23wechat_redirect)

[

企业都在用的 spring boot 打包插件,真的超好用!

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484923%26idx%3D1%26sn%3Db11643b7d30411bd2345e5cd932a7b95%26chksm%3Dfcda0372cbad8a644b766b56d54490db6b322a921cdfbf6fca7e2b089c535feb2454816a9b2a%26scene%3D21%23wechat_redirect)

[

后端字段校验告别 if else,快来用下 @Valid 注解,省事又方便

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484763%26idx%3D1%26sn%3Dbe78d5b4ab71173475a2d1b4cd097f1a%26chksm%3Dfcda03d2cbad8ac4e36d5282d2af0e4d5e13f3ff6c772af0f7399698c846dc90df9eeab7d536%26scene%3D21%23wechat_redirect)

[

Spring boot Swagger2 配置使用实战

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484684%26idx%3D1%26sn%3D86be80e9073b960a98ada008718e5ab1%26chksm%3Dfcda0385cbad8a93cafe1cf789be2388382f92749fa42c2a5913707dd6a1f92e088f1afa12c5%26scene%3D21%23wechat_redirect)

[

懒人:使用 idea 插件 Easy Code 自定义 MybatisPlus 模板一键快速生成所需代码

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484629%26idx%3D1%26sn%3Da0dc48a87a17c276ca49daa570e9a305%26chksm%3Dfcda025ccbad8b4a913b7122016695279e20a3daf23f73b5ac9ab2a2773206e6fba40b579cd1%26scene%3D21%23wechat_redirect)

[

用心整理 | Spring AOP 干货文章,图文并茂,附带 AOP 示例 ~

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484431%26idx%3D1%26sn%3D30d0998aa75c6e3d24b4c60bd2c69b01%26chksm%3Dfcda0286cbad8b906d2640cad29dc5dfda3e10f98ec1acafdd662388269b06f2d2234d7fc097%26scene%3D21%23wechat_redirect)

[

Spring IOC,看完这篇文章,我才算是懂了!

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484409%26idx%3D1%26sn%3D7dce5826ee0f85a6665cb862f21b68c7%26chksm%3Dfcda0570cbad8c66cb934f595a9407929dec1ba547b88dc0da66e6a13d955b74d7c3d45b0f2c%26scene%3D21%23wechat_redirect)

[

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484402%26idx%3D1%26sn%3Debf0b2c6b606ae43aab208781d3407ae%26chksm%3Dfcda057bcbad8c6dc7806f7be5bca2b99751e04d41493f86966bec558f404d4c99ed6e154363%26scene%3D21%23wechat_redirect)

[

看完这篇文章还不会给spring boot配置logback,请你吃瓜!

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3MTc1NzU0Mg%3D%3D%26mid%3D2247484301%26idx%3D1%26sn%3D1079d2c16d131fc65718cb02bddea4fc%26chksm%3Dfcda0504cbad8c12fb49b1950feaf8f566398bc6d6758b984d8c77d69a737705aef71b56faab%26scene%3D21%23wechat_redirect)

扫一扫,我们的故事就开始了。

Spring bean 加载顺序导致的 bug 问题

如果这篇文章对你有所启发,点赞、转发都是一种支持!

让我知道你在看

Spring bean 加载顺序导致的 bug 问题

本文分享自微信公众号 - 大数据实战演练(gh_f942bfc92d26)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
Gradle 6.6 发布,引入配置缓存特性,大幅提升构建性能
点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!!(https://oscimg.oschina.net/oscnet/65e7f42744ec4d9ea97ca391fcbe1d6c.jpg)来源|https://www.oschina.net/news/117987/gradle66
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Stella981 Stella981
3年前
ClickHouse大数据领域企业级应用实践和探索总结
点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源!(https://oscimg.oschina.net/oscnet/bb00e5f54a164cb9827f1dbccdf87443.jpg)!(https://oscimg.oschina.net/oscnet/dc8da835ff1b4
Stella981 Stella981
3年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
可莉 可莉
3年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
Stella981 Stella981
3年前
Dubbo 高危反序列化漏洞,存在远程代码执行风险,建议及时升级到2.7.7或更高版本!
点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!!(https://oscimg.oschina.net/oscnet/cffa04b4accbc940e13443c3b8133e34349.jpg)!(https://oscimg.oschina.net/oscnet/bf22b96b8e650e
Stella981 Stella981
3年前
Redis 的 8 大数据类型,写得非常好!
点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!!(https://oscimg.oschina.net/oscnet/04e95c480a2146db91209d7d4d8fd819.jpg)来源|https://blog.itzhouq.cn/redis2NoSQL开发中或多或少都会用到,