1. ymal配置文件
1.1 简介
yml是YAML语言的文件,以数据为中心,比json、xml等更适合做配置文件。springBoot使用一个全局的配置文件,配置文件名是固定的,为application.properties和application.yml,其作用是修改SpringBoot自动配置的默认值。
src/main/resources目录或者类路径/config下
1.2 语法
1.2.1 基本语法
1)使用缩进表示层级关系
2)缩进时不允许使用tab键,只允许使用空格
3)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
4)大小写敏感
例如:配置端口号,在properties中的配置如下
server.port=8888
而在yml中的配置如下
server:
port: 8888
该yml配置满足以下4点:
1. key部分的单词之间以冒号“ : ”分隔
2. 缩进采用的是空格
3. 要有树状层次结构(至于port前面有多少个空格,不重要)
4. 属性值前面必须要有一个空格。例如:8888的前面有一个空格
例如:
启动之后的端口号为;
1.2.2 yaml支持的数据格式类型
1)对象:键值对的集合
2)数组:一组按次序排列的值
3)字面量:单个的、不可再分的值
1.3 YML常用写法
1.3.1 字面量的写法
对于字面量的值也就是普通的值(数字,字符串,布尔),直接写,字符串默认不用加上单引号或者双引号。字符串可以写成多行,从第二行开始,必须有一个单空格缩进,换行符会被转成空格。
例如:
name: zhangsan
注意:
1)"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。
例如:
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
2)'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据。
例如:
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
1.3.2 对象(Map)
语法:
1. 对象的一组键值对,使用冒号分隔
2. 冒号后面跟空格来分开键值
例如:
person:
name: zhangsan
age: 18
注意:也可以使用行内写法,例如:
person: {name: zhangsan,age: 18}
1.3.3 数组(List、Set)
语法:用- 值表示数组中的一个元素,[]为其行内写法
例如:
pets:
- cat
- dog
- pig
行内写法:
pets: [cat,dog,pig]
注意:
1. springBoot使用snakeyaml解析yml文件。
2. 在yml配置中多个单词的写法可以使用下划线也可以使用驼峰命名方式,例如,有一个属性lastName既可以配置成lastName也可以配置成last-name
2. 配置文件值的注入
2.1 添加配置提示配置
我们可以在pom中加上配置后置处理器配置,可以方便我们编写配置文件的时候有提示,配置如下:
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.2 @ConfigurationProperties
该注解可以将配置文件中配置的每一个属性的值,映射到@ConfigurationProperties标注的组件上。该注解用于告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定。该注解有一个属性值prefix,表示前缀,意思是需要映射配置文件中的prefix表示的开头的属性。
例如:
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
* <bean/>
*/
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
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:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
测试类:
package com.bjc;
import com.bjc.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;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonTest {
@Autowired
Person person;
@Test
public void test(){
System.out.println(person);
}
}
运行结果:
注意:
1. 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能,所以,在Bean上需要加上@Component注解,@ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值,表示读取配置文件中person的属性
2. @ConfigurationProperties还可以获取properties配置文件,例如:
person.last-name=张三
person.age=12
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15
@ConfigurationProperties支持JSR303数据校验
@ConfigurationProperties支持校验规则,例如:
运行,结果如下:
2.3 @Value
该注解是spring提供的底层注解。该注解支持字面量、${}获取配置文件或者环境变量的值、#{}使用SPEL表达式。
例如:
package com.bjc.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;
@Component
public class Person1 {
@Value("${person.lastName}")
private String lastName;
@Value("#{person.age + 11}")
private Integer age;
@Value("${person.boss}")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
'}';
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public String getLastName() {
return lastName;
}
public Integer getAge() {
return age;
}
public Boolean getBoss() {
return boss;
}
public Date getBirth() {
return birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public List<Object> getLists() {
return lists;
}
}
测试类:
@Autowired
Person1 person1;
@Test
public void test01(){
System.out.println(person1);
}
运行结果:
注意:
1. @Value注解不支持JSR303数据校验
2. @Value注解不支持复杂数据类型的封装。例如,这里的maps就不能用@Value注解注入值
3. @Value注解适合仅仅是简单的注入属性值的应用场景
2.4 @PropertySource
该注解用于加载指定的配置文件。@ConfigurationProperties注解用于加载全局配置文件中的配置,但是如果全部配置都写在全局配置文件中,会让配置文件显得很臃肿,因此,我们可以将一部分配置文件抽取出来,在需要的地方使用注解@PropertySource来加载。
例如:将person的配置抽取在person.properties中
person.lastName=李四
person.age=12
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
然后在需要的地方使用@PropertySource,例如:
运行结果:
2.5 @ImportResource
该注解的作用是导入Spring的配置文件,让配置文件里面的内容生效,在Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别,想让Spring的配置文件生效,我们可以使用注解@ImportResource将该配置文件加载进来。
例如:
@SpringBootApplication
@ImportResource(locations = {"classpath:beans.xml"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
3. springBoot推荐的配置方式
SpringBoot推荐给容器中添加组件的方式,推荐使用全注解的方式
1)使用java类带代替xml配置文件,java类用注解@Configuration标注
2)使用@Bean注解给容器添加组件。
例如:
package com.bjc.config;
import com.bjc.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public HelloService getHelloService(){
System.out.println("初始化helloService。。。");
HelloService helloService = new HelloService();
helloService.setName("hello");
return helloService;
}
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test2 {
@Autowired
private HelloService helloService;
@Autowired
private ApplicationContext context;
@Test
public void test01(){
boolean b = context.containsBean("getHelloService");
System.out.println(this.helloService + " ** " + b);
}
}
运行结果:
注意:
1)@Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
2)@Bean用来代替配置文件中<bean>标签
3)用@Bean添加组件,在容器中默认方法名为容器中该组件的id
4. 配置文件占位符
4.1 随机数
在配置文件中还可以使用随机数,可以使用的随机数有如下几种
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
例如:
运行结果:
4.2 属性配置占位符
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能使用)
例如:
运行结果:
4.3 指定默认值
占位符获取之前配置的值,如果没有可以使用冒号“ : ”来指定默认值,例如:
运行结果:
5. profile
5.1 多profile文件
5.1.1 配置
我们可以定义多个properties/yml配置文件,以指定的格式命名,在全局配置文件中指定程序使用哪个配置文件即可
格式:application-{profile}.properties/yml
5.1.2 激活配置
在全局配置文件application.yml配置文件中,激活。
spring:
profiles:
active: dev
server:
port: 8080
例如:定义三个配置文件application-dev.yml、application-test.yml、application-prod.yml,分别表示开发环境、测试环境与生产环境,在全局配置文件application.yml中激活指定的配置文件,如图所示:
启动项目, 查看运行结果,如图:
可以看到tomcat端口号为8081,但是我们在application.yml中配置的端口号是8080,因此我们可以知道我们的激活配置生效了。
5.2 yml支持多文档块方式
5.2.1 配置
在yml文件中,我们可以使用“ --- ”符号来给文档分块。
例如:
server:
port: 8080
spring:
profiles:
active: prod
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: test
---
server:
port: 8083
spring:
profiles: prod
5.2.2 激活方式
如上面。
5.3 profile的激活方式
5.3.1 方式一:在配置文件中指定
在配置文件中指定 spring.profiles.active=dev
5.3.2 方式二:命令行方式
1)项目打jar包,然后在cmd中运行
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
2)在IED中输入参数方式
--spring.profiles.active=test
5.3.3 方式三:虚拟机参数
-Dspring.profiles.active=test
6. 配置文件的加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件,优先级由高到底,高优先级的配置会覆盖低优先级的配置,springBoot会从以下四个位置(优先级由高到低)加载主配置文件,形成互补配置。
/config
/
classpath:/config
classpath:/
“ / ”表示根目录,如图所示:
注意:我们可以在四个位置都写配置文件,springBoot每个配置文件都会加载,只是高优先级目录的文件的内容会覆盖低优先级目录下文件的内容,形成互补配置。
6.1 配置项目访问路径
我们默认的访问路径是 / ,如果我们先访问路径带上项目名怎么办了?好办,可以在配置文件中配置访问路径即可。
例如:server.servlet.context-path = /boot
server:
port: 8081
servlet:
context-path: /boot
6.2 修改默认配置文件位置
在上线过程中,我们已经将项目打包好了,但是我们又需要修改某些配置文件,并让程序加载该配置文件,这时候,我们可以使用命令行参数的形式,启动项目的时候通过spring.config.location来指定配置文件的新位置,指定的新位置的配置文件与默认加载的之前的配置文件共同起作用形成互补配置,指定的配置新配置文件的优先级高于默认的配置文件。
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
7. 其他配置
7.1 改变启动画面
如图:在source目录下新建一个文本文件,boot在启动的时候,会优先读取该目录下的文件
然后,将你所希望显示的文本信息,粘贴到到该文件中即可,启动效果如图:
7.2 配置tomcat端口号
在src/main/resources下创建application.properties
在文件中输入如下信息
server.port=8899
7.3配置数据源
7.3.1 数据库连接信息配置
## 配置mysql驱动
spring.datasource.driverClassName=com.mysql.jdbc.Driver
## 配置连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
## 配置用户名密码
spring.datasource.username=root
spring.datasource.password=root
## 配置连接池 com.alibaba.druid.pool.DruidDataSource
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
7.3.2 mybatis别名包扫描配置
## 配置别名包扫描
mybatis.type-aliases-package=com.bjc.pojo