使用Spring的@Value和@ConfigurationProperties从Nacos或yml中获取值并自动刷新

本文详细介绍了在Spring Boot项目中如何使用Nacos配置以及@Value注解从配置文件中读取参数,特别以XxlJobConfig为例展示了如何配置和初始化XxlJob。同时,讨论了@RefreshScope注解的使用场景和注意事项。另外,讲解了@ConfigurationProperties注解的作用,它适用于绑定具有相同前缀的配置属性到JavaBean,并提供了实例展示。


这里以service项目调用xxl-job为例进行说明

一、@Value

1、nacos配置

server:
  port: 32031
spring:
  application:
    name: t1
  profiles:
    active: local
  cloud:
    nacos:
      config:
        prefix: t1
        group: test
        namespace: zsf
        file-extension: properties
      server-addr: nacos1.test:8848,nacos2.test:8848,nacos3.test:8848
    loadbalancer:
      ribbon:
        enabled: false

在这里插入图片描述
在这里插入图片描述

2、XxlJobConfig

@Slf4j
@ComponentScan(basePackages = "*.xxljob")
@Configuration
@RefreshScope  //动态刷新
public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.executor.appname}")
    private String appName;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppName(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }

}

1.@Value给静态变量赋值,不能直接写在变量上,应该放在变量的set()方法上,且该方法不能被static修饰。其中需要在类上加入@Component注解。

2.通过@Value(“${xxxx}”)

可以获取属性文件中对应的值,但是如果属性文件中没有这个属性,则会报错。可以通过赋予默认值解决这个问题,如@Value(“${xxxx:yyyy}”)
比如

    @Value("${zsf.common.thread.corePoolSize:16}")
	private int corePoolSize;

	@Value("${zsf.common.thread.maxPoolSize:100}")
	private int maxPoolSize;

3.@RefreshScope注解能帮助我们做局部的参数刷新,但侵入性较强,需要开发阶段提前预知可能的刷新点,并且该注解底层是依赖于cglib进行代理的,所以不要掉入cglib的坑,出现刷了也不更新情况;

二、@ConfigurationProperties

@ConfigurationProperties和@Value注解用于获取配置文件中的属性定义并绑定到Java Bean或属性中

@ConfigurationProperties最适用于所有具有相同前缀的分层属性,用于将配置文件中mail开头的属性绑定到POJO中,@Configuration也可以替换成@Component、@Service等其他注解。

Spring 使用一些宽松的规则来绑定属性。因此,以下变体都绑定到属性hostName:
mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOST_NAME
nacos配置
在这里插入图片描述
或者bootstrap.yml

cms:
  data:
    url:
      userGroupUrl: http://aaa.bbb.ccc:32148/api/crowd-portrait/crowd-pack
      userDetailUrl: http://aaa.bbb.ccc:32148/api/crowd-portrait/crowd

代码中使用方式:

@Data
@Configuration
@ConfigurationProperties(prefix="cms.data.url")
public class DataSyncUrlProperties {
    private String userGroupUrl;
    private String userDetailUrl;
}   

参考文章
https://blog.youkuaiyun.com/chuixue24/article/details/107386045
https://www.cnblogs.com/weihuang6620/p/13723219.html
https://www.jianshu.com/p/dbf3933aecb3

Spring Boot项目中通过`@Value`注解注入Nacos配置中心的配置信息,需要结合Spring Cloud Alibaba的组件特定的配置方式。以下是实现的具体步骤: ### 3.1 添加依赖 首先,在项目的 `pom.xml` 文件中添加对 Nacos 配置中心的支持依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 该依赖用于从 Nacos 获取远程配置,将其作为 Spring 的 PropertySource 加载到上下文中[^1]。 --- ### 3.2 配置 Nacos 地址应用名 在 `bootstrap.yml`(不是 `application.yml`)中配置 Nacos 配置中心的地址以及当前应用的名称: ```yaml spring: application: name: gulimall-coupon cloud: nacos: config: server-addr: 127.0.0.1:8848 import: - nacos:gulimall-coupon.properties?refresh=true ``` 使用 `bootstrap.yml` 是为了确保在应用启动早期阶段就能加载 Nacos 配置,从而避免因配置未加载导致占位符解析失败的问题[^1]。 --- ### 3.3 在 Bean 中使用 @Value 注入配置 接下来可以在任意被 Spring 管理的类中使用 `@Value("${key}")` 来注入 Nacos 中定义的配置项: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class CouponService { @Value("${token.expiration}") private String tokenExpiration; public void printTokenExpiration() { System.out.println("Token expiration time: " + tokenExpiration); } } ``` 需要注意的是,如果使用高版本 Spring Cloud Alibaba(如 2021.x 更高),应避免在本地配置文件(如 `application.yml`)中定义与 Nacos 配置相同的 key,否则会优先使用本地配置[^1]。 --- ### 3.4 启用动态刷新功能 为了让配置在 Nacos 更新后能够自动生效,需在对应的 Bean 上添加 `@RefreshScope` 注解: ```java import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; @Component @RefreshScope public class CouponService { @Value("${token.expiration}") private String tokenExpiration; public void printTokenExpiration() { System.out.println("Token expiration time: " + tokenExpiration); } } ``` 只有加上 `@RefreshScope`,当 Nacos 配置发生变更时,该 Bean 的属性才会重新注入新的[^1]。 --- ### 3.5 注意事项 - **不要在本地配置文件中重复定义 Nacos 配置项**:高版本 Spring Cloud Alibaba 中,若本地配置文件中有相同 key,则会覆盖 Nacos 中的。 - **配置命名建议与 DataId 一致**:例如 `gulimall-coupon.properties` 应包含对应应用名的配置,便于维护。 - **确保 Nacos 服务正常运行**:检查 Nacos Server 是否启动,DataId Group 是否正确,且配置内容已发布。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值