INDEX
- §1 依赖
- §2 基础配置
- §3 静态、动态引用
- §3.1 `@Value` 静态引用
- §3.2 `@NacosValue` 动态引用
- §3.3 `@ConfigurationProperties` 静态引用
- §3.4 `@NacosConfigurationProperties` 动态引用
- §4 多配置文件
§1 依赖
父 pom
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.7.RELEASE</version>
</parent><!-- 加入版本管理 -->
<properties><nacos-version>0.2.7</nacos-version>
</properties>
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>${nacos-version}</version></dependency></dependencies>
</dependencyManagement>
子 pom
<!-- 实装引入 -->
<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId>
</dependency>
§2 基础配置
### 强烈建议:spring 系的项目,都显示的定义 spring.application.name
### 尤其是 spring cloud 项目
spring.application.name=sdbc-nacos-sb
### 重要,必要的配置
### springboot 下缺省或false,会报错【Could not resolve placeholder】
nacos.config.bootstrap.enable=true### nacos url
nacos.config.server-addr=192.168.32.3:8848
nacos.config.username=nacos
nacos.config.password=nacos### 必配
### 实测 springboot 下,不适用 ${prefix}-${spring.profiles.active}.${file-extension},这是 springcloud 的风格
### 命名空间、data-id、后缀必须显示的声明,使用 DEFAULT_GROUP 时,group 可以省略
nacos.config.namespace=sdbc
nacos.config.group=DEFAULT_GROUP
nacos.config.data-id=sdbc-nacos-sb.properties
nacos.config.type=properties
配置中缺少命名空间、data-id、后缀时,可能报如下异常
命名空间
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'sdbc.nacos.sb.a' in value "${sdbc.nacos.sb.a}"at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
data-id
java.lang.NullPointerException: nullat com.alibaba.boot.nacos.config.util.NacosConfigLoader.reqNacosConfig(NacosConfigLoader.java:164) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]at com.alibaba.boot.nacos.config.util.NacosConfigLoader.reqGlobalNacosConfig(NacosConfigLoader.java:127) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]at com.alibaba.boot.nacos.config.util.NacosConfigLoader.loadConfig(NacosConfigLoader.java:67) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]at com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer.initialize(NacosConfigApplicationContextInitializer.java:88) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) [spring-boot-2.3.7.RELEASE.jar:2.3.7.RELEASE]
后缀
java.lang.IllegalArgumentException: 'value' must not be nullat org.springframework.util.Assert.notNull(Assert.java:201) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:123) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]at org.springframework.core.env.AbstractPropertyResolver.resolvePlaceholders(AbstractPropertyResolver.java:202) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]at org.springframework.core.env.AbstractEnvironment.resolvePlaceholders(AbstractEnvironment.java:566) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]at com.alibaba.boot.nacos.config.util.NacosConfigLoader.reqGlobalNacosConfig(NacosConfigLoader.java:118) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]at com.alibaba.boot.nacos.config.util.NacosConfigLoader.loadConfig(NacosConfigLoader.java:67) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]at com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer.initialize(NacosConfigApplicationContextInitializer.java:88) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) [spring-boot-2.3.7.RELEASE.jar:2.3.7.RELEASE]
§3 静态、动态引用
§3.1 @Value
静态引用
@Value("${sdbc.nacos.sb.a}")
private String a;
§3.2 @NacosValue
动态引用
配置追加 nacos.config.auto-refresh=true
@NacosValue(value = "${sdbc.nacos.sb.b}", autoRefreshed = true)
private String b;
§3.3 @ConfigurationProperties
静态引用
@ConfigurationProperties只是声明了模块化引用,还需要使模块化引用被spring扫描否则是不生效的
声明方式
@ConfigurationProperties(prefix = "sdbc.nacos.sc.l")
public class ModulizedConfig {private String x;private String y;
}
扫描方式
方式1:直接在声明处增加 @Component
方式2:使用 @Bean
的方式扫描
@Configuration
public class ModulizedActiveConfig {@Beanpublic ModulizedConfig modulizedConfig() {return new ModulizedConfig();}
}
方式3:使用 @EnableConfigurationProperties
扫描
@Configuration
@EnableConfigurationProperties(ModulizedConfig.class)
public class ModulizedActiveConfig {
}
当模块化配置没有被正确的扫描时,会按找不到 bean 报错
***************************
APPLICATION FAILED TO START
***************************Description:A component required a bean of type 'x.ModulizedConfig' that could not be found.
§3.4 @NacosConfigurationProperties
动态引用
配置追加 nacos.config.auto-refresh=true
@NacosConfigurationProperties只是声明了模块化引用,还需要使模块化引用被spring扫描否则是不生效的
声明方式
@NacosConfigurationProperties(dataId = "sdbc-nacos-sb.properties", prefix = "sdbc.nacos.sb.nl",autoRefreshed = true)
public class NacosModulizedConfig {private String x;private String y;
}
扫描方式
方式1:直接在声明处增加 @Component
方式2:使用 @Bean
的方式扫描
@Configuration
public class NacosModulizedActiveConfig {@Beanpublic NacosModulizedConfig nacosModulizedConfig() {return new NacosModulizedConfig();}
}
§4 多配置文件
data-ids
参考 基本配置,可以将 data-id 替换为 data-ids 以应用多配置文件(推荐,简单易懂)
nacos.config.namespace=sdbc
nacos.config.group=DEFAULT_GROUP
#nacos.config.data-id=sdbc-nacos-sb.properties
nacos.config.data-ids=sdbc-nacos-sb.properties,sdbc-nacos-sb-biz.properties,sdbc-nacos-sb-white.properties
nacos.config.type=properties
ext-config
如果需要引入不同的组,甚至命名空间不同,则需要引入 ext-config 配置
nacos.config.ext-config[0].data-id=sdbc-nacos-sb-xxl.properties
nacos.config.ext-config[0].group=JOB
nacos.config.ext-config[0].auto-refresh=true
nacos.config.ext-config[0].type=properties
需要注意:
- nacos.config.data-id 优先级更高,nacos.config.data-ids 会被 nacos.config.data-id 短路
即如果同时配置了二者,则后者不生效导致报错,如 Could not resolve placeholder ‘muti.place.a’ in value “${muti.place.a}”- 必须配全了 nacos.config 后,才能配置 nacos.config.ext-config
springboot 中,nacos.config 下配置都会加载进 NacosConfigProperties 对象,并在启动过程中强制检查参数
因此,不配置nacos.config.namespace/group/data-id/type
而是直接使用 ext-config,会启动失败报错,如 java.lang.IllegalArgumentException: ‘value’ must not be null