`
234390216
  • 浏览: 10194053 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460820
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771875
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395479
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393916
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678251
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529318
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178772
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:462007
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150167
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66889
社区版块
存档分类
最新评论

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所写)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    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 核心注解...

    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 核心注解...

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

    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 核心注解...

    基于SpringBoot的仿牛客论坛源码.zip

    ——邮箱参数配置。 ——使用JavaMailSender发送邮件。 模板引擎: ——使用Thymeleaf发送HTML邮件。 注册功能使用邮箱验证。 访问注册页面: ——点击顶部区域内的链接,打开注册页面。 提交注册数据: ——通过...

    SpringBoot +esapi 实现防止xss攻击 实战代码,满满干货

    SpringBoot +esapi 实现防止xss攻击 实战代码,真实有效

    spring-boot-shiro.rar

    1.没有登录情况:访问api接口--->shiro配置拦截——->跳转到shiro配置的setLoginUrl(“”)接口 2.去登陆【前提设置开放登陆接口filterChainDefinitionMap.put("/login", "anon");,不然会被拦截,走步骤1】:...

    基于Java的定制公交系统设计与实现.zip

    Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf、Bootstrap、Hplus),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告...

    毕设项目——基于SpringBoot的企业信息化管理系统(内含搭建流程)

    技术包括:Spring Boot、Apache Shiro、MyBatis、MySQL、Thymeleaf、Bootstrap、Hplus 功能包括: 用户管理、部门管理、岗位管理、菜单管理、角色管理、字典管理、参数管理、通知公告、操作日志、登录日志、在线用户...

    前后端分离+Vue和html两种实现方式+SpringBoot++下载即可跑通

    后端使用SpringBoot,前端采用两种方式,一种是原生Html,一种是集成的Vue-cli,后端的相关参数我已经配置好了,大家可以直接下载运行尝试了,如果想要进一步创建自己的人脸库,可以根据我的博客专栏——计算机毕业...

    2021最新java面试合集pdf.rar

    Docker —— 从入门到实践 - v1.0.pdf Dubbo部署文档.doc Dubbo面试专题.docx java后端面试题答案.pdf Java并发Fork-Join框架原理解析.docx JAVA核心知识整理.pdf JAVA核心知识点整理.pdf Java面试笔记.docx JAVA...

Global site tag (gtag.js) - Google Analytics