代码
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.16</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo3</name>
<description>demo3</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务发现 加了这个依赖 nacos才会显示服务-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.5.0</version>
</dependency>
<!--Nacos配置中心的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.0.5.0</version>
</dependency>
<!--在springcloud 2021的版本中 已经去掉了bootstrap.yml 加入下面的依赖 就是为了解决添加了bootstrap.yml 启动报错-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@RestController
public class TestController {
@Value("${aa}")
private String aa;
@GetMapping("/test")
public String test(){
return aa;
}
}
@SpringBootApplication
public class Demo3Application {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Demo3Application.class, args);
//从环境变量中获取配置信息
ConfigurableEnvironment environment = run.getEnvironment();
String aa = environment.getProperty("aa");
System.out.println(aa);
}
}
application.properties
这个文件都是存放动态内容
aa=local
bootstrap.yml
这个文件都是存放静态文件的内容
spring: application: name: kucun profiles: active: dev cloud: nacos: config: file-extension: properties #文件扩展名 server-addr: localhost:8848 username: nacos password: nacos shared-configs: #共享配置文件 - data-id: common-${spring.profiles.active}.properties group: DEFAULT_GROUP #是否允许自动刷新 refresh: true aa: bootstrap
nacos配置
common-dev.properties
aa=common-dev
kucun-dev.properties
# 应用名称
spring.application.name=kucun
server.port=8089
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
aa=kucun-dev
kucun.properties
aa=kucun.properties
kucun
aa=kucun
源码解析
进入下面的代码
org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource#findConfigurationProperty(org.springframework.boot.context.properties.source.ConfigurationPropertyName)
在这里我们可以看到,他会从configurationProperties在这个配置中去读取对应的文件
根据顺序,如果匹配成功了,那么就直接返回,如果没有匹配成功,继续找下一个配置文件
顺序如下
1 =bootstrapProperties-kucun-dev.properties
2 =bootstrapProperties-kucun.properties
3 =bootstrapProperties-kucun
4 =bootstrapProperties-common-dev.properties
13 = [application.properties]
14 = [bootstrap.yml]
这个bootstrapProperties-前缀是系统给加的
kucun.properties和kucun也可以不写,系统会默认去读这2个文件,kucun就是我们的项目的名字
如果nacos有自己的配置,先读自己项目的配置,如果没有,在读取共享的配置
如果上面2个都没有,那么在读取本地的application.properties
如果上面的都不符合,在读取bootstrap.yml
如果以上都没有配置aa,那么启动就会报错
最终顺序如下
nacos自己项目配置->共享配置->application.properties->bootstrap.yml