关于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);


    //调试时设置false
    boolean isRun=true;
   

    @PostConstruct
    public 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);



    @PostConstruct
    public void init() {
        int cpuCount = Runtime.getRuntime().availableProcessors();
        System.out.println("start RedisOrderProcess > cpus=" + cpuCount);
        //调试时设置false
        if(!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);
    }


    @PostConstruct
    public void init() {
        int cpuCount = Runtime.getRuntime().availableProcessors();
        System.out.println("start RedisOrderProcess > cpus=" + cpuCount);
        //调试时设置false
        if(!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)


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言数据结构之二叉树

少年恃险若平地 独倚长剑凌清秋 🎥烟雨长虹,孤鹜齐飞的个人主页 🔥个人专栏 🎥前期回顾-栈和队列 期待小伙伴们的支持与关注!!! 目录 树的定义与判定 树的定义 树的判定 树的相关概念 树的运用…

字符串转换const char* , char*,QByteArray,QString,string相互转换,支持中文

文章目录 1.char * 与 const char * 的转换2.QByteArray 与 char* 的转换3.QString 与 QByteArray 的转换4.QString 与 string 的转换5.QString与const string 的转换6.QString 与 char* 的转换 在开发中,经常会遇到需要将数据类型进行转换的情况,下面依…

❤ 做一个自己的AI智能机器人吧

❤ 做一个自己的AI智能机器人 看了扣子(coze)的模型,字节基于chatgpt搭建的一个辅助生成AI的网站,感觉蛮有意思,看了掘金以后,于是动手自己也实现了一个。 官网 https://www.coze.cn/ 进入的网站 1、 创…

如何在Windows系统使用Plex部署影音服务与公网访问本地资源【内网穿透】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通…

如何发布自己的npm包:

1.创建一个打包组件或者库: 安装weback: 打开项目: 创建webpack.config.js,创建src目录 打包好了后发现两个js文件都被压缩了,我们想开发使用未压缩,生产使用压缩文件。 erserPlugin:(推荐使用…

什么是信创业态支持?支持信创的数据库防水坝哪家好?

随着国产化信创化的崛起,出现了很多新名词,例如信创业态支持、国产信创化等等。今天我们就来聊聊什么是信创业态支持?支持信创的数据库防水坝哪家好? 什么是信创业态支持? 大范围而言,信创业态支持可以理解…

多线程编程4——线程安全问题

一、线程之间是并发执行的,是抢占式随机调度的。 多个线程之间是并发执行的,是随机调度的。我们只能确保同一个线程中代码是按顺序从上到下执行的,无法知道不同线程中的代码谁先执行谁后执行。 比如下面这两个代码: 代码一&…

自定义一个线程安全的生产者-消费者模型(大厂java面试题)

生产者-消费者模型的核心思想是通过阻塞队列和线程的等待和通知机制实现生产者和消费者之间的协作,确保生产者不会向满队列中添加消息,消费者不会从空队列中获取消息,从而有效地解决了多线程间的同步问题。 需要实现两个方法。方法1向队列中…

Aigtek高压功率放大器主要功能是什么

高压功率放大器是一种用于将低电压信号放大到高电压水平的电子设备。它在许多领域中发挥着重要的作用,具有以下主要功能: 信号放大:高压功率放大器的主要功能之一是将低电压信号放大到高电压水平。它能够以较高的增益放大输入信号&#xff0c…

【云原生之kubernetes系列】--污点与容忍

污点与容忍 污点(taints):用于node节点排斥Pod调度,与亲和效果相反,即taint的node排斥Pod的创建容忍(toleration):用于Pod容忍Node节点的污点信息,即node节点有污点,也将新的pod创建…

​亚马逊测评礼品卡撸C采退如何搬砖?

亚马逊测评礼品卡搬砖、撸C是什么? 拿亚马逊礼品卡搬砖来讲,除了汇率差还有佣金。因为盈利的是美刀,因此比我们国内礼品卡的利润更多。比如亚马逊礼品卡,它的折损率比较低,很容易出手,所以是硬通货的存在。…

SD-WAN与MPLS没有取代之说,合适的才最重要

随着企业网络需求的不断增长和变化,SD-WAN(软件定义广域网)和MPLS(多协议标签交换)成为企业网络架构中备受关注的两种技术。然而,值得注意的是,并不存在SD-WAN完全取代MPLS或相反的情况。本文将…

SpringMVC实现对网页的访问,在请求控制器中创建处理请求的方法

目录 测试HelloWorld RequestMapping注解 RequestMapping注解的位置 RequestMapping注解的value属性 RequestMapping注解的method属性 SpringMVC支持路径中的占位符(重点) SpringMVC获取请求参数 1、通过ServletAPI获取 2、通过控制器方法的形参…

Git系列---标签管理

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.理解标签2.创建标签…

ThreadX_note:创建线程

ThreadX 创建线程 ThreadX 是一款实时操作系统 (RTOS),它提供了一套全面的 API,可以用于创建和管理线程。 创建线程 在 ThreadX 中,我们可以使用 tx_thread_create 函数来创建线程。 exam: #include "tx_api.h"/*…

Ansible自动化运维实战

一、abstract简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric) 的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.无客户端。我们要学一些Ansible的安装和一些基…

AI论文指南|ChatGPT在论文讨论部分能起到什么作用?

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼: AI论文指南|ChatGPT在论文讨论部分能起到什么作用? 讨论部分是一篇论文的精华所在,也是写作中最难的部分。讨论部分主要是将文章…

单例模式有几种写法?请谈谈你的理解?

为什么有单例模式? 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利…

coreldraw怎么添加箭头?

使用coreldraw的时候知道箭头在哪里添加吗?下面小编就给大家带来coreldraw箭头添加教程,有需要的小伙伴不要错过哦。 coreldraw添加箭头方法 1、首先选择桌面Coreldraw格式图片。 2、然后点击文件夹按钮打开文件。 3、最后点击上方工具横线&#xff0c…

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外,它还能够完成多种任务,如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用,而且免费的chatGPT网站,AI…