Spring Boot Bean自动装配

1. 全局配置文件

修改Spring Boot自动配置的默认值,Spring Boot在底层自动加载

  • application.yml
  • application.properties

2. Bean自动装配原理

(1) Spring Boot启动时加载主配置类,开启了自动配置功能@EnableAutoConfiguration

(2) @EnableAutoConfiguration

​ 作用: 将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值(自动装配类)加入到执行计划中

(3) 每一个自动装配类进行自动配置功能

3. YAML规则

(1) 双引号

​ 不会转义特殊字符,特殊字符或作为本身想要表达的意思

name: "zhangsan \n lisi" 输出 zhangsan 换行 lisi

单引号

​ 会转义特殊字符,特殊字符最终只是一个普通的字符串数据,如:

name: 'zhangsan \n lisi' 输出 zhangsan \n lisi

(2) 支持松散的结构

family-name = familyName = family_name

(3) 占位符

1
2
3
4
5
6
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024, 65536]}
${xxxx.yyyy: 默认值}

4. 获取自定义配置

(1) @Value("${}")

​ 实现了单个属性的注入

(2) 对于复杂的数据结构,使用@ConfigurationProperties获取配置值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.haven.model.yaml;

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

/**
 * @author HavenTong
 * @date 2019/10/29 5:44 下午
 */

@Data
@Component
@ConfigurationProperties(prefix = "family")
public class Family {
//    @Value("${family.family-name}")
    private String familyName;
    private Father father;
    private Mother mother;
    private Child child;
}

(3) 两种注解区别

@ConfigurationProperties @Value
功能 批量注入属性 一个个指定
松散语法绑定 支持 不支持
SpEL 不支持 支持
复杂数据类型嵌套 支持 不支持
JSR303数据校验 支持 不支持

5. 配置文件注入值数据校验

(1) 在需要校验的属性装配类上加@Validated注解

(2) 数据校验注解列表

(3) 若验证失败,会出现BindValidationException异常

6. Profile不同环境下不同配置

优先级: 外部大于内部,特指大于泛指

  • application.yml 全局配置文件
  • application-dev.yml 开发环境配置文件
  • application-test.yml 测试环境配置文件
  • Application-prod.yml 生产环境配置文件

(1) 配置application.yml

设置spring.profiles.active指定使用哪一个配置文件。

优先级以下面的dev/test/prod yml为优先

1
2
3
spring:
  profiles:
    active: dev

(2) 通过命令行启动

1
java -jar SpringBoot01HelloWorld-1.0-SNAPSHOT.jar --spring.profiles.active=dev

(3) IDEA设置Program Arguments

​ (a) Edit Configuration –> Environment –> Program Argument

1
--spring.profiles.active=dev

​ (b) Edit Configuration –> Environment –> VM options

1
-Dspring.profiles.active=dev

7. 项目内部配置文件加载位置

spring boot会扫描以下位置的application.properties / application.yml文件作为spring boot的默认配置文件

1
2
3
4
-file:./config/
-file:./
-classpath:/config/
-classpath:./

以上优先级从高到低,所有位置的文件都会被加载;高优先级会覆盖低优先级

8. 配置文件敏感字段加密

(1) 与spring boot整合

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>1.18</version>
        </dependency>

(2) 需要加密的地方,使用ENC()进行包裹处理

(3) 在配置文件中设置密钥