spring boot的配置文件属性注入到类的静态属性

       假设我们有一个名为some.property的属性,它在Spring配置文件中定义了值,例如application.properties或application.yml。

1. 非静态字段

为什么推荐?

  • 简单直接:不需要额外的配置或复杂的逻辑。
  • 符合Spring的设计理念:依赖注入(DI)是Spring的核心特性之一,使用非静态字段可以充分利用这一特性。
  • 更好的测试性:非静态成员使得单元测试更容易编写和维护,因为它们不会影响其他测试用例的状态。

代码示例:

@Component
public class MyComponent {@Value("${some.property}")private String name;// 使用name字段...public void printName() {System.out.println("Non-static field: " + name);}
}

注意:

  • 如果你需要共享状态,考虑使用Spring的@Scope("singleton")(默认),而不是静态字段。
  • 对于多线程环境,请确保你的bean是线程安全的,或者设计为无状态的。

2. 使用@PostConstruct方法

       如果你确实需要静态字段,可以先将其声明为非静态字段,然后使用@PostConstruct注解的方法,在bean初始化完成后手动设置静态字段的值。

代码示例:

@Component
public class MyComponent {@Value("${some.property}")private String instanceName;public static String name;@PostConstructpublic void init() {name = this.instanceName;}
}

注意:

  • @PostConstruct标记的方法将在所有依赖项被解析之后调用,但在任何代理创建之前。
  • 如果有多个组件都尝试设置同一个静态字段,可能会导致竞态条件。因此,应尽量避免这种情况。

3. 实现ApplicationContextAware接口

       通过实现ApplicationContextAware接口,可以在类加载后访问Spring的应用上下文,并从中获取属性值来设置静态字段。

优点:

  • 可以访问整个应用程序上下文,不仅限于属性文件中的值。
  • 适用于需要在整个应用启动过程中执行某些操作的情况。

代码示例:

@Component
public class MyComponent implements ApplicationContextAware {public static String name;private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.context = applicationContext;name = context.getEnvironment().getProperty("some.property");}// ...其他方法
}

注意:

  • 实现ApplicationContextAware接口意味着类将紧密耦合到Spring框架,这可能会影响代码的可移植性和测试性。
  • 应该谨慎使用这种方式,因为它可能增加系统的复杂度。

4. 使用@Configuration@Bean

        你可以创建一个配置类,其中包含一个@Bean方法用于初始化静态字段。这个方法将在Spring容器启动时执行。

代码示例:

@Configuration
public class Config {@Value("${some.property}")private String name;@Beanpublic static PropertyConfigurer propertyConfigurer() {return new PropertyConfigurer(name);}public static class PropertyConfigurer {public PropertyConfigurer(String name) {MyComponent.name = name;}}
}@Component
public class MyComponent {public static String name; // 将由PropertyConfigurer设置
}

注意:

  • @Bean方法必须是静态的,这样才能在Spring容器尚未完全初始化的情况下执行。
  • 这种方式适合用于配置阶段的一次性初始化任务,但不适合频繁更新的场景。

5. 自定义ApplicationListener

       监听ApplicationReadyEvent事件,可以在应用完全准备好之后再进行静态字段的设置。这确保了所有的bean都已经初始化完毕。

优点:

  • 确保所有bean都已经初始化完毕后再进行静态字段的设置。
  • 不会干扰其他bean的初始化过程。

代码示例:

@Component
public class StaticFieldInitializer implements ApplicationListener<ApplicationReadyEvent> {@Autowiredprivate Environment env;@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {MyComponent.name = env.getProperty("some.property");}
}@Component
public class MyComponent {public static String name; // 将由StaticFieldInitializer设置
}

注意:

  • ApplicationListener监听的是事件驱动模型的一部分,这意味着它会在特定事件发生时自动触发。
  • 由于是在应用完全准备好之后才设置静态字段,所以要确保在使用这个静态字段之前应用已经启动完成。

总结与建议

  • 优先考虑非静态字段:除非你有非常明确的需求,否则应该优先考虑使用非静态字段,这样可以保持代码的简洁性和良好的测试性。
  • 避免过度使用静态字段:静态字段会导致状态共享,从而增加了程序的复杂度和潜在的并发问题。如果必须使用静态字段,请确保对其正确同步或限制访问。
  • 遵循最小权限原则:只赋予必要的权限,不要让过多的组件依赖于静态字段,以减少耦合度。
  • 考虑性能影响:静态字段通常在整个应用生命周期中都存在,因此要考虑它们对内存占用的影响,尤其是在高并发环境中。

       选择哪种方式取决于你的具体需求和架构设计。如果你只是想让某个bean中的属性能够被所有实例共享,那么通常不需要使用静态字段;相反,应该考虑使用单例模式(默认的Spring bean作用域)。如果确实需要静态字段,那么上述提供的几种解决方案都可以满足需求。

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

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

相关文章

Vue3+@antv/g2plot 生成词云图

antv/g2plot 是一个基于 AntV 的图表库属于antv库的一部分 用于快速创建各种类型的图表 支持折线图、柱状图、饼图、散点图等多种图表类型 antv/g2plot 属于antv库的一部分 g2plot是在g2基础上封装的 npm install antv/g2plot --save效果 所有值共享一个颜色并且每次刷新颜色随…

K线单边突破指标(附带源码)

编写需求&#xff1a; 今天我们来根据粉丝要求进行源码复现&#xff1a; 【请根据最近两根K线判断当下的行情做多&#xff0c;做空方向。用三个价格判断当前K线状态&#xff0c;最高价、最低价、收盘价都大于昨日对应价格&#xff0c;为上涨K线。用三个价格判断当前K线状态&a…

LabVIEW电机控制中的主动消抖

在LabVIEW电机控制系统中&#xff0c;抖动现象&#xff08;如控制信号波动或机械振动&#xff09;会影响系统的稳定性和精度。通过使用主动消抖算法&#xff0c;可以有效降低抖动&#xff0c;提高控制性能。本文将介绍几种主流的主动消抖算法&#xff0c;并结合具体应用案例进行…

【安全测试相关知识】

安全测试介绍 背景 在当前信息技术快速发展的背景下&#xff0c;网络安全问题日益严峻&#xff0c;数据泄露、黑客攻击、病毒传播等安全事件层出不穷&#xff0c;给个人、企业乃至国家带来严重威胁。所以安全测试已成为企业和国家关注的重心 作用 安全测试是确保软件系统安…

重温设计模式--工厂模式(简单、工厂、抽象)

文章目录 工厂模式定义工厂模式通常可以细分为以下几种类型1、简单工厂模式&#xff08;Simple Factory Pattern&#xff09;2、工厂方法模式&#xff08;Factory Method Pattern&#xff09;3、抽象工厂模式&#xff08;Abstract Factory Pattern) UML 图1、简单工厂模式UML2、…

SAP PP 后继物料触发条件

问题&#xff1a; 物料主数据 MRP4维护了后继物料&#xff0c;该物料库存为0&#xff0c;但是做生成订单时候&#xff0c;查看BOM没有显示未后续无力啊 原因 需要在生成订单中点击可用性检查&#xff0c;才能出发对库存校验&#xff0c;才能匹配到后继物料

联通光猫怎么自己改桥接模式?

环境&#xff1a; 联通光猫 ZXHN F677V9 硬件版本号 V9.0 软件版本号 V9.0.0P1T3 问题描述&#xff1a; 联通光猫怎么自己改桥接模式 家里用的是ZXHN F677V9 光猫&#xff0c;最近又搞了个软路由&#xff0c;想改桥接模式 解决方案&#xff1a; 1.拿到最新超级密码&…

商场消防电气控制系统设计(论文+源码)

1系统的功能及方案设计 如图2.1所示为本次设计的整体框图&#xff0c;其中单片机部分采用ST89C52来负责协调各个模块&#xff1b;液晶选择LCD1602液晶屏来显示信息;温度传感器选择PT1000进行温度的检测&#xff1b;烟雾传检测选择MQ2烟雾传感器&#xff1b;CO2检测选择CCS811模…

Springboot3声明式客户端

简介 Spring Framework 6 和 Spring Boot 3 引入了一些新的特性和改进&#xff0c;以简化 HTTP API 的消费。它允许开发者通过声明式接口来定义对外部 HTTP API 的调用。其中开发者只需要定义接口和方法签名&#xff0c;而具体的实现细节由框架自动生成。 这个特性通常被称为…

信贷域——互联网金融体系

摘要 本文介绍了互联网金融的概念、特征、发展阶段和生态。互联网金融是互联网与金融结合的新兴模式&#xff0c;以大数据、云计算为基础&#xff0c;实现资金融通和支付。发展经历了技术支持、业务领域深入到金融业务领域三个阶段。互联网金融生态包括互联网支付、P2P网络借贷…

精通Redis

目录 1.NoSQL 非关系型数据库 2.Redis 3.Redis的java客户端 4.Jedis 4.1Jedis快速入门 4.2Jedis连接池及使用 5.SpringDataRedis和RedisTemplate 6.SpringDataRedis快速入门 7.RedisSerializer 1.NoSQL 非关系型数据库 基础篇-02.初始Redis-认识NoSQL_哔哩哔哩_bilib…

LabVIEW水泵性能测试系统

在现代工业应用中&#xff0c;水泵作为一种广泛使用的流体输送设备&#xff0c;其性能的可靠性对整个生产系统的稳定运行至关重要。通过LabVIEW软件配合专业硬件设备&#xff0c;设计了一套水泵性能测试系统&#xff0c;实现对各类水泵的综合性能测试与分析&#xff0c;提升水泵…

2.利用docker进行gitlab服务器迁移

一、Docker安装 安装Ubuntu 22.04.3 LTS \n \l 1、旧版本安装包清理 sudo apt-get remove docker docker-engine docker.io containerd runc当你卸载Docker时&#xff0c;存储在/var/lib/docker/中的图像、容器、卷和网络不会自动删除。如果你想从一个干净的安装开始&#x…

无人零售 4G 工业无线路由器赋能自助贩卖机高效运营

工业4G路由器为运营商赋予 “千里眼”&#xff0c;实现对贩卖机销售、库存、设备状态的远程精准监控&#xff0c;便于及时补货与维护&#xff1b;凭借强大的数据实时传输&#xff0c;助力深度洞察销售趋势、优化库存、挖掘商机&#xff1b;还能远程升级、保障交易安全、快速处理…

zabbix监控山石系列Hillstone监控模版(适用于zabbix7及以上)

监控项&#xff1a; 触发器&#xff1a; 监控数据如下&#xff1a;

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo 前言摘要引言Task 相关工作方法SDM-UniPS预处理尺度不变的空间光特征编码器像素采样变压器的非局部交互 PS-Mix数据集 实验结果训练细节评估和时间&#xff1a; 消融实验定向照明下的评估没有对…

【MySQL】7.0 入门学习(七)——MySQL基本指令:帮助、清除输入、查询等

1.0 help &#xff1f; 帮助指令&#xff0c;查询某个指令的解释、用法、说明等。详情参考博文&#xff1a; 【数据库】6.0 MySQL入门学习&#xff08;六&#xff09;——MySQL启动与停止、官方手册、文档查询 https://www.cnblogs.com/xiaofu007/p/10301005.html 2.0 在cmd命…

低代码开源项目Joget的研究——基本概念和应用

大纲 1. 基本概念1.1 Form1.1.1 Form1.1.1.1 概述1.1.1.2 主要特点和用途1.1.1.3 创建和使用 Form1.1.1.4 示例 1.1.2 Section1.1.2.1 概述1.1.2.2 主要特点和用途1.1.2.3 示例 1.1.3 Column1.1.4 Field1.1.5 示例 1.2 Datalist1.2.1 Datalist1.2.1.1 主要特点和用途1.2.1.2 创…

单机游戏《野狗子》游戏运行时提示dbghelp.dll缺失是什么原因?dbghelp.dll缺失要怎么解决?

《野狗子》游戏运行时提示dbghelp.dll缺失&#xff1a;原因与解决方案 在畅游《野狗子》这款引人入胜的游戏世界时&#xff0c;突然遭遇“dbghelp.dll缺失”的错误提示&#xff0c;无疑会给玩家的探险之旅蒙上一层阴影。作为一名深耕软件开发领域的从业者&#xff0c;我深知此…

Marscode AI辅助编程

直接使用Marscode的云服务来开发&#xff0c;也是很方便的&#xff0c;不用担心配置环境的问题&#xff0c;很适合初步学习&#xff0c;在任何设备都能开发。 番茄钟 请你基于html、tailwind css和javascript&#xff0c;帮我设计一个“番茄时钟”。要求UI简洁美观大方&#x…