博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot系列--属性配置
阅读量:4133 次
发布时间:2019-05-25

本文共 5342 字,大约阅读时间需要 17 分钟。

目录


版本:2.0.8.RELEASE

Spring Boot允许外化(externalize)你的配置,这样你能够在不同的环境下使用相同的代码。你可以使用properties文件,YAML文件,环境变量和命令行参数来外化配置。使用@Value注解,可以直接将属性值注入到你的beans中,或者通过Spring的Environment抽象来访问或通过@ConfigurationProperties绑定到结构化对象。spring boot支持多种外部配置方式,常用以下几种:

  1. 命令行参数
  2. 配置文件

更多使用方式请浏览

1、命令行参数

通过java -jar app.jar --name="Spring" --server.port=9090方式来传递参数。

参数用--xxx=xxx的形式传递。

可以使用的参数可以是我们自己定义的,也可以是。

2、配置文件

springboot会加载下面四个位置的application.properties或者application.yml,优先级从上到下依次降低

1)A /config subdirectory of the current directory当前目录的config子目录2)The current directory当前目录3)A classpath /config package类路径的config包4)The classpath root类根路径

配置文件中参数的调用:

2.1、@Value注解直接注入

配置文件application.yml:

name: ExternalizedConf

 代码:

import org.springframework.stereotype.*;import org.springframework.beans.factory.annotation.*;@Componentpublic class MyBean {    @Value("${name}")    private String name;    // ...}

测试类:

/** * 测试value注解 */public class ValueAnnotationTest extends ApplicationTest {    @Value("${name}")    private String name;    @Test    public void test(){        Assert.assertEquals(name, "ExternalizedConf");    }}

 

2.2、通过@ConfigurationProperties绑定到结构化对象

配置文件application.yml:

my:  firstName: yan  list:    - name: my name      description: my description    - name: another name      description: another description  remote-address: 192.168.1.1  servers:    - dev.bar.com    - foo.bar.com  security:    username: user1    password: user1    roles:      - USER      - ADMIN

代码:

import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import java.net.InetAddress;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * 类型安全的配置属性 * 属性加入到spring 的Environment中有两个方法: * 1,在本类中加component注解 * 2,在启动类上加注解@EnableConfigurationProperties(Config.class) * 使用 @ConfigurationProperties,还可以生成meta-data文件,以供IDE使用。(摘取网上内容,需验证) * * YAML lists的例子: * my: *   servers: *   - dev.bar.com *   - foo.bar.com * * 嵌套的例子 * * * 对属性字段名字的匹配,如firstName可以匹配如下4种格式的属性名书写 * my.firstName	Standard camel case syntax. * my.first-name	Dashed notation, recommended for use in.properties and .yml files. * my.first_name	Underscore notation, alternative format for use in .properties and .yml files. * MY_FIRST_NAME	Upper case format. Recommended when using a system environment variables. * * * 配置验证: * @Validated */@Component@ConfigurationProperties(prefix="my")public class MyConfig {    private String firstName;    public String getFirstName() {        return this.firstName;    }    public void setFirstName(String firstName) {        this.firstName = firstName;    }    private List
servers = new ArrayList
(); public String getServerStr() { if(this.servers.size() == 0) return ""; StringBuilder servers = new StringBuilder(); for(String server : this.servers){ servers.append(server).append(","); } servers.setCharAt(servers.length()-1, '\0'); return servers.toString(); } public void setServers(List
servers) { this.servers = servers; } private boolean enabled; private InetAddress remoteAddress; private final Security security = new Security(); public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public InetAddress getRemoteAddress() { return remoteAddress; } public void setRemoteAddress(InetAddress remoteAddress) { this.remoteAddress = remoteAddress; } public Security getSecurity() { return security; } class Security { private String username; private String password; private List
roles = new ArrayList<>(Collections.singleton("USER")); public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List
getRoles() { return roles; } public void setRoles(List
roles) { this.roles = roles; } }}

测试类:

import com.example.conf.MyConfig;import org.junit.Assert;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;/** * 测试ConfigurationProperty */public class ConfigurationPropertyTest extends ApplicationTest {    private MyConfig myConfig;    @Autowired    public void setMyConfig(MyConfig myConfig){        this.myConfig = myConfig;    }    @Test    public void test(){        Assert.assertEquals(myConfig.getFirstName(), "yan");    }}

2.3、属性文件中的占位符

app.name=MyAppapp.description=${app.name} is a Spring Boot application

2.4、使用PropertySource 注解指定配置文件位置和名称

可以不使用默认的配置文件名称和路径,通过PropertySource 注解在configuration注解的类上指定。

配置文件:在resource目录下加入文件my.yml

sender_mail: smtp.bitei.cn

代码:在启动类中加入PropertySource注解

@SpringBootApplication@PropertySource("my.yml")public class Application {    public static void main( String[] args ) {        SpringApplication app = new SpringApplication(Application.class);        app.run();    }}

也可以使用ConfigurationProperties注解的location属性指定自定义配置文件

转载地址:http://qrivi.baihongyu.com/

你可能感兴趣的文章
(转载)正确理解cookie和session机制原理
查看>>
jQuery ajax - ajax() 方法
查看>>
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>
判断一个整数是否是回文数
查看>>
经典shell面试题整理
查看>>
腾讯的一道面试题—不用除法求数字乘积
查看>>
素数算法
查看>>
java多线程环境单例模式实现详解
查看>>
将一个数插入到有序的数列中,插入后的数列仍然有序
查看>>
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>
程序员失误造成服务停用3小时,只得到半月辞退补偿,发帖喊冤
查看>>
码农:很多人称我“技术”,感觉这是不尊重!纠正无果后果断辞职
查看>>
php程序员看过来,这老外是在吐糟你吗?看看你中了几点!
查看>>
为什么说程序员是“培训班出来的”就是鄙视呢?
查看>>