文章目录

  • SpringBoot项目配置
  • 0x01_properties格式配置文件
  • 0x02_yml格式配置文件
  • 配置对象类型数据
  • 配置集合类型
  • 配置数组类型
  • 0x03_properties和yml的区别
  • 优先级
  • 区别
  • 0x04_配置文件在项目中的位置
  • 0x05_bootstrap配置文件
  • 0x06_springboot项目结构


SpringBoot项目配置

SpringBoot默认读取项目下名字为application开头的 yml, yaml, properties这些格式。

Spring Initializer IDEA内置的插件创建的项目为例,在pom.xml文件中,会引入依赖的父工程:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.5</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

查看这个依赖:里面有resources标签中指定了配置文件的命名和格式:

<resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
          <include>**/application*.yml</include>
          <include>**/application*.yaml</include>
          <include>**/application*.properties</include>
        </includes>
      </resource>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <excludes>
          <exclude>**/application*.yml</exclude>
          <exclude>**/application*.yaml</exclude>
          <exclude>**/application*.properties</exclude>
        </excludes>
      </resource>
    </resources>

必须是以application开头的文件,扩展名是yml或者yaml或者properties

0x01_properties格式配置文件

尝试在项目下的application.properties里修改端口号和项目上下文路径 :

怎么书写呢,需要参考Spring的官网:https://docs.spring.io/spring-boot/docs/current/reference/html/

找到Application Properties查看:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

平时要养成读官方文档的习惯。如果是英文的也要尝试读。

比如要配置端口号和项目的上下文路径,那么需要找server相关的配置:

springboot整个项目的请求路径 springboot设置项目路径_spring

其他同理.

server.port=8091
server.servlet.context-path=/test

此时将项目的端口号部署为8090,项目的上下文路径为/test,这里一定要在开头写/,并且不能再结尾写/,否则会报这个错:

ContextPath must start with '/' and not end with '/'

启动项目,访问controller

http://localhost:8091/test/testController4

发现配置生效。

0x02_yml格式配置文件

由properties格式转换成yml格式:properties每一个. 都代表一个层级,转换成yml之后,使用缩进代表层级关系

比如这样的properties格式:

server.port=8091
server.servlet.context-path=/test

转换成yml格式:

server:
  port: 8091
  servlet:
    context-path: /test

注意yml格式的要求:

  • 大小写敏感
  • 使用缩进代表层级关系 (一般缩紧就2个空格)
  • 相同的部分只出现一次 (层级相同的可以写一起)
  • 注意空格 (在值前面有一个空格,在新的层级前有2个空格)

除了以上这些普通的配置之外,还可以配置特殊的:

配置对象类型数据

student:
  id: 1
  name: 张三
  age: 18

等于:

student: {id: 1,name: 张三,age: 18}

补充:从配置文件读取自定义的对象,就不可以使用@Value注解来读取了,需要使用@ConfigurationProperties注解来进行对象的读取,并且对于的类必须有getter/setter方法。(当然一般可能不会这么读取这种数据)

配置集合类型

dbtypes:
	name:
		- mysql
		- sqlserver
		- db2

等于

dbtypes: {name: [mysql, sqlserver, db2]}

配置数组类型

orgs:
    - math
    - chinese
    - english

其实和集合差不多。

0x03_properties和yml的区别

优先级

如果一个项目中出现了既有yml又有properties的配置,那么出现冲突了,该听谁的呢?

如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。
如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的

区别

properties yml 都是 Spring Boot 支持的两种配置文件,它们可以看作是 Spring Boot 在不同时期的两款“产品”。

properties 配置文件属于早期,也是目前创建 Spring Boot(2.x)项目时默认的配置文件格式,而 yml 可以看做是对 properties 配置文件的升级,属于 Spring Boot 的“新版”配置文件。

  • 语法不同
  • properties为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用yml可以很好的解决数据冗余的问题。
  • yml通用性更好,支持更多语言,如Java、Go、Python等,如果是云服务器开发,可以使用一份配置文件作为Java和Go的共同配置文件。
  • yml虽然可以和properties共存,但一个项目中建议使用统一的配置类型文件。
  • yml支持更多的数据类型,如对象和集合

拓展:

  • 定位不同:properties 翻译成中文是“属性”的意思,所以它在创建之初,就是用来在 Spring Boot 中设置属性的。 yml 是 YAML 是缩写,它的全称 Yet Another Markup Language,翻译成中文是“另一种标记语言”。

所以从二者的定义可以看出:它们的定位和层次是完全不同的,properties 只是用来设置一些属性配置的,而 yml 的格局和愿景更大,它的定位是“另一种标记语言”,所以从格局上来讲 yml 就甩 properties 好几条街。

  • 语法不同:properties 的基本语法格式是“key=value”的形式yml 的基本语法格式是“key: value”的形式相比于 properties 来说,yml 的语法更简洁,并且可读性更高
  • yml可以配置更多的数据类型:对象,数组
  • 跨语言:properties 格式的配置文件只适用于 Spring Boot 项目,也就是只适用于 Java 语言,而 yml 支持更多的开发语言,它可以用在 Java、PHP、Python、Ruby、JavaScript、Perl、Golang 等语言中。
    至于作用嘛?如果一个公司有多个不同语言的开发团队,并且使用了配置中心(在线配置文件)的前提下,那么这些不同语言的开发团队就可以使用同一份配置文件了,也方便后期的管理和维护。

0x04_配置文件在项目中的位置

有4个位置,SpringBoot会将它们识别为是配置文件:

  • 项目的根目录下:

springboot整个项目的请求路径 springboot设置项目路径_配置文件_02

  • 项目根目录下的/config子目录中:

springboot整个项目的请求路径 springboot设置项目路径_spring boot_03

  • resources目录下(即classpath跟路径中):

springboot整个项目的请求路径 springboot设置项目路径_java_04

  • 项目的resources即classpath根路径下的/config目录中

springboot整个项目的请求路径 springboot设置项目路径_spring boot_05

如果各个位置文件有冲突,优先级是?

当前项目根目录下的一个/config子目录中(最高)

config/application.properties

config/application.yml

当前项目根目录中(其次)

application.properties

application.yml

项目的resources即classpath根路径下的/config目录中(一般)

resources/config/application.properties

resources/config/application.yml

项目的resources即classpath根路径中(最后)

resources/application.properties

resources/application.yml

0x05_bootstrap配置文件

Spring Boot 中有两种上下文对象,一种是 bootstrap, 另外一种是 application(ServletContext), bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

bootstrap配置文件特征

①boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载。

②boostrap 里面的属性不能被覆盖。

bootstrap与 application 的应用场景

application 配置文件主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景。

①使用 SpringCloudConfig 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息。

②一些固定的不能被覆盖的属性。

③一些加密/解密的场景。

0x06_springboot项目结构

-- 项目名 
  --src 
  	--main 
  		--java 
  			java代码 
  		--resources 
  			--public 公共资源。所有共享的内容。对外公开的内容。 
  			--static静态资源。图片、js、css。不会被服务器解析。 
  				--js 
  					-- jquery.js 访问:http://ip:port/js/jquery.js 
            注意:该目录是SpringBoot可以直接识别的目录,会将其中的 
            静态资源编译到web项目中,并放到tomcat中使用。静态资源的 
            访问路径中无需声明static 例如:localhost:8080/a.png 
  			--templates  
     			FreeMarker  thymeleaf 页面所在目录。 
  		--webapp 只有当页面使用jsp时才有。 
  			--WEB-INF

设置WEB-INF

springboot整个项目的请求路径 springboot设置项目路径_spring boot_06

其实一般没有特殊要求,不去配置webapp是比较好的。