Spring Boot配置文件
文章目录
1. Spring Boot配置文件
Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件。配置文件的作用是修改Spring Boot自动配置的默认值。
SpringBoot全局配置文件,配置文件名是固定的;
•application.properties
•application.yml
在SpringBoot中,这两种配置文件各有各的优点,各有各的缺点。
application.properties:属性访问结构,层级深浅对它来说是一样的,而且相较于application.yml类型的文件比较好配置,但缺点也很明显–要重复写很多遍父级属性;
application.yml:利用空格决定层次结构,层级少的时候使用比较方便,层级深的时候就比较麻烦了,需要严格控制空格的使用。
相对properties文件,yml更加年轻,yaml通过空格来确定层次关系,采用这种方式,最大的优点就是文件结构很清晰。但同时也要注意空格的使用,空格的多于或不足会导致层级关系出现混乱。
2. YAML简介和语法
2.1 yaml简介和常用配置
YAML和XML一样,也是一种可标记语言,和XML比较,yml配置起来更加方便快捷。yaml(yml)以数据为中心,比json、xml等更适合做配置文件。
下面是一个yml的常用配置
server:
port: 8080
servlet:
context-path: /
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
mybatis:
mapper-locations: classpath:mapping/*.xml
type-aliases-package: com.chtw.pojo
2.2 yaml语法
2.2.1 基本语法
键值对的形式(在值和键中间需要一个空格,并且不可以少)
key:(此处需要一个空格)value
以空格来决定层次结构,保持左边对齐的就是同一层级。
下面配置服务器端口为80,默认8080,访问路径/hello,需要注意的是属性和值对大小写敏感;
server:
port: 80
path: /hello
前一章中创建了springboot项目,给他添加一个配置文件application.yml,添加以上类容,删除原来的配置文件application.properties这个配置文件,只需要让其中一个配置文件起作用就可以了。配置好后运行主函数。
2.2.2 值的写法
数字,字符串,布尔的写入:
直接写入,默认不用加双引号或单引号。如果加上了双引号,则不会转义字符串里面的特殊字符;如果加上单引号,会转义特殊字符。
例子如下:
server:
port: 80
path: /hello
对象、Map(键值对)的写入:
people:
name: wangming
sex: 男
info: "I am a Java programmer,\n but I also like to use python."
infon: 'I am a Java programmer,\n but I also like to use python.'
maps: {k1: 59,k2: 2}
或者
server:
port: 80
path: /hello
people:
name: wangming
sex: 男
info: "I am a Java programmer,\n but I also like to use python."
infon: 'I am a Java programmer,\n but I also like to use python.'
maps:
k1: 59
k2: 2
2.2.3 数组(List、Set)的写法:
用- 值表示数组中的一个元素
list:
- 章
- 成
set:
- wu
- li
3. 配置文件值注入
3.1 配置文件值的注入
新建一个people类
package com.chtw.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author CHTW
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* 除了@ConfigurationProperties注入之外还有一种@Value注入
* prefix = "people":选择映射位置
* @date 2019-08-24-8:18
*/
@Component
@ConfigurationProperties(prefix = "people")
public class People {
private String name;
private int age;
private String info;
private String infon;
private String sex;
private Map<String ,String> maps;
private List list;
private Set set;
public Map<String, String> getMaps() {
return maps;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
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;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getInfon() {
return infon;
}
public void setInfon(String infon) {
this.infon = infon;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "People{" +
"name='" + name +
", age=" + age +
", info='" + info +
", infon='" + infon +
", sex='" + sex +
", maps=" + maps +
", list=" + list +
", set=" + set +
'}';
}
}
application.yml
server:
port: 80
path: /hello
people:
name: wangming
sex: 男
info: "I am a Java programmer,\n but I also like to use python."
infon: 'I am a Java programmer,\n but I also like to use python.'
maps:
k1: 59
k2: 2
list:
- 章
- 成
set:
- wu
- li
修改一下controller
package com.chtw.controller;
import com.chtw.entity.People;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @author CHTW
* @date 2019-08-23-17:43
*/
/*
* @Controller
* @ResponseBody
*/
@RestController
public class HelloController {
//自动注入
@Autowired
private People people;
@RequestMapping("/hello")
public String hello(){
System.out.println(people.toString());
return "Hello World! Welcome to Spring-Boot"+people.toString();
}
}
运行主函数,浏览器访问:localhost:80/hello
控制台打印输出
3.3.1 @Value和@ConfigurationProperties的区别
@Value写在变量前面,单一配置,是spring的底层注解,支持SpEL,不支持JSR303数据校验,不支持复制类型的封装,当我们在某一项业务逻辑中需要获取某一个属性的值的时候,可以使用@Value。
/*
* @Component将people加入到当前容器中,在controller那边才能自动注入
* @ConfigurationProperties方法
*/
@Component
@ConfigurationProperties(prefix = "people")
public class People {
private String name;
private int age;
private String info;
//set、get方法省略,自行补充
}
@Component
public class People {
@Value("${people.name}")
private String name;
@Value("${people.age}")
private int age;
@Value("${people.info}")
//set、get方法省略,自行补充
}
@ConfigurationProperties写在类前面,指定注入位置,批量注入,不支持SpEL,支持JSR303数据校验,支持复制类型的封装,如果我们有一个JavaBean来对配置文件映射的时候,使用@ConfigurationProperties。
另外,我们可以导入一个依赖,这个依赖只要我们将JavaBean进行绑定后,可以在我们写yml的时候给我们提示。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3.2 加载指定的配置文件@PropertySource
@PropertySource:用于加载指定的配置文件;当我们全局配置文件里面的类容过多的时候,不方便操作和修改维护等;所以我们可以自定义一些配置文件,但是springboot默认读入全局配置文件,不会读取我们自定义的配置文件,要想springboot能读取我们定义的配置文件,需要我们进行配置。@PropertySource就是其中一种方法。
下面是一个例子:将原来的application.yml文件中有关people的类容删除,只留下server相关配置。然后新建一个people.properties
people.name=lisi
people.age=21
people.info=hello world!
people.infon=hello word!
people.sex=男
people.maps.k1=56
people.maps.k2=5
people.list=1,2,3
people.set=1,2
在peoplel类上加一个注解
package com.chtw.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
@PropertySource(value = {"classpath:people.properties"})
@Component
@ConfigurationProperties(prefix = "people")
public class People {
// @Value("${people.name}")
private String name;
//@Value("${people.age}")
private int age;
//@Value("${people.info}")
private String info;
private String infon;
private String sex;
private Map<String ,String> maps;
private List list;
private Set set;
public Map<String, String> getMaps() {
return maps;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
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;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getInfon() {
return infon;
}
public void setInfon(String infon) {
this.infon = infon;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "People{" +
"name='" + name +
", age=" + age +
", info='" + info +
", infon='" + infon +
", sex='" + sex +
", maps=" + maps +
", list=" + list +
", set=" + set +
'}';
}
}
3.3 导入Spring的配置文件@ImportResource
**@ImportResource:**导入Spring的配置文件,让配置文件里面的内容生效;Spring Boot里面没有Spring的配置文件,当我们需要用到spring的一些配置时,就需要导入spring配置文件。
@ImportResource(locations = {"classpath:XXX.xml"})
3.4 @Configuration和@Bean
@Configuration和@Bean这两个注解嫩能够替代方法2.5中的XXX.xml文件,通过写Java代码的方式实现spring配置文件的导入。
/**
* @Configuration:说明这是配置类;用来来替代的Spring的xml文件
*/
@Configuration
public class Config {
//组件默认的id就是方法名
@Bean
public Hello hello(){
return new Hello();
}
}
创建一个Hello类;
package com.chtw.config;
/**
* @author CHTW
* @date 2019-08-24-14:30
*/
public class Hello {
public void sys(){
System.out.println("成功了");
}
}
在test包下面的java文件夹下的SpringBoot02ApplicationTests类中添加一个单元测试方法:
package com.chtw.springboot02;
import com.chtw.config.Hello;
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.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ApplicationTests {
@Autowired
ApplicationContext context;
@Test
public void contextLoads() {
}
@Test
public void sys() {
//获取一个Javabean
Hello hello = context.getBean(Hello.class);
hello.sys();
}
}
单步运行sys方法,控制台打印出”成功了“则说明容器中包含Hello这个bean。配置也就成功了
4. Profile多环境支持
在实际开发项目中,一般情况下最少有三种环境:开发、测试、正式,各个环境之间的参数也各不相同,为了方便我们快速切换环境,spring提供了profile多环境支持的功能。
4.1 application-{profile}.properties.yml
在编写全局配置文件的时候多变写几个,通过命名不同来区分不同的环境。默认使用application.properties的配置;通常由以下几种:
application-dev.properties/yml
server:
port: 8082
application-prod.properties/yml
server:
port: 8083
在application.properties.yml中配置spring.profiles.active来选择**哪一个环境
server:
port: 8081
spring:
profiles:
active: dev #启用dev环境
此时访问:localhost:8082/hello能够显示数据则说明配置成功
4.2 yml多文档块
只需要一个全局配置文件application.yml,不再需要其他的配置文件,一组”—“中是一个文档块
server:
port: 8081
spring:
profiles:
active: dev #启用环境的名称
---
server:
port: 8082
spring:
profiles: dev #指定环境名称
---
server:
port: 8083
spring:
profiles: prod
4.3 **指定profile
当项目已经完成并且打包好了过后,如果我们需要临时修改某修参数的时候,修改完成又需要重新打包发布,比较麻烦;这个时候我们也可以采取在命令行添加某些命令去临时改变。
java -jar spring-boot-02-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
启动后访问:localhost:8082/hello,打印结果说明改变成功。
本人联系方式2329095893,欢迎各位进行学习讨论
推荐阅读
-
Spring5源码解析5-ConfigurationClassPostProcessor (上)
-
spring5 源码深度解析----- AOP代理的生成
-
Spring5源码解析4-refresh方法之invokeBeanFactoryPostProcessors
-
Spring Boot Security OAuth2 实现支持JWT令牌的授权服务器
-
spring boot2.0.4集成druid,用jmeter并发测试工具调用接口,druid查看监控的结果
-
Nginx中运行PHP框架Laravel的配置文件分享
-
Nginx配置文件nginx.conf的常用配置方法
-
火狐浏览器多用户配置文件怎么设置?
-
weflow如何使用?weflow的使用及配置文件教程
-
vista系统下手动添加配置文件连接无线网络的方法(图文教程)