Spring Boot之配置文件详解

Spring Boot之配置文件详解

Spring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spring Boot 项目后,即使不进行任何配置,该项目也能顺利的运行起来。当然,用户也可以根据自身的需要使用配置文件修改 Spring Boot 的默认设置。

SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。

  • application.properties
  • application.yml

其中,application.yml 是一种使用 YAML 语言编写的文件,它与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。

二者功能类似,都能完成Spring Boot配置(例如指定Tomcat端口,配置mybatis等),但是Properties的优先级要高于YAML。
Spring Boot之配置文件详解_第1张图片

1.5.1 默认配置文件

Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。

Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。

  1. file:./config/
  2. file:./config/*/
  3. file:./
  4. classpath:/config/
  5. classpath:/

注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。

以上所有位置的配置文件都会被加载,且它们优先级依次降低,序号越小优先级越高。其次,位于相同位置的 application.properties 的优先级高于 application.yml。

所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:

  • 存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;
  • 存在不同的配置内容时,高优先级和低优先级的配置内容取并集。

示例

创建一个名为 springbootdemo 的 Spring Boot 项目,并在当前项目根目录下、类路径下的 config 目录下、以及类路径下分别创建一个配置文件 application.yml,该项目结构如下图。
Spring Boot之配置文件详解_第2张图片
项目根路径下配置文件 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之配置文件详解_第3张图片
根据 Spring Boot 默认配置文件优先级进行分析:

  • 该项目中存在多个默认配置文件,其中根目录下 /config 目录下的配置文件优先级最高,因此项目的上下文路径为 “/abc”;
  • 类路径(classpath)下 config 目录下的配置文件优先级高于类路径下的配置文件,因此该项目的端口号为 “8084”;
  • 以上所有配置项形成互补,所以访问路径为“http://localhost:8084/abc”。

根据服务器端口和上下文路径,使用浏览器访问 http://localhost:8084/abc/test,结果如下图。
Spring Boot之配置文件详解_第4张图片

1.5.2 properties文件

1.语法

key=value 大小写敏感;

value的写法:

字符串默认不加单引号或双引号

2.优先级

properties文件在项目不同位置优先级不一样。

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

Spring Boot之配置文件详解_第5张图片
3.自定义数据配置

配置文件除了能修改一些原本固有的配置,还能自定义配置。
Spring Boot之配置文件详解_第6张图片

通过@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);
}

1.5.2 yml文件

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)}

1.5.3 多环境配置

很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。如下,有两个环境的配置:

Spring Boot之配置文件详解_第7张图片

application-dev.yml :开发环境

application-prod: 生产环境

在不同的场景下使用不同的环境,此时通过在application.yml(后续演示配置文件都使用了yml格式)通过spring.profiles.active激活响应配置即可:

spring:
  profiles:
    #激活生产环境
    active: prod

你可能感兴趣的:(spring,boot,java,spring)