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

@Value和@ConfigurationProperties使用

  • 一、@Value
    • 1、nacos配置
    • 2、XxlJobConfig
  • 二、@ConfigurationProperties

这里以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

使用Spring的@Value和@ConfigurationProperties从Nacos或yml中获取值并自动刷新_第1张图片
使用Spring的@Value和@ConfigurationProperties从Nacos或yml中获取值并自动刷新_第2张图片

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.csdn.net/chuixue24/article/details/107386045
https://www.cnblogs.com/weihuang6620/p/13723219.html
https://www.jianshu.com/p/dbf3933aecb3

你可能感兴趣的:(SpringCloud,spring,java,spring,boot,spring,cloud)