【SpringBoot详细教程】-02-SpringBoot配置【持续更新】

 Hello!彦祖们,从今天开始我将更新一波超详细的SpringBoot的图文教程,感兴趣的老铁给个关注+点赞 支持一下呗,最好再评论一个666,O(∩_∩)O哈哈~(贪心了)

==============点个关注吧============

==================================

02. SpringBoot配置

SpringBoot使用一个全局的配置文件,配置文件名是固定的:

  • application.properties
语法结构:key=value
  • application.yml
语法结构:  key: value 
  • 以前的配置文件;大多都使用的是  xxxx.xml 文件;
  • YAML:以数据为中心,比 json、xml 等更适合做配置文件;

💬 比如我们可以在配置文件中修改 Tomcat 默认启动的端口号

YAML:

server:
  port: 8081

properties:

server.port=8081

🌲 YAML 语法

🌾 基本写法

k: v:表示一对键值对(空格必须有)

空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的

server:
    port: 8081
    path: /hello

🌾 值的写法

🍁 字面量:普通的值(数字,字符串,布尔)

字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;

k: v

" ":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
💬 例如:

name: "zhangsan \n lisi"

输出:

zhangsan
lisi

' ':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
💬 例如:

name: ‘zhangsan \n lisi’

输出:

zhangsan \n lisi

🍁 Map(属性和值)(键值对)

k: v:在下一行来写对象的属性和值的关系,注意缩进

#对象、Map格式
k: 
    v1:
    v2:

💬 例如:

friends:
	lastName: zhangsan
	age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}

🍁 数组(List、Set)

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

💬 例如:

pets:
  - cat
  - dog
  - pig

行内写法

pets: [cat,dog,pig]

🌲 全局配置文件值注入

🌾 全局配置文件注入

📜 需要导入配置文件处理器的依赖,配置文件进行绑定就会有提示(不加也行,只是没有提示)

<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

注入步骤:

  1. 在resources中新建application.yml或者application.properties配置文件,添加如下配置:
🍁配置文件yaml格式:
person:
  lastName: 二郎神
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {wife: 小甜甜, money: 300000}
  friends:
    - 王刚
    - 张龙
    - 赵虎
  dog:
    name: 哮天犬
    age: 12
🍁 配置文件properties格式:
person.last-name=zsf
person.age=100
person.birth=2017/12/15
person.boss=true
person.maps.k1=tj
person.maps.k2=yj
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15

🚨 注意:properties 配置文件在 IDEA 中默认 utf-8 可能会乱码,如图进行相应设置:

添加实体类:Dog.java

package com.moxuan.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
    private String name;
    private Integer age;
}

添加实体类:Person.java

package com.moxuan.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
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
// 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
@ConfigurationProperties(prefix = "person")
// prefix="person" 表示与配置文件中的哪一个属性进行一一映射
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> friends;

    private Dog dog;

}
  • @ConfigurationProperties 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
  • prefix="person" 表示与配置文件中的哪一个属性进行一一映射.

控制器代码如下:

package com.moxuan.demo.controller;

import com.moxuan.demo.entity.Person;
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.RestController;

@RestController
public class MyShowController {
    @Autowired
    Person person;

    @RequestMapping("test")
    public String show(){
        System.out.println(person);
        return person.toString();
    }
}

注意: 当properties文件和yml配置文件同时存在时,会优先选择properties文件,当properties配置文件没有时,会去yml中查找。

🌲 @Value值注入

可以使用 @Value 注解从配置文件中手动取值或者自由赋值,支持三种方式:

  • ${key} 从环境变量、配置文件中获取值
@Value("${person.last-name}")
private String lastName;
  • # {SpEL}
@Value("#{11*2}")
private Integer age;
  • "字面量"
@Value("true")
private Boolean boss;

修改配置文件如下:

person:
  last-name: 二郎神
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {wife: 小甜甜, money: 300000}
  friends:
    - 王刚
    - 张龙
    - 赵虎
  dog:
    name: 哮天犬
    age: 12

Person类如下:

package com.moxuan.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
// 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
@ConfigurationProperties(prefix = "person")
// prefix="person" 表示与配置文件中的哪一个属性进行一一映射
@Data
@NoArgsConstructor
@AllArgsConstructor
@Validated
public class Person {
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age1;
    @Value("true")
    private Boolean boss1;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> friends;

    private Dog dog;
}

控制器层:

package com.moxuan.demo.controller;

import com.moxuan.demo.entity.Person;
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.RestController;

@RestController
public class MyShowController {
    @Autowired
    Person person;

    @RequestMapping("test")
    public String show(){
        System.out.println(person);
        return person.toString();
    }
}

运行效果:

🌲 全局注入和@Value注入比较

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

💡 松散绑定:比如 yml 中写的 last-name,这个和 lastName 是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定

无论配置文件是 yml还是 properties他们都能获取到值;

  • 如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value
@RestController
public calss HelloController{
    @Value("${person.lastName}")
    private String name;
    
    @RequestMapping("/sayHello")
    public String sayHello(){
        return "Hello" + name;
    }
}
  • 如果我们专门编写了一个 JavaBean 来和配置文件进行映射,就直接使用@ConfigurationProperties

🌲 @PropertySource 指定配置文件值注入

@ConfigurationProperties(prefix = "person") 默认从全局配置文件中获取值,如果所有的配置全写在全局配置文件中,那么这个文件就太大了。我们可以自定义配置文件使用 @PropertySource 加载指定的配置文件。

比如我们在 resources 目录下新建一个 person.properties 文件

person.last-name=zsf
person.age1=100
person.birth=2017/12/15
person.boss1=true
person.maps.k1=tj
person.maps.k2=yj
person.friends=a,b,c
person.dog.name=dog
person.dog.age=15

Person中使用方法:

package com.moxuan.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
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 org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
// 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
//@ConfigurationProperties(prefix = "person")
// prefix="person" 表示与配置文件中的哪一个属性进行一一映射
@PropertySource(value = {"classpath:person.properties"})
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age1;
    @Value("true")
    private Boolean boss1;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> friends;

    private Dog dog;

}

🌲 Profile 多环境切换

profile 是 Spring 对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境 👇

🌾 多配置文件

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

比如:application-dev.properties 、application-prod.properties

其中,application-dev.properties 通常用作开发环境的配置,而application-prod.properties通常用作生产环境的配置。

默认使用 application.properties 的配置,然后在其中指定具体使用哪种环境的配置。

🌾 激活指定环境

⭐ 在 application.properties 配置文件中指定

spring.profiles.active=dev

🌾 yml 支持多文档块方式

和 properties配置文件中一样,但是使用 yml去实现不需要创建多个配置文件,更加方便了~

在 application.yml 中使用 --- 来分割不同的配置,内容如下


server:
  port: 8080 # 默认端口
#选择要激活那个环境块
spring:
  profiles:
    # 激活
    active: prod # 使用 prod 环境,8084端口

---
server:
  port: 8083
spring:
  config:
    activate:
      on-profile: dev #给开发环境起的名字
---
server:
  port: 8084
spring:
  config:
    activate:
      on-profile: prod #给生产环境起的名字
---
#测试
spring:
  profiles: test #给测试环境起的名字
server:
  port: 82
---

此时访问8080端口就会访问不到:

而访问8084端口可以访问到

🌲 配置文件分类

有这样的场景,我们开发完毕后需要测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置.

针对这种情况,SpringBoot 定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。

SpringBoot 中4级配置文件放置位置:

  • 1级:classpath:application.yml
  • 2级:classpath:config/application.yml
  • 3级:file :application.yml
  • 4级:file :config/application.yml

🌾 验证1,2级优先级

创建一个名为 boot_02_file 的 SpringBoot 工程,目录结构如下:

在 resources 下创建一个名为 config 的目录,在该目录中创建 application.yml 配置文件,而在该配置文件中将端口号设置为 81,内容如下

server:
  port: 81

而在 resources 下创建的 application.yml 配置文件中并将端口号设置为 80,内容如下

server:
  port: 80

运行启动引导类,可以在控制台看到如下日志信息

通过这个结果可以得出---类路径下的 config 下的配置文件优先于类路径下的配置文件

🌾 验证2,4级优先级

将工程打成 jar 包,点击工程的 package 来打 jar 包:

在硬盘上找到 jar 包所在位置

在 jar 包所在位置创建 config 文件夹,在该文件夹下创建 application.yml 配置文件,而在该配合文件中将端口号设置为 82

server:
    port: 82

在命令行跳转到jar包所在的目录,然后使用以下命令运行程序:

java -jar boot_02_file-0.0.1-SNAPSHOT.jar

运行效果:

可以看出启动的是82端口,也就是用的是jar包同级目录config中的配置文件,由此可见,file: config 下的配置文件优先于类路径下的配置文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听潮阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值