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

news2024/12/26 10:34:31

很多资料都说@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)


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯日记】复盘篇三——循环结构

前言 本篇内容是对循环结构进行复盘的,循环可谓是在基础阶段特别重要的东西,是三大结构(顺序结构、选择结构、循环结构)中最重要的结构之一。 目录 🍑1.找最小值 分析: 知识点: 代码如下 &…

【C/Python】Gtk部件ListStore的使用

一、C语言 在GTK中,Gtk.ListStore是一个实现了Gtk.TreeModel接口的存储模型,用于在如Gtk.TreeView这样的控件中存储数据。以下是一个简单的使用Gtk.ListStore的C语言示例,该示例创建了一个列表,并在图形界面中显示: …

PostGIS教程学习二十二:使用触发器追踪历史编辑操作

PostGIS教程学习二十二:使用触发器追踪历史编辑操作 生产环境下数据库的一个常见要求是能够跟踪用户编辑数据的历史:数据在两个日期之间是如何变化的,是谁操作的,以及它们哪些内容变化了?一些GIS系统通过在客户端接口…

单片机学习笔记--- 定时器/计数器(简述版!)

目录 定时器的介绍 定时计数器的定时原理 定时计数器的内部结构 两种控制寄存器 (1)工作方式寄存器TMOD (2)控制寄存器TCON 定时计数器的工作方式 方式0 方式1 方式2 方式3 定时器的配置步骤 第一步,对…

go语言socket编程

1.互联网分层模型 过程分析: 2.Socket图解 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数&a…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程:https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

【Oracle云】使用 boto3 访问 OCI 对象存储 (AWS S3协议兼容)

在现代云计算环境中,S3(Simple Storage Service)协议已经成为云对象存储的事实标准。它提供了简单、可扩展、高度耐用的存储解决方案,得到了广泛应用。Oracle Cloud Infrastructure(OCI)秉承着开放性和灵活…

ArcGIS Pro字段编号相关代码

字段属于SHP文件的重要组成部分,在某些时候需要对字段进行编号,这里为大家介绍一下字段编号相关的代码,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据,除了POI数据,常见的GIS数据都可…

zookeeper(2) 服务器动态上下线监听和分布式锁案例

案例一:服务器动态上下线监听 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知 到主节点服务器的上下线。 1.服务端代码 package com.atguigu.case1;import org.apache.zookeeper.*;import java.io…

【大厂AI课学习笔记】1.3 人工智能产业发展(3)

1.3.1 供给侧 技术层面:从实验室走向大规模的商用。 数据层面:数据正式成为重要的生产要素。 市场:供需互促的正向市场环境建立。 资本:走出炒作泡沫,聚焦价值领域。 平台:大厂普遍开放生态。 MORE&am…

Java:搭建eladmin复习mvn、springboot、vue等

目录 1.源码平台后端: 2.源码平台前端: 3.操作系统:centos7.9 4.mysql:5.7.x 安装 5.redis:5.0.X 6.maven:3.8 7.java:1.8: 8.nodejs:16.x 9.通过mvn打包eladmin后端 10.npm打包前端项目进行部署 11.访问测试…

【GEE】基于GEE批量下载Landsat8 L2A数据(整幅)

之前发过一篇使用GEE下载Landsat8的文章,然后有很多小伙伴私信我各种问题,如L1C、L2数据代码怎么修改,如何镶嵌,如何去云、 如何裁剪等一系列问题。正好快过年了,手头的事也没有多少了,所以这两天整理了一下…

ElementUI Form:InputNumber 计数器

ElementUI安装与使用指南 InputNumber 计数器 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue &#xff08;InputNumber 计数器&#xff09;页面效果图 项目里el-input-number.vue代码 <script> export default {name: el_input_number,data() {re…

Log4j2-29-log4j2 discard policy 极端情况下的丢弃策略 同步+异步配置的例子

Log4j2异步日志、同步日志和混合日志的配置详解 Log4j 2中记录日志的方式有同步日志和异步日志两种方式&#xff0c;其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。 异步日志(性能最好&#xff0c;推荐使用) 异步日志情况下&#xff0c;增加 Disruptor …

如何用JAVA代码将视频号视频下载到本地

1、目前只掌握了&#xff0c;下载自己视频号后台的视频的方法&#xff1a; 登录视频号助手网页-点开视频-复制链接-&#xff08;I/O&#xff09;下载 代码如下&#xff1a; String videoUrl "xxx";String savePath "D:\\videoDownload\\video.mp4";tr…

实战Vue.js与MySQL:爱心商城项目开发指南

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

win10查看Nvidia显卡、cuda版本

通过cmd命令行查看 打开cmd命令行窗口&#xff0c;在命令行输入&#xff1a; nvidia-smi 即可看到相应的显卡信息&#xff0c;以及显卡支持的cuda版本。 如下图所示&#xff0c;可以看到显卡是"GeForce CTX 1650"&#xff0c;cuda版本是11.7

日本大带宽服务器速度和性能评测的关系

在互联网的快速发展中&#xff0c;大带宽服务器在提供高速、稳定的数据传输方面起着至关重要的作用。特别是在日本&#xff0c;由于其先进的网络基础设施和庞大的互联网用户群体&#xff0c;大带宽服务器的需求日益增长。那么&#xff0c;日本大带宽服务器的速度和性能评测有何…

山西电力市场日前价格预测【2024-02-01】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-01&#xff09;山西电力市场全天平均日前电价为455.34元/MWh。其中&#xff0c;最高日前电价为687.90元/MWh&#xff0c;预计出现在18:30。最低日前电价为364.84元/MWh&#xff0c;预计…

【Java程序设计】【C00200】基于(JavaWeb+SSM)的在线网课管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的在线网课管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的在线网课管理系统 本系统分为管理员、教师、学生以及前台系统4个功能模块。 管理员&#xff1a;管理员进入主…