SpringBoot配置文件

目录

properties配置文件

基本语法

读取配置文件

properties缺点分析

yml配置文件

yml基本语法

读取配置文件

配置对象

配置list集合

配置map


配置文件最重要的目的"解决硬编码问题(代码写死),把可能会发⽣改变的信息,放在⼀个集中的地⽅

SpringBoot配置文件有三种格式:

①properties ②yaml ③yml(yaml的缩写)

事实上,SpringBoot只支持3个文件

①application.properties ②application.yaml ③application.yml(通常使用这个)

应用程序启动时,SpringBoot会自动从classpath路径找到并加载

也可以通过sspring.config.name指定文件路径和名称

  • 理论上,properties 和.yml 可以并存在于⼀个项⽬中,当.properties 和.yml 并存时,两个配置都会加载.如果配置⽂件内容有冲突,则以.properties 为主,也就是 .properties 优先级更⾼
  • 虽然理论上来讲.properties 可以和.yml 共存,但实际的业务当中,我们通常会采取⼀种 统⼀的配置⽂件格式,这样可以更好的维护(降低故障率).

很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:

  • 项⽬的启动端⼝(SpringBoot内置了Tomcat服务器,默认端⼝号是8080,但SpringBoot需要⽀持让⽤⼾⾃定义端⼝号)
  • 数据库的连接信息(包含⽤⼾名和密码的设置)
  • 第三⽅系统的调⽤密钥等信息
  • ⽤于发现和定位问题的普通⽇志和异常⽇志等.

SpringBoot创建项目时,就已经自动帮我们创建了配置文件

下面我们在配置文件中修改端口号

XML 复制代码
server.port=9090

启动程序,观察日志,显示Tomcat启动端口号为9090

properties配置文件

properties配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件

基本语法

以键值对形式配置,key和value之间以"="连接

XML 复制代码
# 配置项⽬端⼝号 
server.port=8080

(配置文件中以"#"来添加注释信息)

读取配置文件

使用@Value注解在项目中主动读取配置文件中的内容

properties配置

XML 复制代码
mykey.key1 = bite
java 复制代码
@RestController
public class PropertiesController {
 @Value("${mykey.key1}")
 private String key1;
 @RequestMapping("/key")
 public String key(){
 return "读取到值:"+key1;
 }
}
properties缺点分析

文件中会有很多冗余信息

为了解决这个问题,可以使用

yml配置文件

yml是yaml的缩写 "Yet Another Markup Language"中文"另一种标记语言"

yml基本语法

key: value(key和value之间使用英文冒号加空格)

java 复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
    username: root
    password: root
读取配置文件
java 复制代码
string:
  str1: hello \n Spring Boot
  str2: 'hello \n Spring Boot'
  str3: "hello \n Spring Boot"
java 复制代码
@RestController
public class ReadYml {
    @Value("${string.str1}")
    private String str1;
    @Value("${string.str2}")
    private String str2;
    @Value("${string.str3}")
    private String str3;
    @RequestMapping("/readyml")
    public String readYml(){
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        return "yml";

    }
}

控制台输出:

可以看出,

  • 字符串默认不用加上单引号或双引号
  • 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通字符串
  • 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义
配置对象
java 复制代码
student:
 id: 1
 name: Java
 age: 18

或

java 复制代码
student: {id: 1,name: Java,age: 18}

使用@ConfigurationProperties读取配置中的对象

java 复制代码
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
 private int id;
 private String name;
 private int age;
}
java 复制代码
@RestController
public class StudentController {
 @Autowired
 private Student student;
 @RequestMapping("/readStudent")
 public String readStudent(){
 return student.toString();
 }
}
配置list集合
java 复制代码
dbtypes:
 name:
 - mysql
 - sqlserver
 - db2

使⽤@ConfigurationProperties 来读取

java 复制代码
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
 private List<String> name;
}
java 复制代码
@RestController
public class ReadYml2 {
 @Autowired
 private ListConfig listConfig;
 @RequestMapping("/readList")
 public String readList(){
 return listConfig.toString();
 }
}
配置map
java 复制代码
maptypes:
 map:
  k1: kk1
  k2: kk2
  k3: kk3

或者是使⽤⾏内写法

java 复制代码
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}

使⽤@ConfigurationProperties 来读取

java 复制代码
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
 private HashMap<String,String> map;
}
java 复制代码
@RestController
public class ReadYml2 {
 @Autowired
 private MapConfig mapConfig;
 @RequestMapping("/readMap")
 public String readStudent(){
 return mapConfig.toString();
 }
}
相关推荐
小码哥_常4 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
学长毕设7 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw8 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号9 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
努力的小雨9 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠9 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David10 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
excel10 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放10 小时前
Python基础语法练习题(73)
java·前端·python