Spring-Boot中properties的使用:@Component与@Autowired注解

本文详细介绍如何在Spring Boot项目中读取application.properties和自定义配置文件,包括使用@ConfigurationProperties和@Value注解,以及Environment类和Properties类的运用。

首先打开src/main/resources/application.properties,添加配置:

com.template.name=this is a test name
com.template.age=21
  • 用配置类来操作application.properties

在pom.xml中添加一个依赖:

<dependencies>
   ...
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-configuration-processor</artifactId>
       <optional>true</optional>
   </dependency>
</dependencies>

该依赖的主要作用是:spring-boot-configuration-processor jar中提供了一个编译时调用的Java注解处理器,提供对@ConfigurationProperties注解的支持。

在src/main/java/com/项目名/下添加一个java类,用于application.properties属性的获取和存储。

import org.springframework.stereotype.Component;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Component
@ConfigurationProperties(prefix="com.template")
public class Config {
    public String name;
    public int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

注意:

  1. 使用@Component将该类注解为spring的管理类,也就是将一个java类注入到spring容器中,这样注入到spring中的其他类就可以使用该类了。详见附录。
  2. 使用@ConfigurationProperties(prefix="com.template")application.properties中的属性注入到Config类中。其中prefix指定了application.properties中属性的前缀,也就是只有这部分指定的属性才会被注入。Config类的成员变量名与各个指定的application.properties属性名一一对应。例如属性com.template.name,指定了前缀为com.template,那么在Config类中对应的成员变量名就是name。
  3. @ConfigurationProperties(prefix="com.template")是对整个类进行映射。可以使用@Value("${com.template.xxx}")来对单个值进行映射。详见附录。
  • 引用:
@Autowired
private Config cg;
这样就可以使用已注入spring的Config对象cg的值。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.template.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Autowired
    private Config cg;

    @RequestMapping("/test")
    public JSON index() {
        JSON r = new JSONObject();
        ((JSONObject) r).put("name", cg.getName());
        ((JSONObject) r).put("age", cg.getAge());
        return r;
    }
}

整体思路:

  1. 定义一个Config类,使用@ConfigurationProperties(prefix="com.template")@Value("${com.template.xxx}")来作为该类的初始化参数值。这样,当该类的实例注入到spring时,就会以application.properties中的值来初始化该实例。
  2. 为Config类添加@Component注解,这样就会将类注入到spring中。由于1中的设置,注入的Config类实例中各成员变量就是application.properties中的值。
  3. 在需要使用application.properties值的地方,使用:
    @Autowired
    private Config cg;
    来获取到spring中的Config实例。
  4. 调用Config实例的get函数来获取具体值。

以上为通用的properties文件读取方式。无论是默认的application.properties还是用户自定义的properties,都可以用上面的方式来读取。但由于上面没有指定数据源,会默认读取application.properties

  • 用配置类来操作自定义配置文件

设在src/main/resources/下,创建了一个config文件夹,下面添加了一个配置文件template.properties

自定义配置文件使用上面一中的通用方案时,需要在Config类前使用@PropertySource注解设置数据源:

@PropertySource(value = {"classpath:config/template.properties"},ignoreResourceNotFound = false, encoding = "UTF-8", name = "template.properties")

后续的操作就与一完全相同了。

特别注意:自定义的配置文件的内容,与application.properties的内容不能相同,特别是不能出现相同的前缀,否则读出的配置值是application.properties中的,即使通过@PropertySource指定了数据源。

例如:

为src/main/resources/config/template.properties,添加配置:

com.template.name=测试名
com.template.age=21

这个配置与application.properties有相同的前缀,也就是prefix="com.template"

指定数据源为config/template.properties,编译,运行,都是正常的。但获取到name属性,会发现其值是this is a test name,而非测试名

修改template.properties的前缀:

config.template.name=测试名
config.template.age=21

同时需要修改:

@ConfigurationProperties(prefix="config.template")

再次获取name属性,会发现其值已经是测试名

  • Environment变量操作application.properties

对于默认的application.properties,Spring-Boot本身提供了一个Environment类,且已注入到spring容器中。因此可以直接使用@Autowired获取:

@Autowired
private Environment env;

读取配置时:

String name = env.getProperty("com.template.name");

因此,对于application.properties,使用Environment类更方便。

  • Environment变量操作自定义配置文件

三中的Environment类,不仅可用于读取默认的application.properties,也可以用于操作自定义配置文件。

Environment类定义如下:

public interface Environment extends PropertyResolver {
    String[] getActiveProfiles();

    String[] getDefaultProfiles();

    boolean acceptsProfiles(String... var1);
}

提供了一个acceptsProfiles()函数。该函数可接受多个逗号隔开的String变量,用于为Environment添加新的配置文件。

例如,要将template.properties加入到Environment中来:

boolean r = env.acceptsProfiles("/config/template.properties");

然后就可以使用key来读取配置:

String name = env.getProperty("config.template.name");

然而这也意味着,不同配置文件中的配置项,key一定不可以重复。

  • 通用方案:获取配置文件所有的键值对

上面的一和二,需要对配置文件创建对应的类。这意味着,配置文件的每一个配置项,都要写一个对应的类属性。每增删一个属性,都要同时维护配置文件和对应的类。

上面的三则不存在这些问题,只需要维护一个配置文件,取值的时候传入正确的配置项名即可。推荐使用

除了上面的方式,还可以获取配置文件所有的键值对并保存,这样也能实现读取配置文件的目的。该方式同时适用于application.properties和用户自定义配置文件。

因为配置文件也是个文件,且其格式是固定的。只要读取配置文件,然后按照其格式进行解析,保存为键值对即可。

实际上,Spring-Boot本身提供了一个Properties类,可用于属性的保存,且接受InputStream作为输入。所以只需要将文件读取为一个InputStream,然后传给Properties对象即可。

Properties prop = new Properties();
try {
    InputStream in = Object.class.getResourceAsStream("/config/template.properties");
    prop.load(in);
} catch (IOException e) {
    e.printStackTrace();
}
String name = prop.getProperty("config.template.name").trim();

如上,即可正确取到自定义的属性config.template.name

于是,只需要创建一个单件,在程序启动文件中将配置文件进行加载,然后保存所有的键值对。当需要获取配置文件值的时候,调用该单件取其保存的值。

 

 

附录

一.关于@Component@Autowired

在spring框架中,有控制反转和依赖注入的特性。spring实现的方式是:

  • 是要求开发者配置一个xml,指定类的名称,路径,以及初始化时传入的参数。
  • spring读取该xml,对该类进行实例化,将其实例化对象(而非类)保存在spring容器中,称之为注入。

有的java类需要这样注入到spring容器中,有的不需要。因此,对于需要注入的,添加xml配置;不需要注入的不用添加。

然而这样意味着开发者除了编写java类,还要编写一个配套的xml配置,于是出现了注解@Component@Component的作用就是告诉spring, 我需要被注入到spring容器中,请按照我自身提供的参数来实例化一个类对象,并放入spring容器中。初始化参数可以通过类的参数默认值定义或者其他注解来提供。详见附录二。

对于已经存在于spring容器中的实例化对象,要引用,同样需要通过xml来配置。例如,一个类Person有一个Car类的属性。实例化类Person时,需要提供Car类的实例化对象做参数。此时,从spring容器中取出已经注入的Car类对象传入即可。

spring的做法,同样是通过xml,来为要实例化的Person类指定已经实例化的Car对象。因为每个实例化的对象都可以定义一个id,所以这个指定可以通过id来进行。

但这样同样意味着需要编写xml。

于是spring提供了@Autowired注解:当需要引用一个spring容器中已注入的类实例时,直接在前面加入@Autowired注解,spring就会自动对已注入的所有类对象进行类型匹配,一旦匹配成功,就直接将其返回。这样就省略掉了xml配置。

这也意味着,spring容器中每个类型的对象有且只有一个。否则,对类型进行匹配后,得到的实例对象为0个或多个,都会报错。

总之,一个类要求按照自身提供的初始化参数进行实例化,并将实例化后的对象注入到spring中,使用@Component;要使用spring中已注入的某个类的实例化对象,使用@Autowired。这两个注解往往配套使用:使用@Component来注入对象,使用@Autowired来使用已注入的对象。

二.类的初始化参数

类的初始化参数最常见的是java所提供的默认值:

public class Config {
    public String name = "this is a name";
}
或:
public class Config {
    public String name; 

    public Config() {
        name = "this is a name";
    }
}

如上,上面两种方式都提供了一个默认的初始化参数name的方式。

对该类添加@Component注解,使用@Autowired来引用后,得到的实例对象是做了对应的初始化的。

@ConfigurationProperties注解的作用是将指定的配置文件映射到该类。也就是:配置文件值→同名类属性。
例如:
配置文件:
com.template.name=this is a test name

类:

@ConfigurationProperties(prefix="com.template")
public class Config {
    public String name; 
}

这样,@ConfigurationProperties会将com.template.name映射给Config类的属性name

也就是相当于:

public class Config {
    public String name = "this is a name";
}

三.注解

spring常用的注解有4种:

@Controller@Service@Repository@Component

这些注解的作用都是将实例化对象注入到spring容器中,本质上是相同的。

然而,除了注入功能,spring还提供抛出异常功能。不同的层,其异常是不同的,例如Controller层与Service层的异常是不同的。

所以,spring通过对类添加不同的注解,来执行对应的异常处理。

这也是为什么一个Controller类只能添加@Controller注解,而不能添加@Service注解。

四.application.properties映射到类

application.properties映射到类有两种方式:

  • @ConfigurationProperties(prefix="com.template")
@ConfigurationProperties(prefix="com.template")
public class Config {
    public String name;
    public int age = 21;
}

这样,Config类进行spring注入时,就会将application.properties中的值赋给Config类同名的成员变量。

  • @Value("${com.template.xxx}")

该方式是对单个值进行映射:

public class Config {
    @Value("${com.template.name}")
    public String name;
    @Value("${com.template.age}")
    public int age = 21;
}

这样,Config类进行spring注入时,就会将application.properties中的值一个一个对应地赋给指定的Config类的成员变量。可以名称不同

注意:@ConfigurationProperties@Value注解都不可以用于局部变量,也就是不能在方法体内使用这两个注解来初始化对象。

 

 

<think>我们正在处理用户的问题:在SpringBoot项目中实现监听Nacos配置更新并手动刷新配置项。根据引用[1]和引用[2],我们可以得知:引用[1]提到了从源码角度分析Nacos配置拉取动态刷新、监听原理,并给出了启动类的示例。引用[2]则提到了一种自定义注解的方式来实现精确监听Nacos配置中心key变更的方法。用户的需求是:监听Nacos配置更新并能够手动刷新配置项。在SpringCloudAlibabaNacos中,通常有两种方式来处理配置更新:1.使用@RefreshScope注解(自动刷新)2.自定义监听机制(手动控制刷新)但是,用户要求的是“手动刷新”,这意味着我们需要在配置更新时得到通知,然后自己决定何时刷新配置。实现思路:思路1:使用Nacos提供的ConfigService添加监听器(Listener),在监听器中我们获取到变更的配置,然后更新我们自己的配置Bean(但这里不是自动注入,需要手动更新)。思路2:结合Spring的事件机制,在监听到Nacos配置变更时,发布一个自定义事件,然后在需要的地方监听这个事件并手动刷新配置。然而,引用[2]提供了一种自定义注解的方法,可以精确监听某个key的变更。我们可以借鉴这个思路。具体步骤:1.引入依赖:确保项目中包含了SpringCloudAlibabaNacosConfig的依赖。2.配置Nacos服务器信息:在application.properties或application.yml中配置Nacos配置中心的相关信息。3.创建自定义注解(如@ConfigListener),用于标记需要监听配置变更的方法(引用[2]中的做法)。4.编写一个配置监听处理器,在应用启动时,扫描所有带有@ConfigListener注解的方法,并为这些方法所关注的key注册Nacos监听器。5.在Nacos监听器中,当配置发生变化时,调用对应的注解方法,这样我们就可以在方法中执行手动刷新逻辑(比如更新某个配置类的字段,或者重新加载配置等)。6.手动刷新:在监听器回调中,我们可以获得新的配置值,然后更新到我们自己的配置对象中(这里就是手动刷新的过程)。但是,用户要求的是“手动刷新机制”,所以我们需要在监听到变更后,由我们自己来决定如何刷新,而不是自动刷新整个上下文。另外,我们也可以考虑使用NacosConfigManager和NacosConfigProperties来手动获取配置,然后更新。下面我们给出一个实现示例:步骤1:添加依赖(以Maven为例)```xml<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2021.0.1.0</version><!--版本根据实际情况选择--></dependency>```步骤2:在bootstrap.properties(或bootstrap.yml)中配置Nacos```propertiesspring.application.name=your-application-namespring.cloud.nacos.config.server-addr=your-nacos-server-addr:8848```步骤3:定义自定义注解@ConfigListener```javaimportjava.lang.annotation.*;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceConfigListener{/***监听的数据ID,可以是完整的dataId,也可以是带通配符的(如example.*)*/StringdataId();}```步骤4:编写一个配置监听管理类,用于注册监听```javaimportcom.alibaba.cloud.nacos.NacosConfigManager;importcom.alibaba.nacos.api.config.ConfigService;importcom.alibaba.nacos.api.config.listener.Listener;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.springframework.context.annotation.Configuration;importjavax.annotation.PostConstruct;importjava.lang.reflect.Method;importjava.util.Map;importjava.util.concurrent.Executor;@ConfigurationpublicclassNacosConfigListenerRegistryimplementsApplicationContextAware{privateApplicationContextapplicationContext;@AutowiredprivateNacosConfigManagernacosConfigManager;@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{this.applicationContext=applicationContext;}@PostConstructpublicvoidinit()throwsException{//获取所有带有@ConfigListener注解的beanMap<String,Object>beansWithAnnotation=applicationContext.getBeansWithAnnotation(org.springframework.stereotype.Component.class);for(Objectbean:beansWithAnnotation.values()){Method[]methods=bean.getClass().getDeclaredMethods();for(Methodmethod:methods){ConfigListenerannotation=method.getAnnotation(ConfigListener.class);if(annotation!=null){//为每个注解方法注册监听器registerListener(annotation.dataId(),bean,method);}}}}privatevoidregisterListener(StringdataId,Objectbean,Methodmethod)throwsException{ConfigServiceconfigService=nacosConfigManager.getConfigService();//添加监听器configService.addListener(dataId,"DEFAULT_GROUP",newListener(){@OverridepublicExecutorgetExecutor(){returnnull;//使用默认的Executor}@OverridepublicvoidreceiveConfigInfo(StringconfigInfo){//当配置变更时,调用目标方法try{//这里我们假设方法是无参的,或者只有一个String参数(即新的配置内容)if(method.getParameterCount()==0){method.invoke(bean);}elseif(method.getParameterCount()==1&&method.getParameterTypes()[0]==String.class){method.invoke(bean,configInfo);}else{thrownewUnsupportedOperationException("Method"+method.getName()+"musthavezerooroneStringparameter.");}}catch(Exceptione){e.printStackTrace();}}});}}```步骤5:在需要使用的地方,使用@ConfigListener注解标记方法```java@ComponentpublicclassMyConfigRefresher{@Value("${some.config.key:defaultValue}")privateStringsomeConfig;@ConfigListener(dataId="your-data-id")//这里填写你监听的dataIdpublicvoidonConfigChange(StringnewConfig){//这里你可以解析newConfig(可能是properties格式或yaml格式),然后更新配置//例如,我们假设newConfig就是某个key的值,那么我们可以直接更新字段//注意:这个例子中,我们只是更新一个字段,实际应用中可能需要更复杂的解析this.someConfig=newConfig;//或者,你也可以在这里触发一个自定义的刷新逻辑,比如重新初始化某些配置}}```注意:上面的示例中,我们直接更新了someConfig字段。但是,如果这个字段已经被其他组件使用,那么其他组件可能不会感知到更新(因为Spring的@Value注入是一次性的)。因此,我们需要手动刷新持有该配置的Bean。一种做法是,在配置变更时,重新初始化这个Bean,或者使用一个配置持有类(用@ConfigurationProperties)然后手动刷新这个类。另外,我们也可以使用Spring的Environment对象来动态更新配置,但是Spring的Environment更新后,已经注入的Bean不会自动更新,除非它们是@RefreshScope。所以,如果我们想要手动刷新,并且更新所有使用该配置的地方,我们需要结合@RefreshScope。但是用户要求手动刷新,我们可以这样:在监听到配置变更时,我们手动更新Environment,然后重新创建@RefreshScope的Bean。但是这个过程比较复杂。因此,我们提供另一种思路:使用SpringCloud的RefreshScope来手动刷新。但是RefreshScope通常是由/refresh端点触发的(需要actuator),我们可以手动调用RefreshScope的refresh方法。步骤6:结合RefreshScope手动刷新首先,在配置类上使用@RefreshScope:```java@Component@RefreshScopepublicclassMyConfig{@Value("${some.config.key:defaultValue}")privateStringsomeConfig;//getterandsetter}```然后,在监听器方法中,我们触发RefreshScope的refresh方法,但是注意,RefreshScope.refresh()可以刷新所有bean,也可以刷新特定的bean。但是SpringCloud的RefreshScope没有提供按bean名称刷新的方法,所以我们可以刷新所有,或者按scope刷新。不过,我们可以通过发布RefreshEvent事件来触发刷新,这样所有@RefreshScope的bean都会被刷新。修改监听器方法:```javaimportorg.springframework.cloud.context.scope.refresh.RefreshScope;importorg.springframework.context.ApplicationEventPublisher;importorg.springframework.context.ApplicationEventPublisherAware;@ComponentpublicclassMyConfigRefresherimplementsApplicationEventPublisherAware{privateApplicationEventPublisherpublisher;@ConfigListener(dataId="your-data-id")publicvoidonConfigChange(StringnewConfig){//这里我们发布一个RefreshEvent事件,触发@RefreshScope的bean刷新publisher.publishEvent(newRefreshEvent(this,null,"RefreshfordataId:your-data-id"));}@OverridepublicvoidsetApplicationEventPublisher(ApplicationEventPublisherapplicationEventPublisher){this.publisher=applicationEventPublisher;}}```但是注意:RefreshEvent是SpringCloudContext的事件,我们需要确保有RefreshScope和相应的监听器(通常SpringCloud已经配置好了)。另外,我们需要在pom.xml中加入actuator依赖(因为RefreshEvent的处理需要actuator相关的功能):```xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>```这样,当配置变更时,就会触发RefreshEvent,然后所有@RefreshScope的bean都会被重新初始化,从而获取到最新的配置。但是,这种方式会刷新所有@RefreshScope的bean,如果只想刷新特定的bean,目前没有直接的支持。我们可以通过自定义RefreshScope并扩展其功能来实现,但这样比较复杂。因此,如果用户希望精确刷新某个配置项,建议使用第一种方法:在监听器中直接更新配置对象(比如使用一个单例的配置持有类,然后更新其字段),这样其他使用该配置的地方可以通过这个持有类动态获取最新值。总结:根据需求选择方案:方案1:在监听器中直接更新配置字段(适用于配置字段集中管理,且调用方通过该管理类获取配置)。方案2:通过发布RefreshEvent事件,刷新所有@RefreshScope的bean(简单但范围大)。由于用户要求手动刷新,我们更倾向于在监听器回调中执行自定义的刷新逻辑,这样控制更灵活。因此,我们给出两种方案,供用户选择。注意:上述代码示例仅为演示,实际使用需要根据项目结构调整。相关问题:1.如何为特定的配置项(key)添加监听?2.在Nacos配置变更时,如何只刷新部分Bean而不是全部?3.使用@RefreshScope和手动刷新机制有什么优缺点?4.如何避免在配置刷新时出现线程安全问题?</think>### Spring Boot Nacos 配置监听手动刷新实现方案 在Spring Boot项目中实现Nacos配置监听手动刷新,核心是通过**自定义监听机制**和**手动触发配置更新**来实现。以下是完整实现方案: #### 一、基础依赖配置 ```xml <!-- pom.xml --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.0.5.0</version> <!-- 根据Spring Cloud版本选择 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <!-- 用于手动刷新端点 --> </dependency> ``` ```properties # bootstrap.properties spring.application.name=your-app-name spring.cloud.nacos.config.server-addr=127.0.0.1:8848 management.endpoints.web.exposure.include=refresh,health # 暴露刷新端点 ``` #### 二、实现精确配置监听 参考引用[2],创建自定义注解实现精确监听: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ConfigListener { /** 监听的配置项key */ String value(); } ``` #### 三、配置监听处理器 ```java @Component public class ConfigListenerProcessor implements ApplicationContextAware { @Autowired private NacosConfigManager nacosConfigManager; @Override public void setApplicationContext(ApplicationContext context) { Map<String, Object> beans = context.getBeansWithAnnotation(Component.class); beans.forEach((beanName, bean) -> { Method[] methods = bean.getClass().getDeclaredMethods(); for (Method method : methods) { ConfigListener annotation = method.getAnnotation(ConfigListener.class); if (annotation != null) { registerListener(annotation.value(), bean, method); } } }); } private void registerListener(String key, Object bean, Method method) { try { ConfigService configService = nacosConfigManager.getConfigService(); configService.addListener( "your-data-id", "DEFAULT_GROUP", new AbstractListener() { @Override public void receiveConfigInfo(String config) { Properties properties = parseConfig(config); String newValue = properties.getProperty(key); // 触发回调方法 method.invoke(bean, newValue); } } ); } catch (Exception e) { throw new RuntimeException("注册监听器失败", e); } } private Properties parseConfig(String config) { // 解析配置内容(支持properties/yaml格式) Properties properties = new Properties(); try (StringReader reader = new StringReader(config)) { properties.load(reader); } catch (IOException e) { // 处理解析异常 } return properties; } } ``` #### 四、手动刷新配置实现 ```java @RestController @RefreshScope // 声明为可刷新Bean public class ConfigController { @Value("${your.config.key:default}") private String configValue; @Autowired private ContextRefresher contextRefresher; // Spring上下文刷新器 // 1. 监听特定配置项变更 @ConfigListener("your.config.key") public void onConfigChange(String newValue) { this.configValue = newValue; System.out.println("配置已更新: " + newValue); } // 2. 手动刷新端点 @PostMapping("/refresh-config") public String refreshConfig() { // 手动刷新所有@RefreshScope Bean Set<String> keys = contextRefresher.refresh(); return "刷新配置项: " + keys; } @GetMapping("/current-value") public String getCurrentValue() { return configValue; } } ``` #### 五、使用示例 1. **监听配置变更**:在需要监听的方法上添加注解 ```java @Service public class PaymentService { @ConfigListener("payment.timeout") public void handleTimeoutChange(int newTimeout) { // 处理超时配置变更 } } ``` 2. **手动触发刷新**: ```bash curl -X POST http://localhost:8080/refresh-config ``` #### 六、方案优势 1. **精确监听**:通过`@ConfigListener`实现key级监听[^2] 2. **手动控制**:通过`ContextRefresher.refresh()`主动触发刷新 3. **无缝集成**:兼容Spring Cloud原生`@RefreshScope`机制 4. **避免全局刷新**:减少不必要的Bean重建 > **关键点说明**: > - `NacosConfigManager`提供底层配置操作能力 > - `ContextRefresher.refresh()`会刷新所有`@RefreshScope` Bean > - 监听回调方法参数类型需配置值类型匹配 [^1]: Nacos配置监听基于长轮询机制实现,客户端会定期检查配置变更 [^2]: 自定义监听器解决了Nacos原生API无法精确监听单个key的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值