SpringBoot配置文件解析
基于2018版本IDEA使用Spring Initializer快速创建Spring Boot项目
SpringBoot项目文件解析:
src/main/java–保存java源代码
src/main/resources/application.properties–Spring Boot核心应用配置文件
static–保存web应用程序所需的静态资源hrml、css、js、img
templates–保存模板页面
2018版本后的src/main/resources目录下的static、templates文件需要手动创建。
Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面,可以使用模板引擎freemarker、thymeleaf。
依赖@SpringBootApplication注解中包含的@EnableAutoConfiguration,SpringBoot项目会创建出自动的默认配置数据,以保证SpringBoot项目在创建成功以后,没有进行任何编程操作的情况下就可以正常运行起来。
在不同环境下SpringBoot项目所使用的自动配置的默认数据值就需要随着环境的变化而被修改,我们在修改的时候不能修改源码,而且源码无法修改,基于这个情况SpringBoot项目对外提供了一个可以用来修改自动配置的默认数据值的文件:application.properties文件。
application.properties文件SpringBoot的核心配置文件,作用:修改自动配置的默认数据值的文件
名称:application.properties或application.yml
application.properties或application.yml就是同一个配置文件,后缀名的不同,表示这个文件中内容的书写风格不同。
application.properties书写格式是一行显示:
user.userid=101
user.username=张氏
user.usersex=true
application.yml书写格式是分行显示:
user:
userid: 111
username: 小李同学
usersex: false
YAML文件解析
YAML(Yet Another Markup Language)一种基于Unicode容易阅读,容易和脚本语言交互。是一个标记语言又不是一个标记语言,因为它以数据为中心。
YAML语法格式:
基本语法 :键:(空格)值:表示一对键值对(空格必须有),以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的。
例如:
user:
userid: 111
username: 小李同学
usersex: false
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
属性值写法属性值–键值对的键所对应的值,由于yml文件的属性,实际都是xxxproperties类的成员变量,成员变量都是有固定的数据类型,所以属性的值不能随便写,必须符合成员变量对应的数据类型。
普通值 (数字字、符串、布尔)
数字–数字值
1布尔–true/false
字符串–默认不用加单引号或双引号,如果有双引号–字符串中的转义字符会执行\n—换行,单引号–字符串中的转义字符不会执行,会作为一个字符直接使用。
对象对象名称–对象中的属性换行缩进表示或者一行显示
student:
stuid: 1001
stuname: zhangsan
stuage: 23
一行显示:student:{objid: 1,objname: hello,objheight: 178.9}
集合数组类型的集合(List、Set)- 空格数组集合中的元素值
javas:
- javase
- javaee
- javame
javas–数组名称
javase、javaee、javame–数组集合中的数据值
数组名称:[数据值1,数据值2
行内写法:names: [zhangsan,lisi,wangwu]
Map(键值对)Map集合的名称:{key1:value1,key2:value2} 例如:maps: {name: zhangsan,age: 23,address: 西安}
使用application.yml通过@ConfigurationProperties将核心配置文件中的数据值与JavaBean类中的成员变量绑定
@ConfigurationProperties有一个属性prefix,prefix = “yml文件中对象名称”
导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
创建javabean 类名上添加@Component@ConfigurationProperties(prefix = “user”):
package qing.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "user")
public class UserBean {
private int userid;
private String username;
private boolean usersex;
private List<String> lists;
private Map<String,Object> maps;
private MyObj myObj;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public boolean isUsersex() {
return usersex;
}
public void setUsersex(boolean usersex) {
this.usersex = usersex;
}
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public MyObj getMyObj() {
return myObj;
}
public void setMyObj(MyObj myObj) {
this.myObj = myObj;
}
}
在resources的application.yml配置属性:
user:
userid: 111
username: 小李同学
usersex: false
lists: 蓝天,白云,净土
maps: {zc: 包子,wc: 面条,wf: 米饭}
my-obj: {objid: 1,objname: hello,objheight: 178.9}
控制器类:
package qing.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import qing.bean.MyObj;
import qing.bean.UserBean;
import java.util.List;
import java.util.Map;
@RestController
public class UserController {
@Autowired
private UserBean userBean;
@RequestMapping("/getUserInfo")
public String getUserInfo() {
System.out.println("userBean==" + userBean);
int id = userBean.getUserid();
String name = userBean.getUsername();
boolean sex = userBean.isUsersex();
String info = id + " " + name + " " + sex;
Map<String, Object> map = userBean.getMaps();
for (Map.Entry<String, Object> obj : map.entrySet()) {
System.out.println(obj.getKey() + " " + obj.getValue());
}
List<String> list = userBean.getLists();
for (String lists : list) {
System.out.println(lists);
}
MyObj myObj = userBean.getMyObj();
System.out.println(myObj.getObjid() + " " + myObj.getObjname() + " " + myObj.getObjheight());
return info;
}
}
结果:
通过@Value注解将数据值与JavaBean类中的成员变量绑定
javabean实体类:
package qing.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "stu")
public class StudentBean {
@Value("1001")
private int stuid;
@Value("小李同学")
private String stuname;
@Value("178.7")
private double stuheight;
private List<String>stulist;
private Map<String,String> maps;
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public double getStuheight() {
return stuheight;
}
public void setStuheight(double stuheight) {
this.stuheight = stuheight;
}
public List<String> getStulist() {
return stulist;
}
public void setStulist(List<String> stulist) {
this.stulist = stulist;
}
public Map<String, String> getMaps() {
return maps;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
}
application.properties核心配置文件:
stu.stulist=张三,lisi,111,....
stu.maps.sex=true
stu.maps.address=北京
控制器类:
package qing.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import qing.bean.StudentBean;
import java.util.List;
import java.util.Map;
@RestController
public class StudentController {
@Autowired
private StudentBean studentBean;
@RequestMapping("/getStu")
public String getStu(){
int id=studentBean.getStuid();
String name=studentBean.getStuname();
double height=studentBean.getStuheight();
String info=id+" "+name+" "+height;
List<String> list=studentBean.getStulist();
for(String lists:list){
System.out.println(lists);
}
Map<String,String> maps=studentBean.getMaps();
for(Map.Entry<String,String> map:maps.entrySet()){
System.out.println(map.getKey()+" "+map.getValue());
}
return info;
}
}
结果:
@Value和@ConfifigurationProperties获取值比较
配置文件yml还是properties他们都能获取到值, 如果我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value。
如果我们专门编写了一个JavaBean来和配置文件进行映射,我们就直接使用@ConfifigurationProperties