springboot启动时会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:
优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件
我们来配置环境时,可以创建多个不同的配置文件来对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境。以下分别通过.properties文件以及.yaml文件来实现。
2.1 properties文件
在resource文件夹下,分别创建application-test.properties文件(代表测试环境配置)以及application-dev.properties(代表开发环境配置),然后再application.properties文件中写上:
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;
#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
spring.profiles.active=dev
这样SpringBoot启动时就会读取application-dev.properties文件,同理写上spring.profiles.active=test则会读取application-test.properties文件。
2.2 yaml文件
采用yaml文件实现多环境切换的好处是并不需要创建那么多的配置文件,只需要一个yaml文件就能完成,如下所示:
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev #配置环境的名称
---
server:
port: 8084
spring:
profiles: prod #配置环境的名称
上述配置文件中表示将激活名为prod的环境模块,那么启动springboot时,tomcat的端口号就为8084了。
springboot一般可通过@ConfigurationProperties注解或者@Value注解来进行JavaBean属性赋值。
1.@ConfigurationProperties的作用:
将配置文件中配置的每一个属性的值,映射到使用该注解的JavaBean中,并将JavaBean中的所有属性与名为application的配置文件中相关的配置进行绑定。示例如下:
创建一个pojo类,@ConfigurationProperties注解中的参数prefix = “person” 代表person类中的属性与配置文件中的person配置项的所有属性一一对应
@ConfigurationProperties(prefix = "person")
@Component //注册bean到容器中
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
public Person(){
}
public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> maps, List<Object> lists, Dog dog) {
this.name = name;
this.age = age;
this.happy = happy;
this.birth = birth;
this.maps = maps;
this.lists = lists;
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getHappy() {
return happy;
}
public void setHappy(Boolean happy) {
this.happy = happy;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
随后配置文件中写上:
person:
name: xu
age: 22
happy: true
birth: 1999/01/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: 旺财
age: 2
在测试类中进行测试:
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
运行结果如下:
Person{name=‘xu’, age=22, happy=true, birth=Fri Jan 01 00:00:00 CST
1999, maps={k1=v1, k2=v2}, lists=[code, girl, music],
dog=Dog{name=‘旺财’, age=‘2’}}
注:使用@ConfigurationProperties注解需要在pom文件中写上以下依赖
org.springframework.boot
spring-boot-configuration-processor
true
2.@Value
@Value注解给属性赋值时,只需要在赋值的属性上方附加@Value注解,并在注解内填入值即可,其缺点也很明显,那就是只能一个属性一个属性的赋值。示例如下:
@Component
public class Dog {
@Value("大黄")
String name;
@Value("3")
String age;
public Dog(){
}
public Dog(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
在测试类中进行测试:
@Autowired
Dog dog;
@Test
void contextLoads() {
System.out.println(dog);
}
运行结果如下:
Dog{name=‘大黄’, age=‘3’}
除此之外,@value注解还可以与@PropertySource注解结合使用来为JavaBean属性赋值,而且@PropertySource注解可以加载指定的配置文件。示例如下:
pojo类:
@Component
@PropertySource(value = "classpath:dog.yaml") //该注解可以加载指定的配置文件
public class Dog {
//@Value("大黄")
@Value("${dog.name}")
String name;
// @Value("3")
@Value("${dog.age}")
String age;
public Dog(){
}
public Dog(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
指定的配置文件:
dog:
name: dahuang
age: 2
测试结果:
Dog{name=‘dahuang’, age=‘2’}