1、配置文件
-SpringBoot使用一个全局的配置文件
*application.properties
*application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;由于SpringBoot在启动时自动配置,所以有了配置文件,就可以修改springboot的默认自动配置。
YAML(YAML Ain t Makerup Language)
YAML A Markup Language:是一个标记语言
YAML isn t Markup Language:不是一个标记语言
标记语言:
以前的配置文件;大多数使用的是xxxx.xml文件;
YAML:以数据为中心,比json、xml等更合适做配置文件;
proeprties写法:
server.port=8090
ymal写法:
server:
port: 8090
2、YMAL语法:
1、基本语法
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:
port: 8081
path: /hello
2、值的写法
字面量:普通的值(数字,字符串,布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
":单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name:'zhangsan \n lisi:输出;张三 \n lisi
对象(属性和值)(键值对):
k:v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k:v的方式
friends:
lastName:zhangsan
age:20
行内写法:
friends: {lastName: zhangsan,age: 18}
数组(List、set):
用 - 值表示数组中的一个元素
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
3、配置文件值注入
配置文件
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 2
javaBean
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
我们可以导入配置文件处理器,以后编写配置就有提示了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
3.1、Properties方式注入配置文件
# idea 配置文件person utf-8
person.last-name=张三
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps..k2=v2
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15
其他的配置什么都不动,但是运行的话会出现中文乱码,解决方式是这样。
在设置里这样就不会出现乱码问题了。
3.3 用@Value()注解的方式设置注入spring容器
@Component
//@ConfigurationProperties(prefix = "as")
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}总环境变量、配置文件中获取值/#{SpEL}"></property>
* </bean>
*/
@Value("${person.lastName}")
private String lastName;
@Value("#{11 * 2}")
private Integer age;
@Value("false")
private Boolean boss;
private Date birth;
上面的代码中,我们用@Value注解可以给javaBean对象设置值,它支持普通的字符串,${}从属性中获取值,#{}Spel Spring的表达式
我们比较一下ConfigurationProperties与Value的区别
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个一个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
4、配置文件注入值数据校验
@Component
@ConfigurationProperties(prefix = "person")
@Validated
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;
@Email
private String email;
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
email: 123456
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 2
上面两段代码是数据校验的代码,我们email写的格式明显不对,看看能巡行起来么。
Field error in object 'person' on field 'email': rejected value [123456]; codes [Email.person.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@702ed190,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@173b9122]; default message [不是一个合法的电子邮件地址]
可以看到邮箱格式不对被拦截了。
4、@PropertySource&@ImportResource
@propertySource:加载指定的配置文件;
@Component
@PropertySource(value={"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
//@Validated
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;
我们可以用上图的方式指定要使用的配置文件@PropertySource(value={“classpath:person.properties”})
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效。
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件也不能自动识别。真的想让Spring配置文件生效,加载进来;@ImportResource标注在配置类上。
@ImportResource(locations={"classpath:bean.xml"})
@SpringBootApplication
public class HelloWorldMainApplication {
<?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.meng.service.HelloService"></bean>
</beans>
Spring Boot给容器中添加组件的方式;推荐使用注解的方式
1、配置类=======Spring配置文件
2、使用@Bean给容器中添加组件
/**
* 告诉spring这是一个配置类,就是来替代之前的Spring配置文件
* 在配置文件中用<bean></bean>标签添加组件
*/
@Configuration
public class MainConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名。
@Bean
public HelloService helloService(){
return new HelloService();
}
}
四、配置文件占位符
1、随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65535]}
占位符,如果没有可以使用:指定默认的值
# idea 配置文件person utf-8
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps..k2=v2
person.lists=a,b,c
person.dog.name=${person.last-name}的小狗${person.hello:hello}
person.dog.age=15
五、Profile
1、多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties
我们创建三个配置文件application.properties、application-dev.properties、
application-prod.properties。内容分别是server.port=8081、server.port=8082、server.port=8083,那么我们直接运行会执行哪个配置文件呢。
Tomcat initialized with port(s): 8081 (http)
看结果默认执行application.properties配置文件。我们在默认加载的配置文件上写入这句话:
spring.profiles.active=dev
结果:可以看到我们application-dev.properties配置文件制定的8082端口启动起来了。
Tomcat initialized with port(s): 8082 (http)
yml还有一种文档快的模式。
---
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
3、激活制定profile
1、在配置文件中指定 spring.profiles.active=dev
2、命令行:
– spring.profiles.active=dev
加入如下命令,dev代码块,也就是8083端口启动
Tomcat initialized with port(s): 8083 (http)
我们还可以在cmd黑窗口用命令指定启动需要的代码块或者配置文件:首先先把项目打包,然后在cmd加上命令并运行jar包没查看结果
结果是8083端口,说明命令行指定配置文件的优先级最高。
3、虚拟机参数
Tomcat initialized with port(s): 8083 (http)
启动的结果也是没有问题的。
6、配置文件加载位置
springboot启动会扫描一下位置的application.properties或者application.yml文件作为spring boot的默认配置文件。 -file:/config/ -file:./ -classpath:/config/ -classpath:/ 优先级由高到低,高优先级得到配置会覆盖低优先级的配置; SpringBoot会从这四个位置全部加载主配置文件;互补配置;
我们还可以通过spring.config.location该改变默认的配置文件位置。
在项目打包以后,我们可以使用命令行参数的形式,启动项目的时候来制定配置文件的新位置;制定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
7、外部配置加载顺序
SpringBoot也可以从以下位置加载配置;按照优先级由高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1、命令行参数
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开;–配置项=值
2、来自java:comp/env的JNDI属性
3、java系统属性(System.getProperties())
4、操作系统环境变量
5、RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找;
优先加载带profile的
6、jar包外部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
7、jar包内部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
再来加载不带profile的
8、jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
9、jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
10、@Configuration注解类上的@PropertySource
11、通过SpringApplication.setDefaultProperties指定的默认属性。