spring boot 配置动态刷新实现详解

网友投稿 334 2022-12-27


spring boot 配置动态刷新实现详解

本文测试使用的spring cloud版本为:

Dalston.SR1

很多朋友只知道spring cloud config可以刷新远程git的配置到内存中,

却不知道spring cloud config的客户端可以脱离服务端使用,

更不知道spring cloud config客户端结合actuator还可以刷新本地的配置文件到内存中。

具体做法如下:

1、pom:

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.liuyx

test-config-refresh

1.0-SNAPSHOT

org.springframework.boot

spring-boot-starter-parent

1.5.4.RELEASE

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-config

org.springframework.boot

spring-boot-starter-actuator</artifactId>

org.springframework.cloud

spring-cloud-dependencies

Dalston.SR1

pom

import

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.liuyx

test-config-refresh

1.0-SNAPSHOT

org.springframework.boot

spring-boot-starter-parent

1.5.4.RELEASE

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-config

org.springframework.boot

spring-boot-starter-actuator</artifactId>

org.springframework.cloud

spring-cloud-dependencies

Dalston.SR1

pom

import

单独引入 spring-boot-starter-actuator或者spring-cloud-starter-config(spring cloud config的客户端) 是不会暴露/refresh端点的,两者同时引入之后才能暴露/refresh端点。

2、一般使用spring-cloud-starter-config的文章都会让你在bootstrap里加上配置中心服务端的地址,这里我们要脱离配置中心服务端使用,所以这些配置完全不需要。

3、对需要刷新的属性使用@Value注解,同时将类使用@RefreshScope注解进行标记,示例如下:

package com.liuyx.test;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.context.config.annotation.RefreshScope;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication

@RestController

@RefreshScope

public class Main {

public static void main(String[] args) {

SpringApplication.run(Main.class);

}

private static int port;

@Value("${server.port}")

public void setPort(int port){

this.port=port;

}

@RequestMapping("/port")

public int port(){

return port;

}

}

这里我的变量是一个static变量,所以只能在非static的set方法上加@Value注解,而不是变量定义行的上方。如果不是静态变量则可以直接写作:

@Value("${server.port}")

private int port;

4、application.properties配置

server.port=80

local.test=hello1

management.security.enabled=false

5、测试

1、启动项目,访问 http://localhost/port 显示 80

2、修改classpath(注意是classpath,即你编译后的class文件所处的目录)下的application.properties将server.port改为801

3、发送空post(注意是post)请求到 http://localhost:80/refresh

4、再次访问 http://localhost/port 显示 801 测试成功

最后的补充:

即使结合配置中心服务端使用,该方法也是有效的,所有有效位置的有效配置文件(如git上的,jar内的,jar外的)都会被扫描,并根据一定的顺序进行覆盖


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:api测试工具php(api测试软件)
下一篇:学生成绩管理系统接口设计(学生成绩管理系统设计数据库)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~