栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot学习(二)SpringBoot的配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot学习(二)SpringBoot的配置

文章目录
  • SpringBoot学习(二)SpringBoot的配置
    • 配置文件
      • 全局配置文件
      • YAML语法
        • 基本语法
        • 字面量,普通的值(数字、字符串、布尔)
        • 对象、map(键值对)
        • 数组(List、Set、Array)
    • 配置文件值注入
      • @ConfigurationProperties
        • YAML 文件配置
        • properties文件配置
      • @Value
      • @Value和@ConfigurationProperties
      • @PropertySource与@ImportResource
      • 配置文件占位符
        • 随机数
        • 占位符
    • Profile
      • 文件名称
      • 激活
      • yaml文档块编写
    • SpringBoot配置文件加载位置
    • SpringBoot外部配置的加载顺序

SpringBoot学习(二)SpringBoot的配置 配置文件 全局配置文件

SpringBoot使用一个全局的配置文件,配置文件名称是固定的,修改自动配置的默认值

  • application.properties
  • application.yml

YAML(YAML Ain’t Markup Language)

YAML A Markup Language(YAML 是一种标记语言),YAML isn’t Markup Language(YAML 不是一种标记语言)。以数据为中心

spring:
  application:
    name: springboot-02-config
server:
  port: 8080
YAML语法 基本语法

key:(空格)value:表示已对键值对,空格必须有。以空格缩进来控制层级关系,只要左对齐的一列数据,都是同一个层级。属性和值大小写敏感。

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

key: value:字面量直接写,字符串默认不加单双引号

“”(双引号): 不会转义特殊字符,特殊字符会作为本身想表示的意思输出

name: "zhangsan n lisi"
# 输出
zhangsan
lisi

‘’(单引号): 会转义特殊字符,将特殊字符作为普通字符串输出

name: 'zhangsan n lisi'
# 输出
zhangsan \n lisi
对象、map(键值对)

key: value

# 一般写法 
user: 
 name: zhangsan
 age: 20
# 行内写法
student: {name: zhangsan, age: 20}
数组(List、Set、Array)

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

# 一般写法
pets: 
 - cat
 - dog
 - pig
# 行内写法
myPets: [cat, dog, pig]
配置文件值注入 @ConfigurationProperties

默认从全局配置文件中获取值

YAML 文件配置

@ConfigurationProperties(prefix = "person"):SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定

  • prefix = "person":设置绑定配置的前缀

需要组件是容器中的组件,才能使用容器提供的@ConfigurationProperties(prefix = "person")功能。使用注解@Componet将组件添加到容器中

导入配置文件处理器,配置文件进行绑定就会有提示。导入之后需要重启应用


    org.springframework.boot
    spring-boot-configuration-processor
    true

application.yml

spring:
  application:
    name: springboot-02-config
server:
  port: 8080
person:
  lastName: zhangshan
  age: 18
  boss: false
  birth: 2017/12/11
  maps: {k1: v1, k2: v2}
  list:
    - lishi
    - wangwu
  pet:
    name: 大黄
    age: 12

Person.java

import lombok.Data;
import lombok.ToString;
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
@ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map maps;
    private List list;
    private Pet pet;
}
 

Pet.java

import lombok.Data;
import lombok.ToString;

@Data
@ToString
public class Pet {
    private String name;
    private Integer age;
}

测试

@SpringBootTest
class Springboot02ConfigApplicationTests {

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

}

测试结果

...
Person(lastName=zhangshan, age=18, boss=false, birth=Mon Dec 11 00:00:00 CST 2017, maps={k1=v1, k2=v2}, list=[lishi, wangwu], pet=Pet(name=大黄, age=12))
...
properties文件配置
person.last-name=张珊
person.age=18
person.birth=2000/10/5
person.boss=true
person.maps.k1=v1
person.maps.k2=v2
person.list=A,B,C
person.pet.name=小花
person.pet.age=5

测试结果

...
Person(lastName=张珊, age=18, boss=true, birth=Thu Oct 05 00:00:00 CST 2000, maps={k1=v1, k2=v2}, list=[A, B, C], pet=Pet(name=小花, age=5))
...

如果中文出现乱码,那么在File→Settings→Editor→File Encodings中设置编码为UTP-8

@Value

    

@Value("")取值的写法也支持 字面量/${key}从环境变量、配置文件中获取值/#{SpEL}

@Component
// @ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("false")
    private Boolean boss;
    @Value("${person.birth}")
    private Date birth;
@Value和@ConfigurationProperties
@ConfigurationProperties@Value
功能批量注入配置文件中的属性需要一个个的指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复制类型封装支持不支持

配置文件使用yaml或者properties,都能获取到值

如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value

如果写有javaBean和配置文件进行映射,使用@ConfigurationProperties

@PropertySource与@ImportResource

@PropertySource: 加载指定配置文件(properties)

@PropertySource(value = {"classpath:person.properties"})
// @PropertySource(value = {"classpath:person.yaml"})
@Component
@ConfigurationProperties(prefix = "person")
@Data
@ToString
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map maps;
    private List list;
    private Pet pet;
}
 

@ImportResource: 导入Spring的配置文件,让配置文件生效

SpringBoot 中默认没有Spring配置文件,自己写的配置文件也不会自动生效,需要使用@ImportResource注解标注在配置类上,才能让自己写的Spring配置文件生效




    

@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class Springboot02ConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot02ConfigApplication.class, args);
    }

}

SpringBoot 推荐给容器中添加组件的方式(全注解方式):

@Configuration :标注的类属于配置类

@Bean :标注在方法上,将方法的返回值添加到容器中,容器中的组件名默认是方法名

@Configuration
public class MyAppConfig {

    @Bean
    public HelloService helloService() {
        return new HelloService();
    }

}
配置文件占位符 随机数
${random.value}
${random.int}
${random.long}
${random.uuid}
...
占位符

占位符去之前配置的值,如果没有,可以使用 : 指定

name: ${person.hello:lisi}_大黄:如果之前没有配置person.helloname使用 : 后面的 lisi

person:
  lastName: zhangshan${random.uuid}
  age: ${random.int}
  boss: false
  birth: 2017/12/11
  maps: {k1: v1, k2: v2}
  list:
    - lishi
    - wangwu
  pet:
    name: ${person.hello:lisi}_大黄
    age: 12

yaml和properties文件都适用

Profile

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

文件名称
  • application-{profile}.properties
  • application-{profile}.yml
激活
  • 在主配置文件中进行配置激活

    • .properties
    spring.profiles.active={profile}
    
    • yaml
    spring:
      profiles:
        active: {profile}
    
  • 命令行方式激活

    java -jar xxx.jar --spring.profiles.active={profile}
    
yaml文档块编写

使用---区分文档块

spring:
  profiles:
    active: dev
server:
  port: 8080
person:
  lastName: zhangshan${random.uuid}
  age: ${random.int}
  boss: false
  birth: 2017/12/11
  maps: {k1: v1, k2: v2}
  list:
    - lishi
    - wangwu
  pet:
    name: ${person.hello:lisi}_大黄
    age: 12
    
---
spring:
  profiles: dev
server:
  port: 8088
---
spring:
  profiles: prod # 指定属于那个环境
server:
  port: 9099
SpringBoot配置文件加载位置

SpringBoot启动时会扫描以下位置的application.properties/application.yml文件作为SpringBoot的默认配置文件

  • file:./config/
  • file:./
  • classpath:./config/
  • classpath:./

以上按照优先级由高到低的顺序,所有位置的文件都会被加载,相同的配置高优先级配置内容会覆盖低优先级配置内容,不同的配置会互补

可以通过spring.config.location改变默认的配置文件位置 ,指定的配置文件会和默认的配置文件形成互补配置

java -jar xxx.jar --spring.config.locaion=配置文件地址
SpringBoot外部配置的加载顺序

Spring Boot支持多种配置,Spring Boot的配置文件不只是能写在以上的文件位置下(而且当前项目路径下的文件在使用maven打包的时候,也打不进jar包中),还可以写在其他位置,详细参照Spring Boot官方文档。

  1. 命令行参数
    java -jar xxx.jar --server.port=xxx --配置项=值 ...
  2. jar包外application-{profile}.properties或yml(带spring.profile)配置文件
  3. jar包内application-{profile}.properties或yml(带spring.profile)配置文件
  4. jar包外application.properties或yml(不带spring.profile)配置文件
  5. jar包内application.properties或yml(不带spring.profile)配置文件
  6. @Configuration注解类上的@PropertySource
  7. 通过SpringApplication.setDefaultProperties指定的默认属性

优先级从高到低, 同样形成互补配置。优先加载命令行的,其次的是带profile,最后是不带profile的,由jar包外向jar包内加载

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号