大家好,又见面了,我是你们的朋友全栈君。
一,springboot配置文件:
首先看上图,我们在使用spring initializer快速创建一个项目的后,会自动生成上面的资源文件夹,••••••••
1,static
(1) 配置文件,
springboot使用一个全局的配置文件,配置文件名是固定的,有两种格式:
· application.properties
· application.yml
(2)配置文件的作用:修改springboot默认的配置,因为我们可能不满意springboot自动给我们设置的一些东西。
这里需要说一个名词:yml是YAML(先理解成是一个标记语言)语言的语言文件,以数据为中心,比json、xml更适合做配置文件,也就是要用yml替代以前用的xml文件了。
这里我们做实验,修改项目启动的服务器端口:
和:
看到上面的区别了吧,yml文件有会自动分层,非常简洁,而如果是xml,大量的数据都浪费在了标签上。所以说yml是以“数据为中心”。
最后重新启动就可以,看到端口号会有改变了。
二,yaml 语法
(1)k: (空格)v :表示一个键值对,空格必须有
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
server:
port: 8081
path: /hello
另:大小写敏感
(2)值得写法
字面量:普通的值(数字,字符串,布尔)
字符串不用加上单引号或双引号
“”:双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表达的意思
如: name:“zhangsan\nlisi” 就会输出:zhangsan 换号 lisi
”:单引号,会转义特殊字符,特殊字符就是普通的字符串数据
如: name:’zhangsan\nlisi’ 就会输出:zhangsan\nlisi
对象,Map(数学和值)(键值对)
k:v
如:friends对象
friends:
name: xiaoming
age: 20
也可以写成行内写法:如friends: (name: xiaoming,age: 20) (注意空格)
数组(list、set)
用值表示数组中元素的一个
如 pets集合:
pets:
- cat
- dog
- cat
行内写法:pets: [cat,dog,pig]
三:yaml 语法测试
(1)创建两个实体类 (idea ,alt+insert 快捷键生成get,set方法):
dog.java:
package com.example.springboot.bean;
public class Dog {
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;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
person.java
package com.example.springboot.bean;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class Person {
private String name;
private Integer age;
private Date date;
private Dog dog;
private Map<String,Object> maps;
private List<Object> lists;
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 Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
", dog=" + dog +
", maps=" + maps +
", lists=" + lists +
'}';
}
}
(2)然后在application.yml配置文件中加入以下内容:
server:
port: 8081
path: /hello
person:
name: zhangsan
age: 20
date: 2019/02/29
maps: {k1: v1,k2: v2}
lists:
- lisi
- zhaoliu
dog:
name: xiaogou
age: 2
(3)然后创建测试类
在这个目录下,有自动创建好的测试类,我做如下修改:
package com.example.springboot;
import com.example.springboot.bean.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* springboot的单元测试
*可以在测试期间很方便的类似编码一样进行注入
*
*
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot01HelloworldQuickApplicationTests {
@Autowired //注入放入容器中的person类
Person person;
@Test
public void contextLoads() {
System.out.println(person); //sout 快速打出输出语句
}
}
上面需要把Person类注入到springboot容器中,因此要在Person.java做如下修改:
package com.example.springboot.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @ConfigurationProperties 将配置文件中配置的每个属性的值,映射到配置文件中
* prefix = "person" 前缀,配置文件中哪个下面的所有属性进行一一映射
*
* 这个组件必须在容器中才能使用容器提供的ConfigurationProperties功能,所以最后再加上@Component
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Date date;
private Dog dog;
private Map<String,Object> maps;
private List<Object> lists;
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 Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
", dog=" + dog +
", maps=" + maps +
", lists=" + lists +
'}';
}
}
这里@ConfigurationProperties会有警告提示,需要我们在pom文件的属性中增加jar包依赖:
<!-- 导入配置文件处理器,配置文件进行导入就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
(4)然后就可以运行测试类了:
点击下图位置:
最后控制台就会打印出我们在yml文件中设置的属性值了:
四,在properties中配置
注释掉在yml中的配置。
然后在application.properties 中加入以下内容(ctrl+R 替换快捷键):
server.port=8089
person.name=zhangsan
person.age= 20
person.date= 2019/02/29
person.maps.k1= 13
person.maps.k2= 34
person.lists=lisi,zhaoliu,v
person.dog.name= 小狗
person.dog.age= 2
运行测试类,在控制台中显示如下:
也能打印出来我们的值,但是发现汉字乱码了。
这里设置下idea的系统编码:
server.port=8089
#需要在idea中setting设置编码为utf-8
person.name=zhangsan
person.age= 20
person.date= 2019/02/29
person.maps.k1= 13
person.maps.k2= 34
person.lists=lisi,zhaoliu,v
person.dog.name= 小狗
person.dog.age= 2
然后运行,就不会乱码了:
五,不使用 @ConfigurationProperties注解,也可以调用properties中的值
Person.java类如下:
package com.example.springboot.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @ConfigurationProperties 将配置文件中配置的每个属性的值,映射到配置文件中
* prefix = "person" 前缀,配置文件中哪个下面的所有属性进行一一映射
*
* 这个组件必须在容器中才能使用容器提供的ConfigurationProperties功能,所以再加上@Component
*/
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
@Value("${person.name}")
private String name;
@Value("#{11*2}")
private Integer age;
private Date date;
private Dog dog;
private Map<String,Object> maps;
private List<Object> lists;
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 Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
", dog=" + dog +
", maps=" + maps +
", lists=" + lists +
'}';
}
}
运行,有以下结果:
此外,相对于@Value方式,@ConfigurationProperties,还能够加校验:
package com.example.springboot.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @ConfigurationProperties 将配置文件中配置的每个属性的值,映射到配置文件中
* prefix = "person" 前缀,配置文件中哪个下面的所有属性进行一一映射
*
* 这个组件必须在容器中才能使用容器提供的ConfigurationProperties功能,所以再加上@Component
*/
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
// @Value("${person.name}")
@Email
private String name;
// @Value("#{11*2}")
private Integer age;
private Date date;
private Dog dog;
private Map<String,Object> maps;
private List<Object> lists;
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 Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
", dog=" + dog +
", maps=" + maps +
", lists=" + lists +
'}';
}
}
再者,@Value不支持复杂类型的注解,即如果在Dog对象上加如下:
@Value(${person.dog})
private Dog dog;
运行测试类时就会报错。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106000.html原文链接:https://javaforall.cn