[SpringBoot之一入门] 02-Springboot的配置文件

概要

1.yaml基本语法(YAML Ain't Markup Language,也可简写为yml)
2.配置文件值注入(案例)
3.配置文件使用

SpringBoot使用一个全局的配置文件,配置文件名是固定的: application.properties/application.yml/application.yaml。
配置文件的作用:修改SpringBoot在底层都给我们自动配置好的默认值。

一、TAML基本语法

1.基本语法:
– 使用缩进表示层级关系
– 缩进时不允许使用Tab键,只允许使用空格。
– 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
– 大小写敏感
– 键值对之间一定要使用空格

2.支持的三种数据结构
– 对象:键值对的集合
– 数组:一组按次序排列的值
– 字面量:单个的、不可再分的值

2.1 字面量
字符串默认不用加上单引号或者双引号;

"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
    name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
    name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

2.2 对象、map
k:v方式:

friends:
    lastName: zhangsan        
    age: 20 

行内写法:

friends: {lastName: zhangsan,age: 20}

2.3 数组
用- 值表示数组中的一个元素

pets:
 ‐ cat
 ‐ dog
 ‐ pig

行内写法:

pets: [cat,dog,pig]

二、配置文件值注入(案例)

.yaml配置文件

person:
  last-name: sunzh
  age: 28
  boss: false
  birth: 2018/08/08
  maps: {height: 180,weight: 180}
  lists: [red,yellow,black]
  dog:
    name: Tom
    age: 2

javaBean:

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *      prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 *
 * @Component 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Data       //import lombok.Data; 使用Lombok来优雅的编码,@Data注解默认提供了getter和setter和tostring方法
@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>
    <optional>true</optional>
</dependency>

<!--Lombok包引用-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <!-- 版本号可以不写,在前一篇中说到,他的父父类dependencies中已经对lombok进行了版本控制,默认1.16.22-->
    <!--<version>1.16.20</version>-->
    <scope>provided</scope>
</dependency>

Test类

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigApplicationTests {

    @Autowired
    private Person person;

    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}

运行结果:
Person(lastName=sunzh, age=28, boss=false, birth=Wed Aug 08 00:00:00 CST 2018, maps={height=180, weight=180}, lists=[red, yellow, black], dog=Dog(name=Tom, age=2))

.properties配置文件

person.last-name=sunzh
person.age=28
person.boss=false
person.birth=2018/08/08
person.maps.height=180
person.maps.weight=180
person.lists=1,2,3,4
person.dog.name=小狗
person.dog.age=2

javaBean:

@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
  /**
    * value 相当于bean
    * <bean class="Person">
    *      <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"</property>
    * <bean/>
    */
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

Test运行结果:

Person(lastName=sunzh, age=22, boss=true, birth=null, maps=null, lists=null, dog=null)
//由于list,map,pojo都是复杂类型,不可以用value()进行赋值。

注意:

在properties配置文件情况下,
也可以使用@ConfigurationProperties(prefix = “person”)注解,
但是不可以对属性使用@Value()注解,
这种情况下,对象的所有成员变量都会被赋值


@Value获取值和@ConfigurationProperties获取值比较

菜单 @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

JSR303数据校验,即在类上加入@Validated注解,在邮箱属性上加@Email,则会校验邮箱是否符合规范。

配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;


@PropertySource&@ImportResource&@Bean

@PropertySource(value = {"classpath:datasource.properties"})//注释在类上,一般用来引入非Spring的配置文件

@ImportResource(locations = {"classpath:beans.xml"})//标注在一个配置类上,使Spring的配置文件生效

@Bean给容器中添加组件
案例:
/**
 * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
 * 在配置文件中用<bean><bean/>标签添加组件
 */
@Configuration
public class MyAppConfig {

    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名,即helloService02
    @Bean
    public HelloService helloService02(){
        System.out.println("配置类@Bean给容器中添加组件了...");
        return new HelloService();
    }
}

三、配置文件的使用

1.配置文件占位符
随机数

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}

占位符获取之前配置的值,如果没有可以是用:指定默认值

person.last-name=sunzh${random.uuid}
person.age=${random.int}
person.birth=2018/08/08
person.boss=false
person.maps.height=180
person.maps.weight=180
person.lists=1,2,3,4
person.dog.name=${person.pet:Tom}_dog  //如果没有找到person.pet,则取Tom
person.dog.age=2

2.多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml

application-dev.properties、application-prod.properties

默认使用application.properties的配置

yml支持多文档块方式

server:
  port: 8081
spring:
  profiles:
    active: prod   //默认使用prd环境

---
server:
  port: 8083
spring:
  profiles: dev

---
server:
  port: 8084
spring:
  profiles: prod  

激活指定profile

1、在主配置文件中指定  spring.profiles.active=dev

2、命令行:
​   java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
​   可以直接在测试的时候,配置传入命令行参数

3、虚拟机参数;
​   -Dspring.profiles.active=dev

//使用上面这三种方式激活,则会忽略上面prd环境,而去使用指定的激活方式dev环境

3.配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

file:./config/         //项目根目录下的config目录file:./                //项目根目录
–classpath:/config/     //resource根目录下的config目录
–classpath:/            //resource根目录

优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087  --server.context-path=/abc

猜你喜欢

转载自blog.csdn.net/Justszh/article/details/82495439