ramostear.comramostear.com 谭朝红的技术分享博客

格言 编程是一门技术,也是一门艺术 !

配置Spring Boot 应用程序参数

配置Spring Boot 应用程序参数

Spring Boot(四)—应用程序属性

Spring Boot应用程序属性支持我们开发的应用工作在不同的环境中。在本章节中,我将展示如何配置和指定Spring Boot 应用程序的属性。

1. 命令行属性

Spring Boot应用程序可以将命令行属性转换为Spring Boot Environment属性。在Spring Boot中,命令行属性的优先级高于其他资源属性。在默认情况下,Spring Boot使用8080端口作为Tomcat的启动端口。下面让我们使用命令行属性来更改端口号:

  • 1.创建可执行的JAR文件,然后使用命令 java -jar 运行jar文件。

  • 2.使用命令行更改Spring Boot应用程序的默认端口号

    D:\work\2019\domain-driver-design\deploy-tomcat\target> java -jar deploy-tomcat-0.0.1-SNAPSHOT.war --server.port = 8888
    

    :你可以使用分隔符“-”来分割多个属性

2. 属性文件

属性文件的作用是可以在单个文件中设置多个属性的值。在Spring Boot 应用程序中,属性保存在类路径下的application.properties文件中。通常情况下,application.properties文件存放在src/main/resource目录中,其属性设置格式如下:

server.port = 8888
server.tomcate.max-http-post-size = -1
spring.application.name = spring-boot-tutorial
spring.datasource.username = admin
spring.datasource.password = springboottutorial
...

3 . YAML文件

Spring Boot应用程序支持基于YAML格式的属性配置文件为Spring Boot提供属性设置。YAML文件时Spring Boot比较推荐的属性配置文件,相较于application.properties文件,YAML配置文件册层次更为清晰。同样的,YAML文件也存放于类路径下(“src/main/resource”),其文件内容格式为:

server:
  port: 8888
  tomcate:
    max-http-post-size: -1
spring: 
  application:
    name: spring-boot-tutorial
  datasource:
    username: admin
    password: springboottutorial
  mvc:
    favicon:
      enabled: false

注:YAML文件中,每个属性的上下层级之间相差两个空格

4. 外部属性文件

Spring Boot支持我们将属性配置文件放在外部空间中,而不仅仅局限于将配置文件放置在类路径下。在运行JAR文件的时候,我们可以指定外部配置文件的存放路径。

D:\work\2019\domain-driver-design\deploy-tomcat\target> java -jar -Dspring.config.location = D:\work\configs\application.properties deploy-tomcat-0.0.1-SNAPSHOT.war

5. @Value 注解

在Spring Boot应用程序中,可以使用@Value注解读取应用中的属性值,其读取相关属性值得语法如下:

@Value("${property_key_name}")
Object param;

接下来,我们将演示使用@Value注解来读取application.properties配置文件中spring.application.name属性的值:

@Value("${spring.application.name}")
private String appName;

完整的示例代码:

package com.ramostear.spring.boot.properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SpringBootPropertiesApplication {

    @Value("${spring.application.name}")
    private String appName;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootPropertiesApplication.class, args);
    }

    @GetMapping("/")
    public String say(){
        return appName;
    }
}

application.properties文件内容:

spring.application.name= Spring Boot Properties Demo

下面,我们启动程序,并在浏览器地址栏中输入:http://localhost:8080/ ,观察浏览器页面结果:

注:如果在程序运行时没有在配置文件中提供该属性,则Spring Boot将抛出IllegalArgumentException异常信息:

Could not resolve placeholder 'spring.application.name' in value "${spring.application.name}"

因为Spring Boot无法解析表达式“${spring.application.name}”中的占位符“spring.application.name”。

要解决上面演示的问题,只需要在表达式后面增加一个默认的属性值即可。

  • 语法:

    @Value("${property_key_name:default_value}")
    
  • 代码示例:

    package com.ramostear.spring.boot.properties;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class SpringBootPropertiesApplication {
    
        @Value("${spring.application.name:Spring Boot Application}")
        private String appName;
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootPropertiesApplication.class, args);
        }
    
        @GetMapping("/")
        public String say(){
            return appName;
        }
    }
    

再次运行应用程序,观察浏览器页面变化:

6. active配置模式

Spring Boot支持基于Spring active模式来设置不同环境下的应用属性。例如,我们可以创建两份配置文件application_dev.properties和application_prod.properties,application_dev.properties用于开发环境中设置属性,application_prod.properties则用于生产环境中配置应用属性。

首先,我们来看一下默认的application.properties文件中的配置:

server.port = 8888
spring.application.name = Default Spring Boot Application Name

启动应用程序,观察控制台输出信息:

2019-03-05 01:29:19.590  INFO 7828 --- [main] .r.s.b.p.SpringBootPropertiesApplication : 
No active profile set, falling back to default profiles: default

2019-03-05 01:29:20.869  INFO 7828 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : 
Tomcat initialized with port(s): 8888 (http)

现在,Tomcat服务器已经使用8888端口启动成功,且提示没有设置任何的active profile。

接下来,我们创建两个active配置文件application_dev.properties和application_prod.properties,其配置内容如下。

application_dev.properties配置文件:

server.port = 8081
spring.application.name = Development Spring Boot Application Name

application_prod.properties配置文件:

server.port = 8082
spring.application.name = Product Spring Boot Application Name

两个独立的配置文件准备好后,我们需要调整application.properties文件的配置内容,以模拟使用active配置文件来切换不同环境下使用不同的属性配置:

  • 1.将默认的属性配置切换到dev模式上,切换到开发环境上的配置命令如下:

    D:\work\2019\domain-driver-design\spring-boot-properties\target> java -jar spring-boot-properties-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
    

    你可以在控制台中观察到如下的输出:

    2019-03-05 02:02:00.013  INFO 7700 ---[main] .r.s.b.p.SpringBootPropertiesApplication : The following profiles are active: dev
    2019-03-05 02:02:01.697  INFO 7700 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
    2019-03-05 02:02:01.732  INFO 7700 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    

    现在,Tomcat服务器已经使用端口8081(http)

  • 2.接下来,我们再将应用从dev切换到prod环境上,执行如下命令:

    D:\work\2019\domain-driver-design\spring-boot-properties\target>java -jar spring-boot-properties-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
    

    你可以在控制台中观察到如下的输出:

    2019-03-05 02:09:33.983  INFO 5944 --- [main] .r.s.b.p.SpringBootPropertiesApplication : The following profiles are active: prod
    
    2019-03-05 02:09:35.643  INFO 5944 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8082 (http)
    
    2019-03-05 02:09:35.678  INFO 5944 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    

    现在,Tomcat服务器已经使用端口8082(http)

如果应用使用的是YAML文件来配置应用属性,我们可以将不同环境的配置信息放在一个配置文件中,而不用像使用properties文件那样创建多个独立的配置文件。

下面我们将演示使用YAML文件来配置并切换不同环境下的属性配置,在YAML文件中,使用分隔符“—-”来分割不同active下的属性配置:

application.yml配置文件

spring:
   application:
      name: Default Spring Application Name
server:
   port: 8080

---
spring:
   profiles: dev
   application:
      name: Development Spring Application Name
server:
   port: 8081

---
spring:
   profiles: prod
   application:
      name: Product Spring Application Name
server:
   port: 8082

说明:使用YAML作为配置文件时,切换active的命令与使用Properties配置文件时一致。

(转载本站文章请注明作者和出处:谭朝红-ramostear.com,未经允许请勿做任何商业用途)

发表评论