前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring cloud 自定义配置源及配置刷新

spring cloud 自定义配置源及配置刷新

作者头像
acupt
发布2019-08-26 15:05:51
6810
发布2019-08-26 15:05:51
举报
文章被收录于专栏:一杯82年的JAVA一杯82年的JAVA

通过自定义配置源可以接入自己的配置服务,配合ContextRefresher可以让应用运行中自动更新配置。

实现PropertySourceLocator

代码语言:javascript
复制
/**
 * 自定义配置源
 */
public class MyPropertySourceLocator implements PropertySourceLocator {

    @Override
    public PropertySource<?> locate(Environment environment) {
        String msg = new SimpleDateFormat("HH:mm:ss").format(new Date());

        Map<String, Object> map = new HashMap<>();
        map.put("demo.diy.msg", msg);
        System.err.println("MyPropertySourceLocator, demo.diy.msg = " + msg);

        //spring自带的一个简单的map结构配置集合,也可以继承PropertySource自定义
        MapPropertySource source = new MapPropertySource("my-source", map);
        return source;
    }
}

配置类

代码语言:javascript
复制
@Configuration
public class MyConfigBootstrapConfiguration {

    @Bean
    public MyPropertySourceLocator myPropertySourceLocator() {
        return new MyPropertySourceLocator();
    }

}

用Java代码声明bean,还需要在resources/META-INF/spring.factories中声明

代码语言:javascript
复制
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.netease.ag.demoweb.MyConfigBootstrapConfiguration

Spring中类似与Java SPI的加载机制。它在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。这种自定义的SPI机制是Spring Boot Starter实现的基础。

使用自定义配置

代码语言:javascript
复制
@RefreshScope //可更新
@Component
@Data
public class ValueConfig {

    @Value("${demo.copy.msg}")
    private String copyMsg;

    @Value("${demo.diy.msg}")
    private String diyMsg;

    public ValueConfig() {
        System.err.println("ValueConfig init");
    }
}

application.properties中可以引用自定义配置

代码语言:javascript
复制
demo.copy.msg=${demo.diy.msg}

springboot应用启动

代码语言:javascript
复制
@SpringBootApplication
@RestController
public class DemowebApplication {

    @Resource
    private ValueConfig valueConfig;

    @Resource
    private ContextRefresher contextRefresher;

    public DemowebApplication() {
        System.err.println("DemowebApplication init");
    }

    public static void main(String[] args) {
        SpringApplication.run(DemowebApplication.class, args);
    }

    @RequestMapping("/t")
    public String t() {
        return valueConfig.toString();
    }

    //更新bean属性
    @RequestMapping("/r")
    public Object r() {
        return contextRefresher.refresh();
    }

启动日志

代码语言:javascript
复制
.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.2.RELEASE)

MyPropertySourceLocator, demo.diy.msg = 17:18:22
...
DemowebApplication init
...
ValueConfig init
...Tomcat started on port(s): 8080 (http)

查询,多次请求返回一致

请求:http://localhost:8080/t 响应:ValueConfig(copyMsg=17:18:22, diyMsg=17:18:22)

更新

请求:http://localhost:8080/r 响应:["demo.diy.msg"]

日志输出:

代码语言:javascript
复制
MyPropertySourceLocator, demo.diy.msg = 17:27:44

再次调用查询接口,发现值改变,并且输出日志

代码语言:javascript
复制
ValueConfig init

证明更新字段实际是重新生成了一个bean。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一杯82年的JAVA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现PropertySourceLocator
  • 配置类
  • 使用自定义配置
  • springboot应用启动
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档