关于Spring框架的 @Configuration 与@Service 加载顺序哪个先后(某些环境加载是随机的)

很多资料都说@Configuration 优先加载,@Service后加载,如下图:

 

本来也是以为 @Configuration 优先加载于  @Service ,那参数处理放在@Configuration注入完后,@service构建时就可以拿来用的,在我在IDEA的调试时下断点验证过。但在正式环境跑项目时并不是这样的。

先看原代码:

  带@Configuration注解的配置参数代码如下:

@Configuration
public class SysParamApi {/*** 是否调试模式*/public static boolean is_debug=true;@Value("${sys-param.sys.is_debug}")public  void setIs_debug(String is_debug) {SysParamApi.is_debug = "Y".equals(is_debug);System.out.println("是否调试模式:"+SysParamApi.is_debug);}}

带@Service业务类,有两个地方在使用这个参数。上面的@Configuration参数,代码如下:

@Service
public class PushStatusServiceImpl {private static final Logger logger = LogManager.getLogger(PushStatusServiceImpl.class);//调试时设置falseboolean isRun=true;@PostConstructpublic void init() {int cpuCount = Runtime.getRuntime().availableProcessors();System.out.println("start RedisStatusProcess > cpus=" + cpuCount);if(!SysParamApi.is_debug) {//业务处理logger.info("=========================== start rev pole status -> "+isRun);processOrderImport();}else{logger.info("xxxxxxxxxxxxxxxxxx start rev status -> Fail");}}
}@Service
public class PushOrderServiceImpl {private static final Logger logger = LogManager.getLogger(PushOrderServiceImpl.class);@PostConstructpublic void init() {int cpuCount = Runtime.getRuntime().availableProcessors();System.out.println("start RedisOrderProcess > cpus=" + cpuCount);//调试时设置falseif(!SysParamApi.is_debug){logger.info("=========================== start rev order -> "+isRun);processOrderImport(cpuCount);}else{logger.info("xxxxxxxxxxxxxxxxxx start rev order -> Fail");}}boolean isRun=true;
}

上面的代码在IDEA调试器执行时,确实是加载 @Configuration 执行打印是否调试模式这行 后加载@Service并执行init()方法,此时拿到SysParamApi.is_debug值 是注入后的值 。这也是大家认可。

在正式服务器发布后就翻车了,在不改上面任何代码及配置的情况下,执行的效果是:

第一次执行时:

发现先加载执行 @Service  ->  @Service ->   @Configuration

第二次执行时:

发现先加载执行@Service  -> @Configuration  -> @Service 

由于是正式服务器不能尝试多次,上面两次验证加载是随机的。

解决加载参数需要用到@PostConstruct注解,再修改代码如下:

@Service
public class PushOrderServiceImpl {private static final Logger logger = LogManager.getLogger(PushOrderServiceImpl.class);@Value("${sys-param.sys.is_debug}")public  void setIs_debug(String is_debug) {SysParamApi.is_debug = "Y".equals(is_debug);System.out.println("是否调试模式:"+SysParamApi.is_debug);}@PostConstructpublic void init() {int cpuCount = Runtime.getRuntime().availableProcessors();System.out.println("start RedisOrderProcess > cpus=" + cpuCount);//调试时设置falseif(!SysParamApi.is_debug){logger.info("=========================== start rev order -> "+isRun);processOrderImport(cpuCount);}else{logger.info("xxxxxxxxxxxxxxxxxx start rev order -> Fail");}}boolean isRun=true;
}

说明:@PostConstruct注解的作用是本类加载完所有的参数(包含了流入参数),再执行。

生产环境测试验证:

上面测试生产环境参数:

操作系统:CentOS Linux release 8.1.1911 

jdk环境:

openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/444777.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel没有内置统计字数功能,但可以用一些变通的方法

是否需要计算Excel工作簿中某个单元格或单元格范围内的单词数? 出于多种原因,你可能需要计算文本数据中的字数。也许你有逗号分隔的列表,需要计算每个列表中的项目数。 不幸的是,Excel没有内置的单词计数方法。但是有一些聪明的方法可以得到你需要的结果。 这篇文章将向…

代码随想录算法训练营第二十天|669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树,总结篇

系列文章目录 代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

【深入浅出SpringCloud原理及实战】「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制

针对于限流熔断组件Hystrix的回退降级实现方案和机制 依赖隔离依赖隔离之线程&线程池高延迟请求的例子 线程池的优势线程池的弊端线程池的开销线程池开销 信号量 依赖隔离 Hystrix通过使用『舱壁模式』(注:将船的底部划分成一个个的舱室,…

2024年2月3日(星期六)骑行卧龙古渔村

2024年2月3日 (星期六) 骑行卧龙古渔村,早8:30到9:00, 大观公园门囗集合,9:30准时出发【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点:大观公园门囗集合 ,家住东,南,北的骑友…

少儿编程教育市场分析:行业规模有望在2025年达到约500亿元

少儿编程教育是通过编程游戏启蒙、可视化图形编程等课程,培养学生的计算思维和创新解难能力的课程。与成人的编程不同,少儿编程教育并非高等教育那样学习如何写代码、编制应用程序,而是通过编程游戏启蒙、可视化图形编程等课程,培…

MySQL基础(三)-学习笔记

一.innodb引擎: 1). 表空间:表空间是InnoDB存储引擎逻辑结构的最高层,启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个…

SpringBoot实战(二十六)集成SFTP

目录 一、SFTP简介二、SpringBoot 集成2.1 Maven 依赖2.2 application.yml 配置2.3 DemoController.java 接口2.4 SftpService.java2.5 DemoServiceImpl.java 实现类2.6 SftpUtils.java 工具类2.7 执行结果1)上传文件2)下载文件3)重命名文件&…

Kotlin 协程1:深入理解withContext

Kotlin 协程1:深入理解withContext 引言 在现代编程中,异步编程已经变得非常重要。在 Kotlin 中,协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中,我们将深入探讨 Kotlin 协程中的一个重要函数:wi…

物联网可视化平台:赋能企业数字化转型

在数字化转型的大潮中,企业面临着如何更好地理解和利用海量数据的挑战。物联网技术的快速发展,为企业提供了一个全新的视角和解决方案。通过物联网可视化平台,企业能够实时监控、分析和展示物联网数据,从而加速数字化转型的进程。…

RabbitMQ 死信队列应用

1. 概念 死信队列(Dead Letter Queue)是在消息队列系统中的一种特殊队列,用于存储无法被消费的消息。消息可能会因为多种原因变成“死信”,例如消息过期、消息被拒绝、消息队列长度超过限制等。当消息变成“死信”时,…

《高性能MySQL》

文章目录 一、创建1. 磁盘1.1 页、扇区、寻道、寻址、硬盘性能 2. 行结构row_format2.1 Compact紧凑2.1.1 行溢出2.1.2 作用2.1.3 内容1-额外信息1、变长字段长度2、NULL值列表3、记录头信息 2.1.4 内容2-真实数据4、表中列的值5、transaction_id6、roll_point7、row_id 2.2 dy…

MD5算法:高效安全的数据完整性保障

摘要:在数字世界中,确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中,Message Digest Algorithm 5(MD5)算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点…