对比@ConfigurationProperties和@Value在动态配置刷新中的差异,以及@RefreshScope对 Bean 生命周期的影响
package com.liftsail.system.nacostest;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* @Author: liftSail
* @Date: 2024/11/20 11:31
* @Description: 不积跬步无以至千里
*/
@RestController
@RefreshScope // 懒加载刷新(重新实例化bean) @RefreshScope优先级大于@ConfigurationProperties
@ConfigurationProperties(prefix = "nacosconfigtest") // 无需搭配@RefreshScope也可实现刷新,需setter与getter方法,即时刷新(不会重新实例化bean)
public class NacosConfigTest implements InitializingBean {
public NacosConfigTest() {
System.out.println("NacosConfigTest构造方法被执行了");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("NacosConfigTest-afterPropertiesSet方法被执行了-refreshString:" + refreshString + "-" + refreshStringValue);
}
// @Value("${NacosConfigTest.refreshString:reject}")
private String refreshString;
// 必须搭配@RefreshScope实现字段刷新,无需setter与getter方法
@Value("${nacosconfigtest.refreshString:reject}")
private String refreshStringValue;
@Resource
private DataSource dataSource;
@GetMapping("/my-property")
public String getProperty() {
System.out.println(refreshString);
Class<? extends DataSource> aClass = dataSource.getClass();
return refreshString + "-" + refreshStringValue;
}
// public String getRefreshString() {
// return refreshString;
// }
//
// public void setRefreshString(String refreshString) {
// this.refreshString = refreshString;
// }
}
1. 类注解与作用
@RestController @RefreshScope @ConfigurationProperties(prefix = "nacosconfigtest") public class NacosConfigTest implements InitializingBean { ... }
2. 构造方法与初始化方法
public NacosConfigTest() { System.out.println("NacosConfigTest构造方法被执行了"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("NacosConfigTest-afterPropertiesSet方法被执行了-refreshString:" + refreshString + "-" + refreshStringValue); }
3. 属性与配置绑定
// 方式1:@ConfigurationProperties绑定(需setter/getter,注释中已说明) private String refreshString; // 方式2:@Value注解注入 @Value("${nacosconfigtest.refreshString:reject}") private String refreshStringValue; @Resource private DataSource dataSource;
4. 接口方法
5. 代码注释解析与验证点
测试场景建议
注意事项:
nacos配置中心共享配置默认配置不会触发推送
this.refresh = false;
spring:
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
# 命名空间
namespace: *********
group: *********
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 命名空间
namespace: *********
group: *********
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- dataId: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
group: DEFAULT_GROUP
refresh: true # 此配置决定nacos共享配置文件改变后是否触发推送

浙公网安备 33010602011771号