草庐IT

Spring Boot 配置文件

十七ing 2023-04-22 原文

Spring Boot 配置文件

引言

配置文件的作用

一个 Spring Boot 项目中所有重要的数据都是在配置文件中配置的,例如:

  • 数据库的连接信息,包含用户名和密码的设置
  • Spring Boot 项目的启动端口
  • 第三方系统的调用秘钥信息
  • 用于发现和定位问题的日志打印

想象一下,如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至不能保存可以用于排查问题的关键日志。所以配置文件的作用是非常重要的。

一、Spring Boot 配置文件的格式

1. properties ( 老版本)

2. yml ( 新版本 )

注意

1. 理论上说,一个 Spring Boot 项目可以同时使用 " properties " 和 " yml " 配置文件,但不建议一个项目中出现两种配置文件,因为这就是一种规范。 试想,当一个公司在处理一个项目时,一批人用了前者,一批人用了后者,这就比较混乱,若不能实现代码的统一,就很可能出现差错。

2. 如果一个 Spring Boot 项目中真的同时使用了上述的两种配置文件,那么最终配置项就会以 " properies " 为主,从而忽略了 " yml ".

二、配置文件的分类

1.系统的配置文件。

比如数据库连接、日志的相关设置,这些都是框架已经提供好的固定写法。

2. 用户自定义的配置文件。

我们可以自己设置一些想要的配置,但一般很少。因为我们使用 Spring Boot 最多的无非就是 Web 开发,也就是做一个网页的后端,很多东西都是固定的,所以一般来说,使用系统配置好的即可。

三、properties 文件

当我们成功创建一个 Spring Boot 项目后,properties 文件就会自动生成在【resources】目录下。

1. properties 文件的配置语法

properties 的语法和 Map 键值对很类似。

它的注释是 " # ",就相当于 Java 中的 " // ".

例如,我通过 properties 文件,对数据库进行一些配置,重新设置端口号,并尝试与本地数据库建立连接。

# 系统配置文件
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/database?characterEncoding=utf8&&useSSL=false
spring.datasource.name=root
spring.datasource.password=12345

# 自定义配置文件
string1=abc
string2=123

当我们配置好文件后,重新运行启动类,Tomcat 端口号就会直接被改变,那么,当我们使用浏览器发送 HTTP 请求的时候,就不再是 " 8080 " 了,而是当前的 " 9090 ".

2. 注意事项

(1) properties 文件的语法是键值对结构,即 " key=value “,在我们日常写入配置的时候,” = " 的左右不应该留有空格,如:" server.port = 9090 ",这样写是不规范的,因为,有空格就可能会出错,它并不像 Java 代码一样,编译器能够为我们审核。此外,9090 的后面也不应该加上空格。

(2) 实际上,properties 文件,在 IDEA 社区版,Java 并不会为我们实现语法补全,我们需要自己添加插件,但是本人试了好几个插件都没有解决问题,可能是因为自己 IDEA 版本有问题。小伙伴可以自己试一试类似于 " Spring Tools " 这种插件,如果最终解决了最好,如果解决不了也没关系,虽然没有语法补全,但是,常用的与 Web 开发相关的系统配置文件就那么多,多写几遍就能记住了。

(3) 如果 properties 文件的注释出现乱码了,需要通过 IDEA 将当前项目和新创建的项目的全部编码设置为 UTF-8.

3. 读取配置文件

我们创建一个 " UserController2 " 类,在里面写入如下代码:

@Controller
public class UserController2 {

    @Value("${server.port}")
    private String port;

    @ResponseBody
    @RequestMapping("/hello2")
    public String hello() {
        return "port = " + port;
    }
}

运行启动类,打开浏览器输入 URL:

对于上面的格式进行说明:

@Value("${server.port}")
private String port;

第一行代码 " @Value(${ }) " 这是一种固定写法,表示一次性读取单个的配置项。如果我们需要读多个配置项,那就多写几个这样的注解。

第二行代码,就是将刚刚的配置项赋予一个新的成员变量,类似于对象注入。

4. properties 文件的缺点分析

就拿与数据库进行连接操作时,使用的代码来看,代码较为冗余,当我们设置数据库地址、用户、密码的时候,都需要包含 " spring.datasource " 这个前缀,此外,社区版 IDEA 若没有代码补全功能的话,使用起来体验感还是很差的。

spring.datasource.url=
spring.datasource.name=
spring.datasource.password=

四、yml 文件

当我们成功创建一个 Spring Boot 项目后,yml 文件并不会自动生成,所以,我们应该自己创建一个 yml 文件,放在 【resources】目录下。

1. 注意事项

在上面创建 yml 文件的前后,有三个地方需要注意。

(1) 创建 yml 文件的统一名称为 " application.yml ",这是一种规范,Spring Boot 框架只认识这个特殊的名字,如果换成别的名字,就会出错。

(2) 创建好 yml 文件后,我们需要将 properties 文件下的代码都注释掉,以防最终框架忽略了 yml 的代码。

(3) 创建好 yml 文件后,社区版 IDEA 会为我们自动生成 [ 语法补全和语法高亮 ] 的功能,并不需要我们额外添加插件。

2. yml 文件的配置语法

yml 的语法,有效地解决了 properties 文件代码冗余的缺点,它的代码结构与树形结构很相似,共同的部分不需要重复写。

# 系统的配置文件
server:
  port: 8090

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/oj_database?characterEncoding=utf8&&useSSL=false
    name: root
    password: 12345

重新配置的 Tomcat 端口:

3. 语法需要注意的问题

它的基础语法是 " key: value ",由 key 和 value 之间的冒号加空格的方式组成的,其中的空格不可省略。

4. 读取单个配置项

" @Value " 注解读取普通数据

虽然 yml 文件中的配置语法是通过 " : " 的方式进行配置的,但当我们利用注解读取配置文件的时候,还是用 " . " 的方式读取到某个特定的配置项。

@Controller
public class UserController2 {

    @Value("${server.port}")
    private String port;

    @ResponseBody
    @RequestMapping("/hello2")
    public String hello() {
        return "port = " + port;
    }
}

运行启动类,打开浏览器输入 URL:

" @Value " 注解读取单双引号字符串

yml 配置文件:

# 自定义配置文件

string1: hello\nworld
string2: 'hello\nworld'
string3: "hello\nworld"

创建一个 " UserController3 " 类,利用 " @Value " 注解读取上面的三个自定义配置项,代码如下所示:

@Controller
public class UserController3 {

    @Value("${string1}")
    private String sting1;

    @Value("${string2}")
    private String sting2;

    @Value("${string3}")
    private String sting3;

    @ResponseBody
    @RequestMapping("/hello3")
    public String hello() {
        System.out.println(sting1);
        System.out.println(sting2);
        System.out.println(sting3);
        return sting1 + " | " + sting2 + " | " + sting3;
    }
}

IDEA 打印日志和抓包结果:

前端展示结果:

因为 HTML 的换行是 br 标签,所以在这里它并没有实质性的换行。

从上面的展示结果来看,我们可以得出结论:

1. yml 配置文件中的字符串,默认不用加上单引号或双引号。

2. 单引号会对字符串中的特殊字符进行转义。( 比如:" \n " -> " \\n " )

3. 双引号不会转义字符串里面的特殊字符,字符串仍旧表达原语义。

5. yml 文件的对象的配置和读取

yml 文件的对象配置写法有两种,代码如下:

# 配置对象 1
student1:
  id: 1
  name: 杰克
  age: 20

# 配置对象 2
student2: { id: 2, name: 露丝, age: 18 }

创建一个 Student 类,并对类进行注解," @Data " 注解是由 lombok 提供的,它包含了 " Getter、Setter、equals " 等众多方法,所以虽然我们在下面为字段设置了 private 限定符,但在外面的类,依然能够拿到对应值。代码如下:

@Data
@Component // 不能省略
@ConfigurationProperties(prefix = "student1") // 读取配置文件中的对象
public class Student {
    private int id;
    private String name;
    private int age;
}

创建一个 " UserController4 " 类,以属性注入的方式进行 Student 对象注入,并给前端返回一个字符串数据。代码如下:

@Controller
public class UserController4 {

    @Autowired
    private Student student;

    @ResponseBody
    @RequestMapping("hello4")
    public String hello() {
        return student.toString();
    }
}

展示结果:

上面的是读取配置文件中的 student1 对象,如果我们需要读取 student2 对象,只需对 Student 的下面注解进行修改即可。

@ConfigurationProperties(prefix = "student2")

6. yml 文件的集合的配置和读取

yml 文件的集合配置写法有两种,代码如下:

# 配置集合 1
gather1:
  language:
    - HTML
    - CSS
    - JS


# 配置集合 2
gather2: { language: [ C, C++, Java ] }

创建一个 ReadGather 类,并对类进行注解,细节部分我就不不展开说了,它和对象的配置项思路很相似。

@Data
@Controller
@ConfigurationProperties(prefix = "gather2")
public class ReadGather {
    private List<String> language;
}

创建一个 " UserController5 " 类,以属性注入的方式进行 ReadGather 对象注入,并给前端返回一个字符串数据。代码如下:

@Controller
public class UserController5 {

    @Autowired
    private ReadGather readGather;

    @ResponseBody
    @RequestMapping("/hello5")
    public String hello5() {
        return "gather: " + readGather.getLanguage();
    }
}

展示结果:

五、更多的官方配置项

Spring Boot 常用的系统配置项,随着我们学习的深入,多写几遍就能记住,如果万一我们记不住了,或想要查看系统更多的配置项,我们就可以访问官网:

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

六、对比 properties 和 yml

1. properties 是以 " key=value " 的形式配置文件, yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用冒号加空格的方式设置,并且空格不可省略。

2. properties 为早期默认的配置文件格式,但其配置存在一定的冗余数据,yml 算是 properties 的新版本,它可以很好地解决数据冗余的问题。此外,yml 写法更简单、可读性更高,并支持更多的数据类型。

3. yml 的通用性更好,支持更多语言,例如 Java、Go、Python 等。如果是云服务器开发,项目可以使用同一份配置文件作为多种语言的共同配置文件。这是 yml 的一个很大的特点,它有利于不同开发人员做的同一个项目。

4. yml 虽然可以和 properties 共存,但一个项目中建议只使用其中一种。

有关Spring Boot 配置文件的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐