Spring的@Value如何从Nacos配置中心获取值并自动刷新

 更新时间:2022年7月8日 15:29  点击:407 作者:chuixue24

@Value从Nacos配置中心获取值并自动刷新

在使用Nacos作为配置中心时,除了@NacosValue可以做到自动刷新外,nacos-spring-context:0.3.4版本是支持@Value获取Nacos配置中心的值,并动态刷新的,该功能是Spri依靠ngValueAnnotationBeanPostProcessor类来实现:

@Override
    protected Tuple<String, NacosValueTarget> doWithAnnotation(String beanName,
            Object bean, Value annotation, int modifiers, Method method, Field field) {
        if (annotation != null) {
            if (Modifier.isStatic(modifiers)) {
                return Tuple.empty();
            }
 
            if (bean.getClass().isAnnotationPresent(NacosRefresh.class)) {
                String placeholder = resolvePlaceholder(annotation.value());
 
                if (placeholder == null) {
                    return Tuple.empty();
                }
 
                NacosValueTarget nacosValueTarget = new NacosValueTarget(bean, beanName,
                        method, field);
                nacosValueTarget.setAnnotationType(getAnnotationType().getSimpleName());
                logger.debug("@Value register auto refresh");
                return Tuple.of(placeholder, nacosValueTarget);
            }
        }
        return Tuple.empty();
    }

分析其源码可以看到,如果bean上有注解@NacosRefresh,则会自动刷新。

在实际使用时,发现bean上的注解是@Configuration则不会自动刷新,而使用@Component则可以做到自动刷新。

代码如下:

@NacosRefresh
//@Component
@Configuration
public class BeanTest {
    
    @Value("${autofresh.test}")
    private String testValue;
    
    @NacosValue(value="${autofresh.test2}",autoRefreshed = true)
    private String testValue2;
 
    /**
     * @return the testValue2
     */
    public String getTestValue2() {
        return testValue2;
    }
 
    /**
     * @param testValue2 the testValue2 to set
     */
    public void setTestValue2(String testValue2) {
        this.testValue2 = testValue2;
    }
 
    /**
     * @return the testValue
     */
    public String getTestValue() {
        return testValue;
    }
 
    /**
     * @param testValue the testValue to set
     */
    public void setTestValue(String testValue) {
        this.testValue = testValue;
    }
}

测试类:

@Test
     public void testValueRefreshinNacos() throws InterruptedException {
        System.out.println(beanTest.getTestValue());
        System.out.println(beanTest.getTestValue2()); 
        System.out.println("------修改前");
        
        Thread.sleep(1000*60);
        
        System.out.println(beanTest.getTestValue());
        System.out.println(beanTest.getTestValue2()); 
 
        System.out.println("------修改后");
     }

  

这就和@Component与@Configuration的区别有关了,@Component注解的bean是原生bean,@Configuration是被cglib动态增加的bean。

Nacos属性值自动刷新

1.@NacosValue获取最新值

引入jar包:  

          <dependency>
                 <groupId>com.alibaba.boot</groupId>
                 <artifactId>nacos-config-spring-boot-starter</artifactId>
                  <version>0.2.7</version>
            </dependency>

编写配置类:

       @Configuration
       @EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
       @NacosPropertySource(dataId = "example", group="test",autoRefreshed = true)
        public class NacosConfiguration { }

编写测试类:

       @Controller
       public class ConfigController {
         @NacosValue(value = "${test.data}", autoRefreshed = true)
           private boolean data;                                     
          @RequestMapping(value = "/test", method = GET)
          @ResponseBody
          public boolean get() { return data; }
      }

2.@Value获取最新值

引入jar包:  

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

引入配置:

spring:
  application:
    name: example
  cloud:
    nacos:
      config:
        extension-configs[0]:
          dataId: test.yml
          group: test
          refresh: true
        server-addr:  127.0.0.1:8848
        namespace: c845e96f-4423-4618-8c26-5e4d510f566a
        enabled: true
        refresh-enabled: true

编写测试类:

@RestController
@RefreshScope
public class TestController {
    @NacosValue(value = "${test.data}", autoRefreshed = true)
    private String data;
    @Value(value = "${test.data}")
    private String datas;
    @GetMapping("test")
    public String test() {
        return "data :" + data + ",datas="+datas;
    }
}

备注:

方式一@NacosValue获取最新值nacos配置信息需要写在配置类上

方式二@NacosValue获取不到值(如果需要使用该注解需要引入方式一的jar,但是不重启服务获取不到最新值),@Value获取最新值一定要加@RefreshScope注解,配置文件中配置refresh: true

以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。

原文出处:https://blog.csdn.net/chuixue24/article/details/107386045

[!--infotagslink--]

相关文章

  • Spring AOP 对象内部方法间的嵌套调用方式

    这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
  • Spring Cloud 中@FeignClient注解中的contextId属性详解

    这篇文章主要介绍了Spring Cloud 中@FeignClient注解中的contextId属性详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-25
  • Springboot如何实现Web系统License授权认证

    这篇文章主要介绍了Springboot如何实现Web系统License授权认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-28
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • 详解SpringCloudGateway内存泄漏问题

    这篇文章主要介绍了详解SpringCloudGateway内存泄漏问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-16
  • Spring为什么不推荐使用@Autowired注解详析

    @Autowired 注解的主要功能就是完成自动注入,使用也非常简单,但这篇文章主要给大家介绍了关于Spring为什么不推荐使用@Autowired注解的相关资料,需要的朋友可以参考下...2021-11-03
  • Springboot如何使用mybatis实现拦截SQL分页

    这篇文章主要介绍了Springboot使用mybatis实现拦截SQL分页,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-19
  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • Spring Data JPA 关键字Exists的用法说明

    这篇文章主要介绍了Spring Data JPA 关键字Exists的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10
  • tomcat启动完成执行 某个方法 定时任务(Spring)操作

    这篇文章主要介绍了tomcat启动完成执行 某个方法 定时任务(Spring)操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • Java Spring Cloud 负载均衡详解

    这篇文章主要介绍了Spring Cloud负载均衡及远程调用实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-09-18
  • Springboot使用thymeleaf动态模板实现刷新

    这篇文章主要介绍了Springboot使用thymeleaf动态模板实现刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-31
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • spring boot 使用utf8mb4的操作

    这篇文章主要介绍了spring boot 使用utf8mb4的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-20
  • Springmvc ResponseBody响应json数据实现过程

    这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26
  • Idea打包springboot项目没有.original文件解决方案

    这篇文章主要介绍了Idea打包springboot项目没有.original文件解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-26
  • SpringData Repository接口用法解析

    这篇文章主要介绍了SpringData Repository接口用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-27
  • Spring boot 无法注入service问题

    这篇文章主要介绍了Spring boot 无法注入service问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-09