我们现在启动服务器默认的端口号是 8080
,访问路径可以书写为
在线上环境我们还是希望将端口号改为 80
,这样在访问的时候就可以不写端口号了,如下
而 SpringBoot
程序如何修改呢?SpringBoot
提供了多种属性配置方式
application.properties
server.port=80
application.yml
server:
port: 81
application.yaml
server:
port: 82
注意:SpringBoot
程序的配置文件名必须是 application
,只是后缀名不同而已。
application.properties
配置文件配置文件必须放在 resources
目录下,而该目录下有一个名为 application.properties
的配置文件(SpringBoot已经为我们提供好了),我们就可以在该配置文件中修改端口号,在该配置文件中书写 port
,Idea
就会补全提示
application.properties
配置文件内容如下:
server.port=80
启动服务,会在控制台打印出日志信息,从日志信息中可以看到绑定的端口号已经修改了
Tomcat initialized with port(s): 80 (http)
application.yml
配置文件删除 application.properties
配置文件中的内容。在 resources
下创建一个名为 application.yml
的配置文件,在该文件中书写端口号的配置项,格式如下:
server:
port: 81
注意: 在:
后,数据前一定要加空格。
启动服务,可以在控制台看到绑定的端口号是 81
Tomcat initialized with port(s): 81 (http)
application.yaml
配置文件删除 application.yml
配置文件和 application.properties
配置文件内容,然后在 resources
下创建名为 application.yaml
的配置文件,配置内容和后缀名为 yml
的配置文件中的内容相同,只是使用了不同的后缀名而已
application.yaml
配置文件内容如下:
server:
port: 82
启动服务,在控制台可以看到绑定的端口号
Tomcat initialized with port(s): 82 (http)
在三种配合文件中分别配置不同的端口号,启动服务查看绑定的端口号。用这种方式就可以看到哪个配置文件的优先级更高一些
application.properties
文件内容如下:
server.port=80
application.yml
文件内容如下:
server:
port: 81
application.yaml
文件内容如下:
server:
port: 82
启动服务,在控制台可以看到使用的端口号是 80
。说明 application.properties
的优先级最高
注释掉 application.properties
配置文件内容。再次启动服务,在控制台可以看到使用的端口号是 81
,说明 application.yml
配置文件为第二优先级。
从上述的验证结果可以确定三种配置文件的优先级是:application.properties
> application.yml
> application.yaml
<aside> 🌷 注意:
SpringBoot
核心配置文件名为 application
SpringBoot
内置属性过多,且所有属性集中在一起修改,在使用时,通过代码补全+关键字修改属性
例如要设置日志的级别时,可以在配置文件中书写 logging
,就会提示出来。配置内容如下
logging:
level:
root: info
</aside>
上面讲了三种不同类型的配置文件,而 properties
类型的配合文件之前我们学习过,接下来我们重点学习 yaml
类型的配置文件。
YAML(YAML Ain’t Markup Language),一种数据序列化格式。这种格式的配置文件在近些年已经占有主导地位,那么这种配置文件和前期使用的配置文件是有一些优势的,我们先看之前使用的配置文件。
最开始我们使用的是 xml
,格式如下:
<enterprise>
<name>Helsing</name>
<age>16</age>
<tel>400-957-241</tel>
</enterprise>
而 properties
类型的配置文件如下
enterprise.name=Helsing
enterprise.age=16
enterprise.tel=400-957-241
yaml
类型的配置文件内容如下
enterprise:
name: Helsing
age: 16
tel: 400-957-241
通过对比,我们得出yaml的优点有:
yaml
类型的配置文件比 xml
类型的配置文件更容易阅读,结构更加清晰yaml
更注重数据,而 xml
更注重格式YAML 文件扩展名:
.yml
(主流).yaml
上面两种后缀名都可以,以后使用更多的还是 yml
的。
大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束
使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
核心规则:数据前面要加空格与冒号隔开
数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔,例如
enterprise:
name: Helsing
age: 16
tel: 400-957-241
subject:
- Java
- Python
- C#
修改resource
目录下的application.yml
配置文件
lesson: SpringBoot
server:
port: 80
enterprise:
name: Helsing
age: 16
tel: 400-957-241
subject:
- Java
- Python
- C#
在com.blog.domain
包下新建一个Enterprise类,用来封装数据
package com.blog.domain;
import java.util.Arrays;
public class Enterprise {
private String name;
private int age;
private String tel;
private String[] subject;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String[] getSubject() {
return subject;
}
public void setSubject(String[] subject) {
this.subject = subject;
}
@Override
public String toString() {
return "Enterprise{" +
"name='" + name + '\\'' +
", age=" + age +
", tel='" + tel + '\\'' +
", subject=" + Arrays.toString(subject) +
'}';
}
}
方式一:使用 @Value注解
@Value("表达式")
注解可以从配合文件中读取数据,注解中用于读取属性名引用方式是:${一级属性名.二级属性名……}
BookController
中使用 @Value
注解读取配合文件数据,如下@RestController
@RequestMapping("/books")
public class BookController {
@Value("${lesson}")
private String lesson;
@Value("${server.port}")
private Integer port;
@Value("${enterprise.subject[0]}")
private String subject_0;
@GetMapping("/{id}")
public String getById(@PathVariable Integer id) {
System.out.println(lesson);
System.out.println(port);
System.out.println(subject_0);
return "hello , spring boot!";
}
}
方式二:使用Environment对象
上面方式读取到的数据特别零散,SpringBoot
还可以使用 @Autowired
注解注入 Environment
对象的方式读取数据。这种方式 SpringBoot
会将配置文件中所有的数据封装到 Environment
对象中,如果需要使用哪个数据只需要通过调用 Environment
对象的 getProperty(String name)
方法获取。具体代码如下
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private Environment environment;
@GetMapping("/{id}")
public String getById(@PathVariable Integer id) {
System.out.println(environment.getProperty("lesson"));
System.out.println(environment.getProperty("enterprise.name"));
System.out.println(environment.getProperty("enterprise.subject[1]"));
return "hello , spring boot!";
}
}
方式三:使用自定义对象
SpringBoot
还提供了将配置文件中的数据封装到我们自定义的实体类对象中的方式。具体操作如下:@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
private String name;
private int age;
private String tel;
private String[] subject;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String[] getSubject() {
return subject;
}
public void setSubject(String[] subject) {
this.subject = subject;
}
@Override
public String toString() {
return "Enterprise{" +
"name='" + name + '\\'' +
", age=" + age +
", tel='" + tel + '\\'' +
", subject=" + Arrays.toString(subject) +
'}';
}
}
BooKController内容如下
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private Enterprise enterprise;
@GetMapping("/{id}")
public String getById(@PathVariable Integer id) {
System.out.println(enterprise);
System.out.println(enterprise.getAge());
System.out.println(enterprise.getName());
System.out.println(enterprise.getTel());
return "hello , spring boot!";
}
}
<aside> 🌷 可能遇到的问题:
</aside>