SpringBoot版本为:2.1.1.RELEASE
SpringBoot默认使用全局的一个配置文件,文件名称固定,格式有两种:
- application.properties
- application.yml
官方推荐使用yml类型的配置文件。YAML这种语言是以数据为中心,比xml、json更加适用于做配置文件。下面详细说明YAML语法。
一、YAML语法
A.基本语法
K:(空格)V:表示一对键值对,空格是必须的。以空格的缩进来表示层级关系,只要是左对齐的一列数据,都是同一层级的
例如:
server:
port: 8080
address: 127.0.0.1
B.不同值写法
1.普通值(数字,字符串,布尔)
普通的值就是 K:V 的结构,并且字符串默认不用加单引号或者双引号,但是可以加。
如果加 “” 号:不会转义字符串里的特殊字符:特殊字符会作为它本身的意思
name: "zhangsan \n lisi"
输出会转化成 :
张三
李四
如果加 ‘’ 号:会转义里面的特殊字符:特殊字符最终只是会作为一个普通的字符串输出
name: 'zhangsan \n lisi'
输出会转化为:
zhangsan \n lisi
2.数组(List,Set)
用 - 值 :表示数组中的一个元素
friends:
- zhangsan
- lisi
- wangwu
3.Map,JavaBean
Map和对象有两种写法
# 普通写法
dog:
name: yangyang
age: 1
# 行内写法
dog: {name: yangyang, age: 1}
二、配置文件值注入
A.主配置文件
SpringBoot中主配置文件值的注入常用的有两种方法:
第一种:通过 @Value 注解注入属性值
第二种:通过 @ConfigurationProperties 注解注入属性值
其中 @Value 注解一般用于单个属性值的的获取,不能用于复杂类型和对象的或者,而 @ConfigurationProperties 常用于批量注入配置文件中的属性值,而且**@ConfigurationProperties** 注解常和 @Component 注解联合使用于对象的绑定。下面举例说明:
person:
name: Junge
age: 23
friends:
- zhangsan
- lisi
- wangwu
dog:
name: yangyang
age: 1
map: {k1: v1,k2: v2}
/**
* description:
*
* @author van.shu
* @date 2019/7/17 22:24
*/
@Component
@ConfigurationProperties(prefix = "person")
@ToString
@Data
public class Person {
private String name;
private int age;
private List<String> friends;
private Dog dog;
private Map<String, Object> map;
}
@ConfigurationProperties(prefix = "person.dog")
@Component
@ToString
@Data
public class Dog {
private String name;
private String age;
}
我们可以通过 @ConfigurationProperties(prefix = xxx") 和 @Component 注解来使当前对象绑定配置文件中的属性值,与此同时,我们也可以通过 @Value(" p e r s o n . n a m e " ) ∗ ∗ 来 获 取 配 置 文 件 中 ∗ p e r s o n . n a m e ∗ 的 值 , 或 者 通 过 ∗ ∗ @ V a l u e ( " {person.name}")** 来获取配置文件中 *person.name* 的值,或者通过 **@Value(" person.name")∗∗来获取配置文件中∗person.name∗的值,或者通过∗∗@Value("{person.dog.age}") 来获取配置文件中 person.dog.age 的属性值。
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private Person person;
@Value("${person.name}")
private String name;
@Value("${person.dog.age}")
private String dogAge;
@GetMapping("person")
public Person t1() {
System.out.println(person);
System.out.println(name);
System.out.println(dogAge);
return person;
}
}
打印结果如下:
B.其它
SpringBoot中,除了主配置文件applicaiton.yaml 之外,还可能有用户添加的配置文件,那这些自定义的配置文件我们怎么去读取呢?
这里一般就要用到这两个注解: @PropertySource 和 @ImportResource
@PropertySource: 该注解用于加载指定的配置文件(properties文件);
例如我们可以自定义一个 person.properties文件,然后通过java的Person类来获取值
person.name=scj
person.age=18
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
private String name;
private int age;
}
测试效果入下:
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private Person person;
@GetMapping("user")
public Person t1() {
System.out.println(person);
//输出: Person(name=Junge, age=23)
return person;
}
}
@ImportResource: 该注解用于导入Spring的配置文件,让配置文件里面的内容生效。
1.beans.xml
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="com.van.springboot.service.HelloService"></bean>
</beans>
2.JavaBean
public class HelloService {
}
3.启动类
@SpringBootApplication
public class SpringbootStudyApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringbootStudyApplication.class, args);
boolean helloService = applicationContext.containsBean("helloService");
System.out.println(helloService);
}
}
4.测试结果:false
5.修改启动类
@SpringBootApplication
@ImportResource(locations = {"classpath:beans.xml"})
public class SpringbootStudyApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringbootStudyApplication.class, args);
boolean helloService = applicationContext.containsBean("helloService");
System.out.println(helloService);
}
}
6.测试结果:true