关于java:SpringBoot核心②配置文件

39次阅读

共计 6876 个字符,预计需要花费 18 分钟才能阅读完成。

配置文件

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

SpringBoot 应用一个全局的配置文件,配置文件名 application 是固定的;

  • application.properties
  • application.yml
  • application.yaml

配置文件的作用:批改 SpringBoot 主动配置的默认值;SpringBoot 在底层都给咱们主动配置好;

YAML


YAML(YAML Ain’t Markup Language)

​ YAML A Markup Language:是一个标记语言

​ YAML isn’t Markup Language:不是一个标记语言;

标记语言:

​ 以前的配置文件;大多都应用的是 xxxx.xml文件;

​ YAML:以数据为核心,比 json、xml 等更适宜做配置文件;

YAML 语法:

根本语法

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

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

次等级的后面是空格,不能应用制表符(tab)

冒号之后如果有值,那么冒号和值之间至多有一个空格,不能紧贴着

值的写法

字面量:一般的值(数字,字符串,布尔)

k: v

字符串默认不必加上单引号或者双引号;

"":双引号;不会本义字符串外面的特殊字符;特殊字符会作为自身想示意的意思

eg: name: “zhangsan n lisi”:输入;zhangsan 换行 lisi

'':单引号;会本义特殊字符,特殊字符最终只是一个一般的字符串数据

eg: name:‘zhangsan n lisi’:输入;zhangsan n lisi

对象、Map(属性和值)(键值对)

k: v在下一行来写对象的属性和值的关系;留神缩进

  1. 对象还是 k: v 的形式
friends:
        lastName: zhangsan
        age: 20
  1. 行内写法

    friends: {lastName: zhangsan,age: 18}
数组(List、Set)
  1. 用 - 值示意数组中的一个元素(留神 - 前面有空格)
   pets:
 - cat
 - dog
 - pig
  1. 行内写法
pets: [cat,dog,pig]

配置文件值注入

在进行配置文件注入时,会同时加载 application.properties 和 yml,不过 properties 的优先级更高,properties 中没有配置的内容会应用 yml 的配置。

yml 配置文件

person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
      - lisi
      - zhaoliu
    dog:
      name: 小狗
      age: 12

properties 配置文件

person.last_name= 张三
person.age=18
person.boss=true
person.birth=2010/01/01
person.maps.k1=mmm
person.maps.v1=aaa
person.maps.k2=dog
person.maps.v2.dog.name=xiaobei
person.maps.v2.dog.age=3
person.lists={abc,def,ghi}
person.dog.name=wangcai
person.dog.age=4

JavaBean:

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:通知 SpringBoot 将本类中的所有属性和配置文件中相干的配置进行绑定;*      prefix = "person":配置文件中哪个上面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,能力容器提供的 @ConfigurationProperties 性能;*
 */
@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>
    

测试,发现中文会乱码,而且 char 类型还会抛出 Failed to bind properties under ‘person.gender’ to java.lang.Character 异样

中文乱码解决办法:

properties 配置文件在 idea 中默认 utf- 8 可能会乱码

调整

在设置中找到File Encodings,将配置文件字符集改为UTF-8,并勾选:

  • Transparent native-to-ascii conversion

yaml 和 properties 配置文件同时存在,properties 配置文件的内容会笼罩 yaml 配置文件的内容

配置文件值注入有两种形式,一个是 Spring Boot 的 @ConfigurationProperties 注解,另一个是 spring 原先的 @value 注解

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


@ConfigurationProperties @Value
性能 批量注入配置文件中的属性 一个个指定
涣散绑定(涣散语法) 反对 不反对
SpEL 不反对 反对
JSR303 数据校验 反对 不反对
简单类型封装 反对 不反对
  • 涣散绑定:属性匹配规定

    ​ 规范形式 person.firstName

    ​ 形式一 大写用 - person.first-name

    ​ 形式二 大写用_ person.first_name

  • SpEL: #{表达式} 表达式内能够应用各类运算符
  • JSR303 数据校验:对属性的格局校验,校验时在类上要标注 @Validated,对字段的校验常见的有@Email(是否是非法的邮件地址)、@NotNull(是否非空) 等
  • 简单类型:比方 map、类等

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

什么时候应该用什么

如果说,咱们只是在某个业务逻辑中须要获取一下配置文件中的某项值,应用 @Value;

如果说,咱们专门编写了一个 javaBean 来和配置文件进行映射,咱们就间接应用 @ConfigurationProperties;

测试

SpEL:

`## properties 配置文件
persion.age=#{11*}

# Person 类
#-------------------- 应用 @ConfigurationProperties 注解,会抛出异样 --------------------
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private Integer age;


#-------------------- 应用 @value 注解 OK--------------------
@Component
public class Person {@Value("${person.age}")
    private Integer age;`Copy to clipboardErrorCopied

JSR303 数据校验

@ConfigurationProperties反对校验,如果校验不通过,会抛出异样

@value注解不反对数据校验

简单类型封装(外围区别)

@value注解无奈注入 map 等对象的简单类型,但list、数组能够

@PropertySource&@ImportResource&@Bean


PropertySource

@PropertySource注解的作用是加载指定的配置文件,值能够是数组,也就是能够加载多个配置文件

springboot 默认加载的配置文件名是application,如果配置文件名不是这个是不会被容器加载的,所以这里 Person 并没有被注入任何属性值

应用 @PropertySource({"classpath:person.properties"}) 指定加载 person.properties 配置文件

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:通知 SpringBoot 将本类中的所有属性和配置文件中相干的配置进行绑定;*      prefix = "person":配置文件中哪个上面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,能力容器提供的 @ConfigurationProperties 性能;*  @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值;*
 */
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {

    /**
     * <bean class="Person">
     *      <property name="lastName" value="字面量 /${key}从环境变量、配置文件中获取值 /#{SpEL}"></property>
     * <bean/>
     */

   //lastName 必须是邮箱格局
   // @Email
    //@Value("${person.last-name}")
    private String lastName;
    //@Value("#{11*2}")
    private Integer age;
    //@Value("true")
    private Boolean boss;

应用这个注解加载配置文件就须要配置类应用 @component 等注解而不是期待 @EnableConfigurationProperties 激活 m,而且不反对 yaml,只能是 properties

ImportResource

@ImportResource注解用于导入 Spring 的配置文件,让配置文件外面的内容失效;(就是以前写的 springmvc.xml、applicationContext.xml)

Spring Boot 外面没有 Spring 的配置文件,咱们本人编写的配置文件,也不能自动识别;

想让 Spring 的配置文件失效,加载进来;@ImportResource标注在一个配置类上


运行测试类

留神!这个注解是放在主入口函数的类上,而不是测试类上

Configuration

SpringBoot 举荐给容器中增加组件的形式;举荐应用全注解的形式

配置类@Configuration —equals—> Spring 配置文件

Bean

应用 @Bean 给容器中增加组件

 * @Configuration:指明以后类是一个配置类;就是来代替之前的 Spring 配置文件
 *
 * 在配置文件中用 <bean><bean/> 标签增加组件
 *
 */
@Configuration
public class MyAppConfig {

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

配置文件占位符


随机数

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

能够援用在配置文件中配置的其余属性的值,如果应用一个没有在配置文件中的属性,则会原样输入

能够应用 : 指定默认值

Profile


Profile 是 Spring 对不同环境提供不同配置性能的反对,能够通过激活、指定参数等形式疾速切换环境

多 profile 文件模式

文件名格局:application-{profile}.properties/yml,例如:

  • application-dev.properties
  • application-prod.properties

程序启动时会默认加载application.properties,启动的端口就是默认端口,个别是 8080(因为我后盾还跑着 Sts 端口被占用了,所以设置为 8081 了)

能够在主配置文件中指定激活哪个配置文件

yml 反对多文档块形式

每个文档块应用 --- 宰割


server:
  port: 8081
spring:
  profiles:
    active: prod

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

---

server:
  port: 8084
spring:
  profiles: prod  #指定属于哪个环境

激活指定 profile 的三种形式

  1. 在配置文件中指定 spring.profiles.active=dev
  2. 我的项目打包后在命令行启动

    `java -jar xxx.jar --spring.profiles.active=dev;
  3. 虚拟机参数

    `-Dspring.profiles.active=dev`Copy to clipboardErrorCopied

激活优先应用多 profile 文件,如果指定的环境在多 profile 没有配置,才会应用多文档块中的内容

配置文件加载地位

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

–file:./config/

–file:./

–classpath:/config/

–classpath:/

优先级 由高到底,高优先级的配置会笼罩低优先级的配置;

SpringBoot 会从这四个地位全副加载主配置文件;互补配置(高一级没有的从下一级补足)

== 咱们还能够通过 spring.config.location 来扭转默认的配置文件地位 ==

我的项目打包好当前,咱们能够应用命令行参数的模式,启动我的项目的时候来指定配置文件的新地位;指定配置文件和默认加载的这些配置文件独特起作用造成互补配置;

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

内部配置加载程序

==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 指定的默认属性

所有反对的配置加载起源;
参考官网文档

正文完
 0