SpringBoot使用一个全局的配置文件,配置文件名是固定的
application.propertiesapplication.yml(YAML)配置文件的作用:修改SpringBoot自动配置的默认值(SpringBoot在底层都给我们配置好的东西)
1、基本语法
k: v (:和v之间必须有一个空格):表示一对键值对(以空格的缩进来表达层级关系,左对齐的一列都是同一层级的)———>属性和值大小写敏感
2、值的写法
k: v:字面直接来写:
字符串默认不用加上单引号或者双引号;
""双引号:不会转义字符串里面的特殊字符,特殊字符作为本身表示的意思
如:name:"zhangsan \n lisi";输出:zhangsan 换行 lisi
''单引号: 会转义特殊字符,特殊字符最终只是一个普通的字符串数据
如:name:‘zhangsan \n lisi’;输出:zhangsan \n lisi
用- 值表示数组中的一个元素
pets: - cat - dog - pig行内写法:
pets: [cat,dog,pig]配置文件:
person: lastName: zhangsan age: 18 boss: false birth: 2017/12/12 maps: {k1: v1,k2: 12} lists: - lisi - zhaoliu dog: name: Nancy age: 2JavaBean
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中所有的属性和配置文件中相关联的配置 * 进行绑定 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * 只有这个组件在容器中,才能使用容器的功能 */ @Component @ConfigurationProperties(prefix = "person") public class Person { private String Name; private Integer age; private boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog;我们可以导入配置文件处理器(pom.xml),以后编写配置就有提示
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> @ConfigurationProperties(prefix = "person")和@Value("")均是把属性值加入到容器当中@Value获取值和@ConfigurationProperties获取值比较
属性匹配命名规则(松散绑定):
person.firstName : 使用标准方式person.first-name : 大写用-person.first_name : 大写用_PERSON_FIRST_NAME : 大小写不区分配置文件yml还是properties他们都能获取到值;如果我们只是在某个业务逻辑中需要获取配置文件中的某项值,就用@Value;如果我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
@PropertySource:加载指定的配置文件
@PropertySource(value = "classpath:person.properties") @Component @ConfigurationProperties(prefix = "person") //默认从全局配置文件中获取值 //@Validated public class Person { /** * 原来获取属性值的配置方式: * <bean class="Person"> * <property name="Name",value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property> * </bean> */ // @Value("${person.name}") @Email private String Name; // @Value("#{12}") private Integer age; // @Value("true") private boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog;@ImportResource:导入spring的配置文件,让配置文件的内容生效
SpringBoot里边没有Spring的配置文件,我们自己编写的配置文件也不能自动识别;想让Spring的配置文件生效,加载进来:@ImportResource标注在一个配置类上(可以是启动类)
@ImportResource(locations = {"classpath:beans.xml"}) //导入Spring配置类让其生效 <?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.example.demo.service.HelloService"> </bean> </beans>然而,SpringBoot推荐给容器添加组件的方式:推荐使用全注释的方式
1、配置类=========(类似于)配置文件
2、使用@Bean给容器中添加组件
/** * @Configuration:指明当前类是一个配置类,替代Spring配置文件 * 在配置文件中用<bean></bean>标签添加组件 */ @Configuration public class MyAppConfig { //将方法的返回值添加到容器中:容器中这个组件默认的id就是方法名 @Bean public HelloService helloService(){ System.out.println("配置类@Bean给容器中添加组件了"); return new HelloService(); } }Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式来快速切换环境
(1)多Profile文件形式
我们在主配置文件编写的时候,文件名可以是
-格式:application-{profile}.properties/yml:
application-dev:properties、application-prod.properties默认使用application.properties/yml的配置
(2)多profile文档快模式(yml文档中):
#---代表一个文档块 server: port: 8082 spring: profiles: active: prod --- server: port: 8083 spring: profiles: dev --- server: port: 8084 spring: profiles: prod #指定属于哪个环境(3)激活方式:
-命令行 - -spring.profiles.active=dev(优先级较高)
(1)、在Run Configuration里的环境变量中配置Program arguments
(2)、打包运行jar包在命令行内执行(java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev)
-在默认配置文件(application.yml/properties)指定spring.profiles.active=dev
-jvm参数-Dspring.profiles.active=dev
在Run Configuration里的环境变量中配置VM options
spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
file:./config/file:./classpath:/config/ 类路径下的config文件夹classpath:/以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置的内容会覆盖低优先级配置的内容SprigBoot会从这四个位置全部加载主配置文件:互补配置我们也可以通过配置spring.config.location来改变默认配置(项目打包以后,我们可以用命令行参数的形式来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置)Spring Boot支持多种外部配置方式
这些方式的优先级如下:
https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/spring-boot-features.html#boot-features-external-config
SpringBoot也可以从以下位置加载配置:优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置形成互补配置
1、命令行参数
例如:java -jar spring-boot-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.*属性值
优先加载带profile,再加载不带profile。由jar包外向jar包内进行寻找
6、jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件(YAML变体文件)[配置文件和jar包在同一级目录,运行jar包不用参数,它会自己加载配置文件]
7、jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件(YAML变体文件)
8、jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
9、jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
10、@Configuration注解类上的@PropertySource
11、通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源:参考官方文档