`

Spring Boot(06)——参数配置机制

阅读更多

参数配置机制

Spring Boot默认会读取Classpath根路径下的application.properties文件和application.yml文件作为配置文件(使用properties文件还是yaml文件就看个人的喜好了,就笔者而言,yaml文件结构更好,看起来更加的直观),并把它们封装到Environment对象。在应用中通过注入Enviroment对象就可以获取到application.properties中定义的所有的属性,也可以直接定义属性占位符进行属性值注入。假设在application.yml文件中进行了如下定义,其中test.prop.c的值中又使用了占位符test.prop.a,这在原Spring中也是支持的语法。

test.prop:
  a: valueA
  b: valueB
  c: ${test.prop.a}C

在Spring Boot应用中有如下这样一个bean定义,它有propA、propB和propC一个三个属性,需要分别从Environment中通过test.prop.atest.prop.btest.prop.c进行注入。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import lombok.Data;

@Component
@Data
public class PropResolveSample {

    @Value("${test.prop.a}")
    private String propA;
    
    @Value("${test.prop.b}")
    private String propB;
    
    @Value("${test.prop.c}")
    private String propC;
    
}

这些参数都是可以正常注入的,而且值的来源就来自于定义在application.yml文件中的参数定义,以下是基于Spring Boot和Junit的单元测试代码,可以正常通过。

@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class PropResovleTest {

    @Autowired
    private PropResolveSample propResolveSample;
    @Autowired
    private Environment enviroment;
    
    @Test
    public void test() {
        Assert.assertEquals("valueA", this.propResolveSample.getPropA());
        Assert.assertEquals("valueB", this.propResolveSample.getPropB());
        Assert.assertEquals("valueAC", this.propResolveSample.getPropC());
        
        Assert.assertEquals("valueA", this.enviroment.getProperty("test.prop.a"));
        Assert.assertEquals("valueB", this.enviroment.getProperty("test.prop.b"));
        Assert.assertEquals("valueAC", this.enviroment.getProperty("test.prop.c"));
    }
    
}

其实Spring Boot默认读取的配置文件的位置不仅仅是Classpath根路径,还包括Classpath下的/config路径,当前文件路径和当前文件路径下的config目录。即Spring Boot默认会读取classpath:/application.propertiesclasspath:/config/application.propertiesfile:./application.propertiesfile:./config/application.properties。当这四个路径下都同时存在application.properties文件时,每个application.properties文件都会读取,属性优先级将按照如下顺序,即后面的会覆盖前面的,如果每个路径下的application.properties文件中都定义了一个app.name属性,最终将以file:./config/application.properties中定义的为准。

  • classpath:/
  • classpath:/config/
  • file:./
  • file:./config/

可以通过系统属性spring.config.location来改变读取默认的配置文件的路径,如果有多个路径,多个路径可以使用英文逗号分隔。指定时可以指定的是具体的配置文件路径,也可以是配置文件所在的目录,如果配置的是目录应该以/结尾。同时指定了多个配置文件时后面的配置文件的属性优先级更高。

java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties`

配置文件的名称默认是application,如有需要也可以通过系统属性spring.config.name来更改。通过系统属性spring.config.location指定了配置文件的读取路径后将不再读取默认路径下的配置文件了,如果需要在读取默认位置下的配置文件的同时读取自定义的配置文件,可以使用spring.config.additional-location系统属性进行追加。使用spring.config.additional-location系统属性追加的配置文件的属性值的优先级将高于默认位置下的配置文件中的属性值,且同时追加多个配置文件时后面的配置文件的优先级更高。

关于配置文件路径的更多信息可以参考https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#boot-features-external-config-application-property-files

随机数占位符

在配置占位符时,可以使用random.前缀,之后可以接int、long、uuid等。其中int和long后还可以接参数指定范围,比如random.int(10)表示取10以内的随机数,random.int(10,20)表示取10-20的随机数,取出来的随机数会大于等于10,但是会小于20。随机数占位符会由org.springframework.boot.env.RandomValuePropertySource进行处理。该随机数占位符可以在application.yml文件中使用,也可以直接在bean定义的时候使用。下面的第一段代码就是直接在YAML文件中定义的,而第二段代码的最后两个属性值的注入则是直接通过random占位符进行注入的。

test.random:
  int: ${random.int}
  int10: ${random.int(10)}
  int10-100: ${random.int(10,100)}
  long: ${random.long}
  long-100: ${random.long(100)}
  uuid: ${random.uuid}
  bytes: ${random.bytes}
@Component
@Data
public class RandomExample {

    @Value("${test.random.int}")
    private int randomInt;
    
    @Value("${test.random.int10}")
    private int randomInt10;
    
    @Value("${test.random.int10-100}")
    private int randomInt10_100;
    
    @Value("${test.random.long}")
    private long randomLong;
    
    @Value("${test.random.long100}")
    private long randomLong100;
    
    @Value("${test.random.uuid}")
    private String randomUUID;
    
    @Value("${test.random.bytes}")
    private String bytes;
    
    @Value("${random.int(1000)}")
    private int randomInt1000;
    
    @Value("${random.bytessss}")
    private String bytes2;
    
}

需要注意的是当random.后接的内容不是int、long或uuid时将随机产生一个16位的字节数组,并把它们转换为16进制。输出上面RandomExample对象的toString()会得到类似于下面这样的一个输出:

RandomExample(randomInt=-82870261, randomInt10=9, randomInt10_100=72, randomLong=5569034461519794446, randomLong100=35, randomUUID=be6141ed-afba-43a4-b484-c738f2bc9ce0, bytes=67e403a4d9bf57ea4c0fe53020bff74e, randomInt1000=629, bytes2=e8c741396012ee33060c0bfe1f5e2f52)

访问命令行参数

默认情况下命令行指定的可选参数,即以--开头指定的参数也会被添加到Environment中。比如指定命令行参数为--foo=bar,则可以从Environment中获取到属性foo的值为bar。如果不希望命令行指定的可选参数自动添加到Environment中,则可以通过SpringApplication的setAddCommandLineProperties(false)禁用它。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setAddCommandLineProperties(false);
        app.run(args);
    }

}

profile特性的配置文件

除了加载默认的application.properties文件和application.yml文件外,Spring Boot还会尝试加载application-{profile}.properties文件和application-{profile}.yml文件,其中的profile是当前激活的profile,如果当前没有指定激活的profile,则默认激活的profile是default,则默认情况下还会加载application-default.properties或application-default.yml文件。当激活的profile是abc和def时,则还会尝试加载application-abc.properties文件、application-abc.yml文件、application-def.properties文件和application-def.yml文件。当通用的application.properties中定义的属性在application-{profile}.properties也有定义时,application-{profile}.properties中的将拥有更高的优先级,即profile特性的属性定义会覆盖默认的。在指定需要激活的profile时可以在application.properties文件中进行定义。比如下面代码指定了激活的profile是dev。也可以通过命令行参数--spring.profile.active=dev指定。

spring.profiles.active=dev

yml文件中分profile配置

多profile除了可以为不同的profile定义特殊的配置文件外,还可以把profile下特殊的配置定义在同一个application.yml文件中。yml文件中可以使用---来把配置信息分成多个不同的块,每个块可以使用spring.profiles来指定所属的profile。比如在下面的application.yml配置文件中定义了默认的app.ip为10.10.10.1,当激活的profile包含dev时app.ip的值为10.10.10.2,当激活的profile包含test时app.ip的值为10.10.10.3。

app:
  ip: 10.10.10.1

---

spring:
  profiles: dev
  
app:
  ip: 10.10.10.2
  
---

spring:
  profiles: test
  
app:
  ip: 10.10.10.3

参考文档

https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/html/boot-features-external-config.html

(注:本文是基于Spring Boot 2.0.3所写)

 

本文转自:http://elim.iteye.com/blog/2433185

分享到:
评论

相关推荐

    Spring Boot课件1 —— 创建和运行Spring Boot项目

    **Spring Boot创建与运行项目...理解并熟练运用Spring Boot的创建和运行机制,以及如何与Dubbo集成,对于提升开发效率和构建健壮的微服务架构至关重要。在实际操作中,不断实践和学习将帮助我们更好地掌握这些技术。

    Spring-Boot-Demo

    首先,我们要理解Spring Boot的核心理念——约定优于配置。在Spring Boot项目中,我们不再需要手动编写大量的XML配置文件,而是通过自动配置类和starter模块来简化配置。对于Mybatis的整合,我们可以引入`spring-...

    spring boot 深入浅出源码

    在深入理解Spring Boot的源码时,我们首先要明白其核心设计理念——“约定优于配置”。Spring Boot通过预设默认配置,使得开发者能够快速启动并运行应用,同时提供了丰富的启动器(Starters)来简化依赖管理。 ...

    SpringCloud——分布式配置中心(Spring Cloud Config)

    在微服务架构中,Spring Cloud Config 是一个强大的分布式配置中心,它允许开发人员将应用程序的配置存储在远程仓库中,并且可以在运行时动态地管理和更新这些配置,无需重启应用。这个特性对于大型分布式系统来说...

    spring-boot 自定义xml配置web请求拦截器

    标题中的"spring-boot 自定义xml配置web请求拦截器"指的是在Spring Boot项目中,通过XML配置方式实现对Web请求的拦截处理。这涉及到Spring Boot的Web层架构、AOP(面向切面编程)以及自定义拦截器的概念。Spring ...

    Spring Boot参考指南.pdf

    - **Spring Beans和依赖注入**:阐述Spring框架的核心概念——Bean和依赖注入(DI)机制。 - **使用`@SpringBootApplication`注解**:介绍这个注解的作用及其如何整合多个Spring Boot特性。 - **运行应用程序**: -...

    dubbo——spring boot中整合其他方式1

    Spring Boot以其简洁的配置和快速的开发能力深受开发者喜爱,而Dubbo作为一款高性能的Java RPC框架,能够帮助我们实现服务间的高效通信。下面将详细阐述如何在Spring Boot中整合Dubbo,以及关于方法级别的配置。 ...

    一个基于Spring boot+mybatis客户管理系统

    本项目——“基于Spring Boot+MyBatis的CRM客户管理系统”就是这样一个实用的平台,适合作为开发者的学习模板或企业内部的CRM解决方案。 Spring Boot是Spring框架的简化版,它内置了Tomcat服务器,提供了快速开发...

    spring boot相关书籍

    本压缩包包含的两本书籍——《SpringBoot揭秘》和《spring-boot-中文参考指南》,都是深入理解和掌握Spring Boot的重要资源。 《SpringBoot揭秘》一书主要涵盖了以下核心知识点: 1. **Spring Boot入门**:介绍...

    Spring Boot in Action-chapter 2 sample

    通过本章的学习,我们了解了Spring Boot的核心优势——简化依赖管理和自动化配置。掌握了如何利用Spring Boot Starters快速搭建项目基础框架以及如何利用Spring Boot的自动配置机制减少重复性的工作。这些知识将帮助...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    6.2.1 命令行参数配置 143 6.2.2 常规属性配置 144 6.2.3 类型安全的配置(基于properties) 145 6.3 日志配置 148 6.4 Profile 配置 148 实战 148 6.5 Spring Boot 运行原理 150 6.5.1 运作原理 153 6.5.2 核心注解...

    Spring Boot:启动原理解析.docx

    了解了这些基础知识后,我们可以看到Spring Boot的启动过程是如何通过注解驱动和自动配置机制来简化应用开发的。它减少了手动配置的繁琐工作,使得开发者能够更专注于业务逻辑,提高了开发效率。

    spring boot和mybatis入门

    标题 "spring boot和mybatis入门" 涉及到的是两个关键的Java开发框架——Spring Boot和MyBatis。这两个框架在现代Java应用开发中占据了重要地位,特别是对于快速构建可部署的应用服务。 Spring Boot是Spring框架的...

    Spring 实现远程访问详解——httpinvoker

    上文我们利用Spring rmi实现了Spring的远程访问(Spring 实现远程访问详解——rmi),本文主要讲解利用HttpInvoke实现远程访问。 Spring httpInvoker使用标准java序列化机制,通过Http暴露业务服务。如果你的参数和...

    Spring Boot教程:课件.rar

    本教程聚焦于Spring Boot中的关键知识点,包括日志配置——Logback和Log4j2的使用,多环境配置的处理,以及Properties和YAML配置文件的解析,最后将探讨如何快速搭建一个RESTful API项目。以下是对这些内容的详细...

    SpringBoot+Mybatis整合完整源码

    学习和理解这一整合,不仅有助于提升开发效率,还能让你更好地理解和掌握 Spring Boot 的自动化配置机制以及 Mybatis 的动态 SQL 功能。在实际项目中,你可以根据需求进一步扩展,如集成 Swagger 进行 API 文档管理...

    spring boot blog My-Blog-master.rar

    《Spring Boot博客系统详解——基于My-Blog-master项目》 在现代Web开发中,Spring Boot以其简洁、高效、快速的特点,已经成为Java领域的首选框架之一。本文将深入探讨一个基于Spring Boot构建的博客系统——My-...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    6.2.1 命令行参数配置 143 6.2.2 常规属性配置 144 6.2.3 类型安全的配置(基于properties) 145 6.3 日志配置 148 6.4 Profile 配置 148 实战 148 6.5 Spring Boot 运行原理 150 6.5.1 运作原理 153 6.5.2 核心注解...

    spring-boot使用培训.pdf

    @EnableAutoConfiguration注解让Spring Boot根据添加的jar依赖自动配置Spring应用。例如,如果项目中引入了hibernate的依赖,Spring Boot会自动配置一个嵌入式的数据库,以及数据源等。 SpringBoot的main函数是一个...

    Spring Boot 集成 Flyway,数据库也能做版本控制,太牛逼了!(csdn)————程序.pdf

    在配置方面,Spring Boot同样提供了对Flyway的自动配置。开发者仅需在配置文件中(如application.yml或application.properties)提供必要的配置参数,如数据源信息、数据库用户名和密码,以及Flyway的工作路径等。...

Global site tag (gtag.js) - Google Analytics