SpringBoot默认配置好了许多配置,使开发变得不在那么繁琐;但是,默认的配置,肯定不能满足变化多端、环境各异的系统的需要,因此SpringBoot提供了两种配置方式:
properties和yml
1. properties文件
项目创建之后,SpringBoot会默认在src/main/resources下帮你创建一个application.properties文件
默认创建的application.properties文件里面没有内容,是一个空文件,不过springboot已经默认配置好了很多配置,如果要自定义,则可以在这个文件中进行配置。
SpringBoot有多到没法记的可配置项,所以说有开发工具的自动提示功能也是极好,自动提示的配置名和配置的内容(不过注意要使用Spring Properties Editor打开才会提示)。
自动提示设置:
- 1.Help->Eclipse Marketplace
- 2.安装spring tools
- 3.右键点击application.properties文件,用spring properties editor编辑器打开
- 4.提示成功出现
2.yml文件
YAML,全称Yet Another Markup Language,是“另一种标记语言”的外语缩写;但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。它是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。– 百度百科
个人觉得,yaml文件在SB配置文件中就是xml+json+Properties,它汲取了三者的最简单易用的地方结合到了一起,可读性比这3者更强,而且所需的字符更少。除了用作配置文件外,YAML也可以像XML和JSON用来序列化对象。
YAML在使用时,比properties多了一些格式上的要求,最基本的格式就是 key: value,注意,这个冒号和value之间要有一个空格!YAML也支持多层次的key,大致格式如下(如果是回车,冒号后面则不需要空格)
key:
key1: value1
key2: value2
两种配置文件的作用是一样的,不过yml文件阅读更直观
配置文件详解
1、 自定义属性
当我们创建一个springboot项目的时候,系统默认会为我们在src/main/Java/resources目录下创建一个application.properties。个人习惯,我会将application.properties改为application.yml文件,两种文件格式都支持。
在application.yml自定义一组属性:
my:
name: wude
age: 18
如果你需要读取配置文件的值只需要加@Value(“${属性名}”):
@RestController
public class GetYmlValue{
@Value("${my.name}")
private String name;
@Value("${my.age}")
private int age;
@RequestMapping("/getUserDefined")
public String getUserDefined() {
return name + " : " + age;
}
}
2、将配置文件的属性赋给实体类
当我们有很多配置属性的时候,这时我们会把这些属性作为字段来创建一个javabean,并将属性值赋予给他们,比如:
my:
name: forezp
age: 12
number: ${random.int}
uuid : ${random.uuid}
max: ${random.int(10)}
value: ${random.value}
greeting: hi,i'm ${my.name}
其中配置文件中用到了${random} ,它可以用来生成各种不同类型的随机值。
怎么将这些属性赋于给一个javabean 呢,首先创建一个javabean :
@ConfigurationProperties(prefix = "my")
@Component
public class ConfigBean {
private String name;
private int age;
private int number;
private String uuid;
private int max;
private String value;
private String greeting;
//省略了getter setter....
需要加个注解@ConfigurationProperties,并加上它的prrfix。@Component可加可不加。会提示spring-boot-configuration-processor依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
需要在应用类或者application类,加EnableConfigurationProperties注解。(我没有配置这个注解也拿到了)
@RestController
@EnableConfigurationProperties({ConfigBean.class})
public class GetYmlValue {
@Autowired
private ConfigBean configBean;
@RequestMapping("/getConfigBean")
public ConfigBean getConfigBean() {
return configBean;
}
}
启动工程,访问localhost:8080/getConfigBean,我们会发现配置文件信息读到了。
3、自定义配置文件
上面介绍的是我们都把配置文件写到application.yml中。有时我们不愿意把配置都写到application配置文件中,这时需要我们自定义配置文件,比如test.properties:
com.forezp.name=forezp
com.forezp.age=12
怎么将这个配置文件信息赋予给一个javabean呢?
@Configuration
@PropertySource(value = "classpath:test.properties")
@ConfigurationProperties(prefix = "com.forezp")
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在最新版本的springboot,需要加这三个注解。@Configuration
@PropertySource(value = “classpath:test.properties”)
@ConfigurationProperties(prefix = “com.forezp”);在1.4版本需要
PropertySource加上location。
@RestController
@EnableConfigurationProperties({ConfigBean.class,User.class})
public class LucyController {
@Autowired
ConfigBean configBean;
@RequestMapping(value = "/lucy")
public String miya(){
return configBean.getGreeting()+" >>>>"+configBean.getName()+" >>>>"+ configBean.getUuid()+" >>>>"+configBean.getMax();
}
@Autowired
User user;
@RequestMapping(value = "/user")
public String user(){
return user.getName()+user.getAge();
}
}
启动工程,打开localhost:8080/user;浏览器会显示:
forezp12
4、多个环境配置文件
在现实的开发环境中,我们需要不同的配置环境;格式为application-{profile}.properties,其中{profile}对应你的环境标识,比如:
- application-test.properties:测试环境
- application-dev.properties:开发环境
- application-prod.properties:生产环境
怎么使用?只需要我们在application.yml中加:
spring:
profiles:
active: dev
其中application-dev.yml:
server:
port: 8082
启动工程,发现程序的端口不再是8080,而是8082。