@RefreshScope 配置文件自动刷新

本文介绍如何在SpringBoot中实现配置文件的动态刷新,包括使用@RefreshScope和@Value注解,配置management.endpoints.web.exposure.include参数,以及通过发送POST请求到指定URL触发配置刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在类上加@RefreshScope注解。

2.引入配置@Value。

/**
 * @author 向振华
 * @date 2018/12/17 17:20
 */
@RefreshScope //配置文件自动刷新
@RestController
@RequestMapping("test")
public class TestController {

    @Value("${test.xzh}") //引入配置
    private String xzh;

    @RequestMapping("/test1")
    public String test1(){
        return xzh;
    }

}

3.配置文件

#配置
test.xzh=xiangzhenhua

#动态刷新配置 ---需要忽略权限拦截
management.security.enabled=false

4.git配置webhooks,也可手动发送POST请求 http://localhost:1003/refresh

 

 

PS:在Spring Boot升级到2.0.3.RELEASE后需新增配置

management.endpoints.web.exposure.include=refresh

 此时刷新配置文件url为:http://localhost:1003/actuator/refresh

### 关于 `@RefreshScope` 注解不刷新的问题及其解决方案 #### 1. 理解 `@RefreshScope` `@RefreshScope` 是 Spring Cloud 提供的一个重要注解,旨在处理配置文件更新后的自动重载问题。通常情况下,在微服务架构中,当外部配置中心(如 Spring Cloud Config Server)中的属性发生变更时,期望这些变化能够被应用程序立即感知并应用。然而,默认情况下,Spring 容器内的 Bean 实例一旦创建就不会再改变其内部状态,除非手动重启服务。 为了实现无需重启即可使新的配置生效的功能,可以在需要动态加载最新配置的类上标注此注解[^1]。 ```java @RestController @RequestMapping("/config") @RefreshScope public class MyController { @Value("${my.property}") private String myProperty; @GetMapping("/getProp") public ResponseEntity<String> getProperty(){ return new ResponseEntity<>(this.myProperty, HttpStatus.OK); } } ``` #### 2. 常见原因分析 如果发现 `@RefreshScope` 并未按预期工作,则可能是由于以下几个方面的原因: - **依赖缺失**:确保项目已经引入了必要的依赖项来支持该特性。 - **端点启用**:确认 `/actuator/refresh` 或者其他相关管理端点已被激活,并可通过 HTTP 请求触发配置刷新操作。 - **作用范围错误**:注意 `@RefreshScope` 只适用于那些由 Spring 创建并通过上下文获取的对象实例;对于静态字段或方法内直接初始化的对象不起效。 - **版本兼容性**:不同版本之间可能存在行为差异,特别是从较旧版本升级到新版本时需要注意API的变化以及可能存在的Bug修复情况。 针对特定版本 (例如 Spring Boot 版本 2.3.4),有报告指出某些场景下 `@RefreshScope` 在控制器层面上表现不佳。一种推荐的做法是在单独的服务组件而非控制层使用这个注解[^2]。 #### 3. 推荐实践案例 考虑到上述提到的一些潜在陷阱,下面给出了一种改进模式——即把实际业务逻辑封装在一个带有 `@RefreshScope` 的服务类里,而让 Controller 负责接收请求并将调用转发给相应的 Service 方法执行具体任务。 ```java @Service @RefreshScope class DynamicConfigService { @Value("${env}") private String environment; // Other properties and methods... } @Controller class ApplicationConfigController { final DynamicConfigService dynamicConfigService; public ApplicationConfigController(DynamicConfigService service){ this.dynamicConfigService = service; } @RequestMapping(value="/getConfig", method=RequestMethod.GET) public String getConfig(){ return "Environment is set to : "+dynamicConfigService.getEnvironment(); } } ``` 这样做的好处是可以更好地分离关注点,同时也提高了代码可维护性和测试友好度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值