第八节:SpringBoot指定配置文件配置三

2022-06-02 18:57:10 浏览数 (1)

系列文章

第一节:创建SpringBoot项目并运行HelloWorld

第二节:SpingBoot单元测试

第三节:SpringBoot中web项目推荐目录结构

第四节:SpringBoot中web模版数据渲染展示

第五节:SpringBoot常用注解介绍

第六节:SpingBoot基本配置一

第七节:SpringBoot高级属性配置二

SpringBoot配置属性的规则

  • 通过.分离各个元素
  • 最后一个.将前缀与属性名称分开
  • 必须是字母(az)和数字(0-9)
  • 必须是小写字母
  • 用连字符-来分隔单词
  • 唯一允许的其他字符是[和],用于List的索引
  • 不能以数字开头

相同的配置项

Spring Boot 2.x 加载配置文件的时候会移除特殊字符并且还会将配置均用全小写的方式进行匹配和加载。

application.properties

代码语言:javascript复制
com.rumenz.id-name=rumenz
com.rumenz.id_name=rumenz
com.rumenz.idName=rumenz
com.rumenz.idname=rumenz

测试

代码语言:javascript复制
package com.rumenz.lession8.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @className: RumenzController
 * @description: TODO 类描述
 * @author: 入门小站 rumenz.com
 * @date: 2021/11/8
 **/
@Controller
@RequestMapping("/rumenz")
public class RumenzController {


    @Value("${com.rumenz.idname}")
    private String comRumenzIdName;

    @RequestMapping("/index")
    @ResponseBody
    public String index(){
        return comRumenzIdName;
    }
}

浏览器访问http://127.0.0.1:8080/rumenz/index,返回rumenz

以上4个配置项是等价的,推荐全小写中间用-分割。

配置文件的优先级

application.properties和application.yml文件可以在放在以下几个位置。

  • 外部:应用程序运行目录的config子目录
  • 外部:应用程序运行目录的跟目录
  • 内部:在config包里面classpath:/config/
  • 内部:在classpath根目录classpath:/

路径

参数值

/springboot-zhinan/lession8/config/application.properties

com.rumenz.level=1

/springboot-zhinan/lession8/application.properties

com.rumenz.level=2

/springboot-zhinan/lession8/src/main/resources/config/application.properties

com.rumenz.level=3

/springboot-zhinan/lession8/src/main/resources/application.properties

com.rumenz.level=4

application.properties中配置了com.rumenz.level

代码语言:javascript复制
com.rumenz.level=1

测试

代码语言:javascript复制
package com.rumenz.lession8.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @className: RumenzController
 * @description: TODO 类描述
 * @author: 入门小站 rumenz.com
 * @date: 2021/11/8
 **/
@Controller
@RequestMapping("/rumenz")
public class RumenzController {
    
    @Value("${com.rumenz.idname}")
    private String comRumenzIdName;

    @Value("${com.rumenz.level}")
    private String comRumenzLevel;

    @RequestMapping("/index")
    @ResponseBody
    public String index(){
        return comRumenzIdName;
    }

    @RequestMapping("/index1")
    @ResponseBody
    public String index1(){
        return comRumenzLevel;
    }

}

使用mvn clean package打包后,使用jar -jar lession8-0.0.1-SNAPSHOT.jar运行。如果上述4个地方都定义了application.properties,并且都配置了com.rumenz.level ,当我们的业务里面需要用com.rumenz.level配置项。查找的优先级是:

  • 1.先找运行目录下的config的application.properties中的com.rumenz.level,找到返回,否则下一步
  • 2.再找运行目录下的application.properties中的com.rumenz.level,找到返回否则下一步
  • 3.再找classpath下的config目录的application.propertiescom.rumenz.level,找到返回否则下一步
  • 4.再找classpath下的application.propertiescom.rumenz.level,找到就返回,找不到就报错,项目启动失败。

命令行参数配置

springboot的application.properties中可以配置一些参数,如端口号,账号,密码。如果我们想在运行的时候想临时修改运行的端口也是可以的。

代码语言:javascript复制
java -jar lession8-0.0.1-SNAPSHOT.jar --server.port=9000

这样项目运行的端口就变成了9000,--server.port=9000相当于在application.properties中配置server.port=9000

系统环境变量

我们也可以在操作系统里面定义变量,然后通过@Value注入到Spring容器中。

代码语言:javascript复制
package com.rumenz.lession8.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @className: RumenzController
 * @description: TODO 类描述
 * @author: 入门小站 rumenz.com
 * @date: 2021/11/8
 **/
@Controller
@RequestMapping("/rumenz")
public class RumenzController {

    //读取系统环境变量
    @Value("${PATH}")
    private String path;
    
    @RequestMapping("/index2")
    @ResponseBody
    public String index2(){
        return path;
    }
    
}

浏览器访问http://127.0.0.1:8080/rumenz/index2,返回/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/share/dotnet:~/.dotnet/tools:/usr/local/mysql/bin:/usr/local/mysql/bin

系统属性

我们可以设置VM arguments向Spring容器传递参数值。

Idea中设置VM arguments

image-20211109215812644

image-20211109215845066

测试

代码语言:javascript复制
package com.rumenz.lession8.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @className: RumenzController
 * @description: TODO 类描述
 * @author: 入门小站 rumenz.com
 * @date: 2021/11/8
 **/
@Controller
@RequestMapping("/rumenz")
public class RumenzController {


    @Value("${spring.test.env}")
    private String springTestEnv;

    @RequestMapping("/index3")
    @ResponseBody
    public String index3(){
        return springTestEnv;
    }

}

浏览器访问http://127.0.0.1:8080/rumenz/index3,返回test

jar包运行设置VM arguments
代码语言:javascript复制
java -jar -Dspring.test.env=testvm lession8-0.0.1-SNAPSHOT.jar

浏览器访问http://127.0.0.1:8080/rumenz/index3,返回testvm

本小结源码地址:

  • GitHub:https://github.com/mifunc/springboot/tree/main/lession8
  • Gitee:https://gitee.com/rumenz/springboot/tree/master/lession8
  • https://rumenz.com/rumenbiji/springboot-config-file.html
  • 我的博客 https://rumenz.com/ ,
  • 我的工具箱 https://tooltt.com/
  • 微信公众号:【入门小站】

0 人点赞