一、 配置文件格式

我们现在启动服务器默认的端口号是 8080,访问路径可以书写为

http://localhost:8080/books/1

在线上环境我们还是希望将端口号改为 80,这样在访问的时候就可以不写端口号了,如下

http://localhost/books/1

SpringBoot 程序如何修改呢?SpringBoot 提供了多种属性配置方式

  • application.properties

    server.port=80
  • application.yml

    server:
    port: 81
  • application.yaml

    server:
    port: 82

注意:SpringBoot 程序的配置文件名必须是 application ,只是后缀名不同而已。

1.1 环境准备

延用Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析里面的环境,结构如下

在该工程中的 com.itheima.controller 包下创建一个名为 BookController 的控制器。内容如下:

@RestController
@RequestMapping("/books")
public class BookController {

   @GetMapping("/{id}")
   public String getById(@PathVariable Integer id){
       System.out.println("id ==> "+id);
       return "hello , spring boot!";
  }
}

1.2 不同配置文件演示

  • application.properties配置文件

现在需要进行配置,配合文件必须放在 resources 目录下,而该目录下有一个名为 application.properties 的配置文件,我们就可以在该配置文件中修改端口号,在该配置文件中书写 port 。

application.properties 配置文件内容如下:

server.port=80

启动服务,会在控制台打印出日志信息,从日志信息中可以看到绑定的端口号已经修改了

  • application.yml配置文件

删除 application.properties 配置文件中的内容。在 resources 下创建一个名为 application.yml 的配置文件,在该文件中书写端口号的配置项,格式如下:

server:
port: 81

注意: 在:后,数据前一定要加空格。

启动服务,可以在控制台看到绑定的端口号是 81

  • application.yaml配置文件

删除 application.yml 配置文件和 application.properties 配置文件内容,然后在 resources 下创建名为 application.yaml 的配置文件,配置内容和后缀名为 yml 的配置文件中的内容相同,只是使用了不同的后缀名而已

application.yaml 配置文件内容如下:

server:
port: 83

启动服务,在控制台可以看到绑定的端口号

1.3 三种配置文件的优先级

在三种配合文件中分别配置不同的端口号,启动服务查看绑定的端口号。用这种方式就可以看到哪个配置文件的优先级更高一些

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

yml格式一般最常使用

二、yaml格式

上面讲了三种不同类型的配置文件,而 properties 类型的配合文件之前我们学习过,接下来我们重点介绍 yaml 类型的配置文件。

YAML(YAML Ain't Markup Language),一种数据序列化格式。这种格式的配置文件在近些年已经占有主导地位,那么这种配置文件和前期使用的配置文件是有一些优势的,我们先看之前使用的配置文件。

最开始我们使用的是 xml ,格式如下:

<enterprise>
   <name>itcast</name>
   <age>16</age>
   <tel>4006184000</tel>
</enterprise>

properties 类型的配置文件如下

enterprise.name=itcast
enterprise.age=16
enterprise.tel=4006184000

yaml 类型的配置文件内容如下

enterprise:
name: itcast
age: 16
tel: 4006184000

优点:

  • 容易阅读

    yaml 类型的配置文件比 xml 类型的配置文件更容易阅读,结构更加清晰

  • 容易与脚本语言交互

  • 以数据为核心,重数据轻格式

    yaml 更注重数据,而 xml 更注重格式

YAML 文件扩展名:

  • .yml (主流)

  • .yaml

上面两种后缀名都可以,以后使用更多的还是 yml 的。

2.1 语法规则

  • 大小写敏感

  • 属性层级关系使用多行描述,每行结尾使用冒号结束

  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)

    空格的个数并不重要,只要保证同层级的左侧对齐即可。

  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

  • # 表示注释

核心规则:数据前面要加空格与冒号隔开

数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔,例如

enterprise:
name: itcast
age: 16
tel: 4006184000
subject:
  - Java
  - 前端
  - 大数据

三、3种yaml配置文件数据读取

3.1 环境准备

新创建一个名为 springboot_03_read_dataSpringBoot 工程,参考Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析,目录结构如下

com.itheima.controller 包写创建名为 BookController 的控制器,内容如下

@RestController
@RequestMapping("/books")
public class BookController {

   @GetMapping("/{id}")
   public String getById(@PathVariable Integer id){
       System.out.println("id ==> "+id);
       return "hello , spring boot!";
  }
}

com.itheima.domain 包下创建一个名为 Enterprise 的实体类等会用来封装数据,内容如下

public class Enterprise {
   private String name;
   private int age;
   private String tel;
   private String[] subject;
   
   //setter and getter
   
   //toString
}

resources 下创建一个名为 application.yml 的配置文件,里面配置了不同的数据,内容如下

lesson: SpringBoot

server:
port: 80

enterprise:
name: itcast
age: 16
tel: 4006184000
subject:
  - Java
  - 前端
  - 大数据

3.2 读取配置数据

3.2.1 使用 @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_00;

   @GetMapping("/{id}")
   public String getById(@PathVariable Integer id){
       System.out.println(lesson);
       System.out.println(port);
       System.out.println(subject_00);
       return "hello , spring boot!";
  }
}

使用postman调接口

可以看到结果已经返回

3.2.2 Environment对象

上面方式读取到的数据特别零散,SpringBoot 还可以使用 @Autowired 注解注入 Environment 对象的方式读取数据。这种方式 SpringBoot 会将配置文件中所有的数据封装到 Environment 对象中,如果需要使用哪个数据只需要通过调用 Environment 对象的 getProperty(String name) 方法获取。具体代码如下:

@RestController
@RequestMapping("/books")
public class BookController {
   
   @Autowired
   private Environment env;
   
   @GetMapping("/{id}")
   public String getById(@PathVariable Integer id){
       System.out.println(env.getProperty("lesson"));
       System.out.println(env.getProperty("enterprise.name"));
       System.out.println(env.getProperty("enterprise.subject[0]"));
       return "hello , spring boot!";
  }
}

注意:这种方式,框架内容大量数据,框架使用的比较多,而在开发中我们很少使用。

3.2.3 自定义对象

SpringBoot 还提供了将配置文件中的数据封装到我们自定义的实体类对象中的方式。具体操作如下:

  • 将实体类 bean 的创建交给 Spring 管理。

    在类上添加 @Component 注解

  • 使用 @ConfigurationProperties 注解表示加载配置文件

    在该注解中也可以使用 prefix 属性指定只加载指定前缀的数据

  • BookController 中进行注入

具体代码如下:

Enterprise 实体类内容如下:

@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.getName());
       System.out.println(enterprise.getAge());
       System.out.println(enterprise.getSubject());
       System.out.println(enterprise.getTel());
       System.out.println(enterprise.getSubject()[0]);
       return "hello , spring boot!";
  }
}

注意:使用第三种方式,在实体类上有如下警告提示

这个警告提示解决是在 pom.xml 中添加如下依赖即可

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

Java开发学习(三十六)----SpringBoot三种配置文件解析的更多相关文章

  1. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  2. Java开发学习(二十二)----Spring事务属性、事务传播行为

    一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...

  3. Java开发学习(二十四)----SpringMVC设置请求映射路径

    一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...

  4. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  5. Java开发学习(二十八)----拦截器(Interceptor)详细解析

    一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...

  6. Java开发学习(四十)----MyBatisPlus入门案例与简介

    一.入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发.提供效率. SpringBoot它能快速构建Spring开发环境用以整合其他技术,使用起来 ...

  7. java web学习总结(十六) -------------------数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  8. Java基础学习笔记十六 集合框架(二)

    List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...

  9. Java开发笔记(十六)非此即彼的条件分支

    前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向.在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在Jav ...

随机推荐

  1. String类型函数传递问题

    String类型函数传递问题 问题 以前没有注意过的一个问题, 最近在使用String类型作为函数入参的时候, 发现函数内对于String类型的改变并不会影响到外层调用对象本身; 结论 (先说结论) ...

  2. day11 Java反射机制

    java反射机制 反射是java中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,属性的调用等,而不是传统意义上的在编码期间确定. 因此,反射可以大大的提高代码的灵活度,但是随之而来 ...

  3. Codeforces 缺省源

    #include <cstdio> #include <algorithm> #include <vector> using namespace std; type ...

  4. Python词频分析

    Python词频分析 一.前言 在日常工作或者生活中,有时候会遇到词频分析的场景.如果是要进行词频分析,那么首先需要对句子进行分词,将句子中的单词进行切割并按照词性进行归类. 在Python中有个第三 ...

  5. html元素height(width)是怎么确定的?

    1.若height是确定的(比如height:100px),则height直接可确定(还受min-height,max-height影响,见height,min-height,max-heigth的作 ...

  6. 使用node命令提示: ‘node‘ 不是内部或外部命令,也不是可运行的程序

    使用node命令提示: 'node' 不是内部或外部命令,也不是可运行的程序 该删的都删了,一切没有任何问题,还nvm use 报错乱码的,只要打开命令提示符  ,以管理员身份运行,就一些正常了 (就 ...

  7. 别梦依稀咒逝川,Ruby二十八年前|M1芯片Mac os系统配置Ruby(3.0.0) on Rails(6.1.1)开发环境(2021最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_188 在每个开发者心里,都会有一门"最好"的语言,在这个世界的某个深处,在一些矫矫不群的人们心中,这门语言的名 ...

  8. 学python,怎么能不学习scrapy呢!

    摘要:本文讲述如何编写scrapy爬虫. 本文分享自华为云社区<学python,怎么能不学习scrapy呢,这篇博客带你学会它>,作者: 梦想橡皮擦 . 在正式编写爬虫案例前,先对 scr ...

  9. AOP实现切入

    6.AOP实现切入 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续,也 ...

  10. Luogu1601 A+B Problem (高精度加法)

    蒟蒻复习了下高精 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...