Spring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spring Boot 项目后,即使不进行任何配置,该项目也能顺利的运行起来。当然,用户也可以根据自身的需要使用配置文件修改 Spring Boot 的默认设置。
SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。
其中,application.yml 是一种使用 YAML 语言编写的文件,它与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。
二者功能类似,都能完成Spring Boot配置(例如指定Tomcat端口,配置mybatis等),但是Properties的优先级要高于YAML。
Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。
Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。
注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。
以上所有位置的配置文件都会被加载,且它们优先级依次降低,序号越小优先级越高。其次,位于相同位置的 application.properties 的优先级高于 application.yml。
所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:
示例
创建一个名为 springbootdemo 的 Spring Boot 项目,并在当前项目根目录下、类路径下的 config 目录下、以及类路径下分别创建一个配置文件 application.yml,该项目结构如下图。
项目根路径下配置文件 application.yml 配置如下。
#项目更目录下
#上下文路径为 /abc
server:
servlet:
context-path: /abc
项目类路径下 config 目录下配置文件 application.yml 配置如下。
#类路径下的 config 目录下
#端口号为8084
#上下文路径为 /helloWorld
server:
port: 8084
servlet:
context-path: /helloworld
项目类路径下的 application.yml 配置如下。
#默认配置
server:
port: 8080
在 controller 包下创建一个名为 MyController 的类,代码如下。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@ResponseBody
@RequestMapping("/test")
public String hello() {
return "hello Spring Boot!";
}
}
启动 Spring Boot,查看控制台输出,如下图。
根据 Spring Boot 默认配置文件优先级进行分析:
根据服务器端口和上下文路径,使用浏览器访问 http://localhost:8084/abc/test,结果如下图。
1.语法
key=value 大小写敏感;
value的写法:
字符串默认不加单引号或双引号
2.优先级
properties文件在项目不同位置优先级不一样。
- file:./config/
- file:./
- classpath:/config/
- classpath:/
通过@Value注解获取自定义属性配置
新建包pojo,包下新建类User,如下:
@Component
public class User {
@Value("${name}")
private String name;
@Value("${age}")
private int age;
@Value("${habit}")
private List<String> habit;
//toString、get、set省略
}
@Component注解:将标注的类User自动实例并注入到容器中
测试:
@SpringBootTest
class BootDemoApplicationTests {
//将已注入到容器中的user对象注入到此属性
@Autowired
private User user;
@Test
void contextLoads() {
System.out.println(user);
}
}
通过@ConfigurationProperties注解获取自定义对象属性配置
新建Home类
@Component
//将.propertis或.yml配置文件的属性绑定到此对象 prefix 指定绑定属性前缀
@ConfigurationProperties(prefix = "home")
public class Home {
private String province;
private String city;
private String desc;
private List list;
private Map<String,String> map;
//toString、get、set省略
}
在测试类中添加测试方法
@Resource //将容器中的Home对象按名称注入到此处
private Home home;
@Test
void test(){
System.out.println(home);
}
YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)
语法格式: key:空格 value
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
示例:使用和.properties一致。
server:
port: 8000
#YAML文件属性配置格式
name: jack
age: 20
habit: basketball,soccer,volleyball
home:
province: 河南省
city: 新乡市
desc: 我家住在${home.province}的${home.city}
# list: [新乡,郑州,周口]
list:
- 新乡
- 郑州
- 周口
map: {k1: v1,k2: v2}
# map:
# k1: v1
# k2: v2
#使用random生成随机数
user:
id: ${random.long}
age: ${random.int(1,100)}
很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。如下,有两个环境的配置:
application-dev.yml :开发环境
application-prod: 生产环境
在不同的场景下使用不同的环境,此时通过在application.yml(后续演示配置文件都使用了yml格式)通过spring.profiles.active激活响应配置即可:
spring:
profiles:
#激活生产环境
active: prod