高级开发!自定义@Value实时刷新最新配置

文摘   2024-11-20 08:02   新疆  

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:SpringBoot3.2.5



1. 简介

@Value 是 Spring 中非常实用的一个注解,用于将配置文件中的属性值注入到 Bean 的字段中。它可以从多种来源读取值,包括属性文件、环境变量和系统属性等。使用 @Value 注解可以简化配置值的注入过程,使代码更加清晰和易于维护。该注解具有以下特定:

  • 属性注入:可以直接将配置文件中的属性值注入到 Bean 的字段中

  • 类型转换:支Spring内置了很多的类型转换器,可以自动将字符串配置转换为字段的类型,例如字符串可以自动转换为整数或布尔值。你也可以自定义类型转换器进行任意类型的转换。

  • 默认值:可以为属性提供默认值,防止配置缺失时导致的空指针异常或是启动报错问题。

  • 表达式支持:支持 SpEL表达式,可以进行复杂的属性值解析。

     

以下是常见的一些用法:

// 字段注入@Value("${pack.app.title}")private String title ;// 方法参数注入public PackComponent pc(@Value("pack.app.author") String author) {  // ...}// 默认值@Value("pack.app.sno:0")private Integer sno ;// SpEL表达式@Value("#{systemProperties['user.catalog'] + 'Catalog' }")private String catalog

通常情况下,以上的用法已经完全能应付我们工作中的各种需要了。

@Value有一个重要的局限性:一次性注入。这意味着在 Bean 初始化时,@Value 注解会读取配置文件中的值并注入到字段中,但一旦 Bean 初始化完成,这些值就不会再自动更新。即使配置文件中的值发生变化,注入的值也不会随之改变。

要实现这种自动刷新功能,我之前写过一篇文章大家可以查看下面这篇文章:

两种方式实现SpringBoot外部配置实时刷新最佳实践

但是,本篇文章将要教大家如何通过自定义@Value注解,实现配置的实时刷新功能。

2. 实战案例

2.1 自定义元数据

@Target({  ElementType.FIELD,   ElementType.METHOD,   ElementType.PARAMETER,   ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface PackValue {
String value() ;}

读取配置都将通过@PackValue进行。

2.2 自定义处理器BeanPostProcessor

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章