Spring Boot 配置文件

简介: Spring Boot 配置文件

一、配置文件的作用


       计算机上有数以千计的配置文件我们使用的绝大多数软件,比如浏览器、微信、IDEA、电脑、手机等等,都离不开配置文件。我们可能永远也不会直接与其中的大部分文件打交道,但它们确实以不同的形式散落在我们的计算机上,比如 C:\Users,C:\Windows 文件夹,以及各种 *.config,*.xml 文件。

       配置文件主要是为了解决硬编码带来的问题把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行

       硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是我们常说的把 “代码写死”。

       比如手机字体大小如果采用硬编码的方式,就直接在程序中指定字体大小,所有用户使用的都是同一个字体大小。但是不同的用户有不同的偏好,我们可以把手机字体放在配置文件中,当程序启动时,读取配置,以用户设置的字体大小来显示

       使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。

Spring Boot 配置文件

      Spring Boot支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到SpringBoot的目的

       很多项目或者框架的配置信息,也放在配置文件中,例如:

1项目的启动端口

2数据库的连接信息(包含用户名和密码的设置)

3第三方系统的调用密钥等信息

4用于发现和定位问题的普通日志和异常日志等

       项目的启动端口Spring Boot内置了Tomcat服务器,默认端口号是8080,但在用户电脑上8080端口号有可能被其他应用程序占用了,所以Spring Boot需要支持让用户自定义端口号。

       数据库连接信息为了更方便、简单的访问数据库,出现了一些持久层框架,其实就是对JDBC进行了更深层次的封装。让用户通过简单的几行代码,就可以完成数据库的访问。但是不同的应用程序访问的数据库不同,这些持久层框架就需要支持用户可以自定义配置数据库的连接信息。


二、配置文件快速入手


       因为Tocmat默认端口号是8080,所以我们程序访问时的端口号也是8080,但是如果8080端口号已经被其他进程占有了,这时候我们就可以通过配置文件来修改服务器的端口号,Spring Boot在创建项目时,就已经帮我们创建了配置文件。如图:

       使用之前写的图书管理系统举例子。

       因为现在8080的端口号已经被占用了,所以要修改一下端口号,在application.properties文件中,加上以下代码:

server.prot=9090

       重新运行项目,执行结果如下:

       在浏览器访问:http://127.0.0.1:9090/login.html,如图:

       可以访问成功。而8080端口就不能访问了,因为这里已经修改了端口号。


三、配置文件的格式


       Spring Boot配置文件的格式有以下三种:

1application.properties

2application.yml

3application.yaml

       其中的 yml 是 yaml 的简写实际开发中出现频率最高yaml 和 yml 的使用方式一样,这里就只讲 yml 的使用。

       当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.properties 和(application.yaml 或者 application.yml文件)

       也可以通过Spring.config.name指定文件路径和名称,参考文档:Core Features (spring.io)

1、application.properties 和 application.yml的关系

       类似商品的包装,有新款包装,也有老款包装properties 类型的配置文件就属于老款包装,也是创建 Spring Boot项目时默认的文件格式(主要是因为仓库里还有库存),而 yml 属于新款包装,如果用户了解情况直接指定要新款包装,那么就直接发给他

2、特殊说明

(1)理论上讲.properties 和 .yml 可以并存在一个项目中当 .properties 和 .yml 并存时,两个配置都会加载如果配置文件内容有冲突,则以 .properties 为主,也就是 .properties 优先级更高

(2)虽然理论上讲: .properties 和 .yml  可以共存,但实际业务中,我们通常采取其中的一种统一配置文件格式,这样也可以更好的维护(降低故障率)


四、properties配置文件说明


       properties 配置文件是最早期的配置文件格式,也是创建Spring Boot项目默认的配置文件。

1、properties 的基本语法

       properties 是以键值的形式配置的key 和 value 之间是以 "=" 连接的,例如下面内容,展示使用properties连接数据库:

#配置项目端口号
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

       PS:小技巧:配置文件中使用 "#" 来添加注释信息。

       目前先学习语法和使用,更多配置信息可参考官网:Common Application Properties

2、读取配置文件

       如果在项目中,想要主动读取配置文件中的内容,可以使用@Value注解来实现。@Value注解使用 "${ }" 格式读取,代码如下:

       properties配置如下:

mykey.key1 = bite

       PropertiesController类代码如下:

@RequestMapping("/properties")
@RestController
public class PropertiesController {
    @Value("${mykey.key1}")
    private String key1;
    @RequestMapping("/key")
    public String key() {
        return "读取搭配值:" + key1;
    }
}

       浏览器访问:http://127.0.0.1:8080/properties/key,页面如下:

       

       可以看到,通过注解@Value,使用${ }的格式,拿到了配置文件里的内容。

3、properties 的缺点分析

       我们知道,properties配置是以key-value的形式配置的,如图:

       从上面的key可以看出,properties配置文件中会有很多冗余信息(红色框框出来的);想要解决这个问题,就可以使用yml配置文件的格式化了。


五、yml配置文件说明


       yml是yaml的缩写,它的全称是:Yet Another Markup Language,翻译成中文就是:另一种标记语言。

1、yml基本语法

       yml是树形结构的配置文件它的基础语法是 "key: value"。key和value之间使用 英文冒号 + 空格 的方式组成,空格不可省略!

       基本语法,代码如下:

#正确的配置方式,冒号后面必须要有空格
key1: java
#错误的配置方式
key2:java2

       IDEA的截图如下:

       

       可以看到,冒号后面有加空格的,前面的key值是橙色的,而冒号后面没有加空格的,依旧是白色的,还报红线了(专业版会报红线,社区版不会)。

       如下代码,使用yml连接数据库:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
    username: root
    password: root

yml 和 properties 连接数据库的配置对比

       如图:

       可以看出来,yml省去了很多的冗余信息,而这些冗余信息,properties都要写出来。

2、yml使用进阶

(1)yml配置不同数据类型及null

       代码如下:

# 字符串
string.value: Hello
 
# 布尔值,true或false
boolean.value1: true
boolean.value2: false
 
# 整数
int.value: 10
 
#浮点数
float.value: 3.1415926
 
# Null,~代表null
null.value: ~
 
# “” 空字符串
#,直接后面什么都不加就可以了,但这种方式不直观,更多的表示是使用引号括起来
empty.value: ''

       这里的 点" . " 使用换行也行,使用点也行。下面就只举字符串的例子:

# 字符串
string:
  value: Hello
1)yml 配置读取

       yml配置:

string.hello: hello yml

       或者这种写法:

string:
  hello: hello yml

       上面这两种写法都可以,不过还是推荐使用换行的写法,因为这才是yml的风格,虽然yml支持第一种写法,但在专业版的IDEA会报黄线,对运行结果没有影响,看个人喜好吧。

       yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:

@RequestMapping("/yml")
@RestController
public class YmlController {
    @Value("${string.hello}")
    private String hello;
 
    @RequestMapping("/stringHello")
    public String stringHello() {
        return "读取到值:" + hello;
    }
}

       浏览器访问:http://127.0.0.1:8080/yml/stringHello

       

2)注意事项:value 值加单双引号

       字符串默认不用加上单引号或者双引号如果加英文的单引号可以表示特殊的含义。application.yml配置信息如下:

string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

       读取代码如下:

@RequestMapping("/yml")
@RestController
public class YmlController {
    @Value("${string.str1}")
    private String str1;
 
    @Value("${string.str2}")
    private String str2;
 
    @Value("${string.str3}")
    private String str3;
 
    @RequestMapping("/stringHello2")
    public String stringHello2() {
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        return "读取到值";
    }
}

       浏览器访问:http://127.0.0.1:8080/yml/stringHello2 ,浏览器页面如下:

       IDEA的控制台如下:

       可以看到,不加引号和加单引号的是原来的字符串内容,而加了双引号的把 \n 变成了换行。

小结:

1、字符串默认不用加上单引号或者双引号

2、单引号会转义特殊字符,使其失去特殊功能,让字符串保持原来的,始终是一个普通的字符串

3、双引号不会转义字符串里面的特殊字符,让特殊字符表示它本身的含义。例如上面的例子,就是把 /n 保持它原本的含义,没有对它进行转义,保持字符串原本的内容

(2)配置对象

       yml配置信息内容如下:

student:
  id: 1
  name: zhangsan
  age: 18

       也可以使用行内写法,形式如下:

student: {id: 1, name: zhangsan, age: 18}

       这时候就不是用@Value读取配置中的对象,而是用注解@ConfigurationProperties这个注解要放在Student类里面,代码如下:(下面的 "perfix = " 可以省略)

@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private int id;
    private String name;
    private int age;
}

       调用类代码如下:使用@Autowired注解注入依赖

@RequestMapping("/yml")
@RestController
public class YmlController {
    @Autowired
    private Student student;
    @RequestMapping("/readStudent")
    public String readStudent() {
        return student.toString();
    }
}

       运行项目,浏览器访问:http://127.0.0.1:8080/yml/readStudent ,结果如下:

       读取到了配置文件里的student。

(3)配置集合

       配置文件也可以配置list集合,和读取对象一样,使用@ConfigurationProperties来读取,yml配置信息内容如下:

list:
  name:
    - mysql
    - sqlserver
    - arraylist

       集合的读取和对象读取一样,使用@ConfigurationProperties来读取,具体实现代码如下:

@ConfigurationProperties(prefix = "list")
@Component
@Data
public class ListConfig {
    private List<String> name;
}

       也可以把注解里括号的 "prefix = " 省略,代码如下:

@ConfigurationProperties("list")
@Component
@Data
public class ListConfig {
    private List<String> name;
}

       调用类代码实现如下:

@RequestMapping("/yml")
@RestController
public class YmlController {
    @Autowired
    private ListConfig listConfig;
    @RequestMapping("/readList")
    public String readList() {
        return listConfig.toString();
    }
}

       运行项目,浏览器访问:http://127.0.0.1:8080/yml/readList ,页面如下:

(4)配置Map

       配置文件也可以配置map,配置信息内容如下:

maptypes:
  map:
    k1: kk1
    k2: kk2
    k3: kk3

       或者是使用行内写法(与上面的写法一致):

maptype: {map: {k1: kk1, k2: kk2, k3: kk3}}

       map读取和上面的一样,使用@ConfigurationProperties注解来读取,这里省略了注解括号里的 "prefix = " ,具体实现代码如下:

@ConfigurationProperties("maptypes")
@Component
@Data
public class MapConfig {
    private HashMap<String, String> map;
}

       调用类代码如下:

@RequestMapping("/yml")
@RestController
public class YmlController {
    @Autowired
    private MapConfig mapConfig;
    @RequestMapping("/readMap")
    public String readMap() {
        return mapConfig.toString();
    }
}

       运行项目,浏览器访问:http://127.0.0.1:8080/yml/readMap,页面如下:

3、yml优缺点

优点:

      1、可读性高,写法简单,易于理解

      2、支持更多的数据类型,可以简单表达对象、数组、List、Map等数据形态

       3、支持更多的编程语言,不止是Java中可以使用,在Golang、Python、Ruby、JavaScript也可以使用

缺点:

       1、不适合写负责的配置文件

比如Properties格式如下:

       转换为yml格式如下:

       

       转换过程也比较花费精力,如果配置更复杂一点的,可读性会更差,代码也会更难写

       2、对格式有较强的要求(一个空格可能就会引起一场血案)


六、总结


       1、properties是以key=value的形式配置的键值类型的配置文件,yml使用的是树形配置方式。

       2、读取配置文件内容,使用 @Value注解,注解内使用 "${ }" 的格式读取。如果要把配置文件放到对象里,就要使用@ConfigurationProperties注解,括号里面写配置文件名,要读取的时候,就使用@Autowired注解注入进来。

       3、yml层级之间使用换行缩进的方式配置,key 和 value之间使用 " : " (英文冒号)加空格的方式设置,并且空格不可省略。

       4、properties 为早期并且默认的配置文件格式,其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题,但不适合复杂配置。

       5、yml 和 properties 可以共存,但一个项目建议使用一种配置类型文件。

       如果yml和properties同时存在:1、两个全部生效,取并集;2、如果两个配置文件冲突时,properties的优先级要高于yml,以properties为准。

相关文章
|
4月前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
916 0
|
1月前
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
83 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
21天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
1月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
46 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
2月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
|
3月前
|
Java Spring 传感器
AI 浪潮席卷,Spring 框架配置文件管理与环境感知,为软件稳定护航,你还在等什么?
【8月更文挑战第31天】在软件开发中,配置文件管理至关重要。Spring框架提供强大支持,便于应对不同环境需求,如电商项目的开发、测试与生产环境。它支持多种格式的配置文件(如properties和YAML),并能根据环境加载不同配置,如数据库连接信息。通过`@Profile`注解可指定特定环境下的配置生效,同时支持通过命令行参数或环境变量覆盖配置值,确保应用稳定性和可靠性。
62 0
|
3月前
|
XML Java 数据库连接
深入解析 Spring 配置文件:从基础到高级
【8月更文挑战第3天】Spring配置文件是构建与管理Spring应用的核心,它涵盖了从基础到高级的各种配置技巧。基础配置采用`.xml`格式定义Bean及其依赖;中级配置包括设置Bean作用域及引入属性文件;高级配置则涉及AOP、事务管理和与其他框架的整合。熟练掌握这些配置能帮助开发者构建出更为灵活且易维护的应用系统。
|
4月前
|
存储 安全 Java
Spring Boot中的配置文件加密
Spring Boot中的配置文件加密
|
5月前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
54 1
|
6月前
|
Java 容器 Spring
Spring的加载配置文件、容器和获取bean的方式
Spring的加载配置文件、容器和获取bean的方式
52 3
Spring的加载配置文件、容器和获取bean的方式