SpringBoot--------核心配置(二)

https://i.xue.taobao.com/my/learning.htm?spm=a2174.7365761.0.0.oxhqUo

 

第2章 Spring Boot 核心配置

2.1 Spring Boot的配置文件

Spring Boot 使用一个全局配置文件,放置在 src/main/resources 目录或类路径的 /config 下; application.properties application.yml

配置文件的作用:修改 Spring Boot 自动配置的默认值;

yml 是 YAML(YAML Ain't Markup Language)不是一个标记语言;

标记语言:以前的配置文件;大多都使用的是 xxxxx.xml文件;

YAML:以数据为中心,配置数据的时候具有面向对象的特征;比 json、xml 等更适合做配置文件;

2.2 YAML语法格式

2.2.1 YAML基本语法

key: value 表示一对键值对(冒号后面必须要有空格)

使用空格缩进表示层级关系

左侧缩进的空格数目不重要,只要同一层级的元素左侧对齐即可

key 与 value 大小写敏感

2.2.2 YAML常用写法

2.3 yaml 配置文件注入值

1)编写 JavaBean

2)编写 application.yml 配置文件

3)使用 SpringBoot 单元测试类进行测试

4)导入配置文件处理器,然后重新运行测试类,在编写配置文件时就会提示

2.4 properties 配置文件注入值

将 application.yml配置文件中的内容注释掉,编写application.properties 配置文件

运行后,发现 properties 文件在 idea 上中文乱码, 进行如下设置就会不会乱码

2.5比较 @Value 和 @ConfigurationProperties 获取值

使用 @Value 获取值,把 Emp 类中的 @ConfigurationProperties 注释掉

总结 @Value 与 @ConfigurationProperties 获取值的差异:

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


2.6 JSR303数据校验_配置文件注入的值

@Validate注解

2.7 加载指定配置文件

2.7.1 @PropertySource 加载局部配置文件

@ConfigurationProperties 默认从全局配置文件(application.properties/application.yml)中获取值,

所有配置数据写在全局配置文件中,显得太臃肿了, 可将它们抽取出来,放到其他局部配置文件中。

2.7.2 @ImportResource 使用xml配置

SpringBoot提倡零配置, 即无xml配置,但是在实际开发中,可能有一些特殊要求必须使用 xml 配置;

这时我们可以通过 Spring 提供的 @ImportResource 来加载 xml 配置文件。

2.7.3 自定义配置类向容器注入组件

2.8 Profile 多环境支持

2.8.1 Profile介绍

Profile 是 Spring 用来针对不同的环境要求,提供不同的配置支持, 全局 Profile 配置使用的文件名可以是

application-{profile}.properties / application-{profile}.yml ; 如: application-dev.properties / application-prod.properties

演示案例:我们的项目环境分为 开发 (dev)和 生产(prod)环境 ,开发环境下端口号为 8082,

生产环境下端口号为8888 。

2.8.2 properties 文件演示案例

创建两个文件 application-dev.properties 与 application-prod.properties 

激活指定profile

2.8.3 yml 文件演示案例

2.8.4 多种方式激活指定profile

2.9 配置文件加载位置

SpringBoot 启动时,会扫描以下位置的 application.properties 或者 application.yml 文件作为

Spring Boot的默认配置文件: 

配置文件位置

说明

file:./config/

当前项目的config目录下(最高级别)

file:./

当前项目的根目录下

classpath:/config/

类路径的config目录下

classpath:/

类路径的根目录下(最低级别)

以上按照优先级从低到高的顺序,将所有位置的配置文件全部加载,高优先级的配置内容会覆盖低优先级的

配置内容。

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

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

注意:如果使用IDEA创建的项目是 Module (如果是 Project 则忽略),当前项目的根目录不是你这个项目所

有目录(是Project所在目录) ,这样使用 file: 存放配置文件时会找不到配置

解决方式:更改工作路径直接为Module所有目录 $MODULE_DIR$ 

 

配置文件到底能写什么?怎么写?

配置文件能配置的属性参照

https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#common-application-properties


2.10 外部配置加载顺序
==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指定的默认属性

所有支持的配置加载来源;

注意:

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式

1、配置类**@Configuration**------>Spring配置文件

2、使用**@Bean**给容器中添加组件

/**
 * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
 *
 * 在配置文件中用标签添加组件
 *
 */
@Configuration
public class MyAppConfig {
 
    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置类@Bean给容器中添加组件了...");
        return new HelloService();
    }
}

 

3、配置文件占位符

1)随机数

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

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

person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

 

你可能感兴趣的:(编程)