­

springboot-配置文件的注入

本文标识 : Jsbt0007

本文编辑 : Jack 风

编程工具 : IDEA

阅读时长 : 5分钟


title: springboot-08配置文件的注入


::: tip 配置文件值的注入

单值注入和批量注入

:::

1、单值注入

使用@Value注解注入单个属性的值

  • yml配置文件
person:    name: "zhangsan n  lisi"    age: 23    boss: true    birth: 2019/11/21
  • java代码
//datasource.properties 数据源的配置文件  //<bean ..> <property name="url" value="${url}"></property> </bean>    @Value("${person.name}")  private String name;

${key} :来引用属性文件中key对应的值

2、批量注入

使用@ConfigurationProperties注解批量注入配置文件中的多个值

配置文件

person:    lastName: 年少风    age: 18    boss: false    birth: 2019/11/20    maps: {k1: v1, k2: 12}    lists:    - 张三    - 李四    dog:      name: 哈士奇      age: 2

@Data是一个lomlok插件,免去了getter/setter和toString这些繁琐的东西

在POM文件的节点中间添加

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.4</version>    <scope>provided</scope>  </dependency>
//封装配置文件中person中的数据  @ConfigurationProperties(prefix = "person")  @Component  @Data  public class Person {      private String lastName;      private Integer age;      private Boolean boss;      private Date birth;      private Map<String,Object> maps;      private List<String> lists;      private Dog dog;  }

使用@ConfigurationProperties注解必须同时添加@Component讲当前的配置类放入IOC容器中

@Data  public class Dog {      private String name;      private Integer age;  }
  • 测试代码
@RestController  public class HelloController {        Logger log = LoggerFactory.getLogger(HelloController.class);        @Autowired      private Person person;        @GetMapping("/hello")      public String hello(){          log.info(person.toString());          return "hello SpringBoot-swagger";      }  }
  • 控制台的输出
Person(lastName=年少风, age=18, boss=false, birth=Tue Nov 12 00:00:00 CST 2019, maps={k1=v1, k2=12}, lists=[张三, 李四], dog=Dog(name=哈士奇, age=2))

javaBean:

  • 将配置文件中配置的每一个属性的值,映射到这个组件中
  • @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
  • prefix = "person":配置文件中哪个下面的所有属性进行一一映射
  • 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
  • @Data是一个插件,,免去了getter/setter和toString这些繁琐的东西

如果在编写yml文件的时候没有出现属性提示:

我们可以导入配置文件处理器,以后编写配置就有提示了

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

3、两种注入的区别

@Value获取值和@ConfigurationProperties获取值的区别

@ConfigurationProperties

@Value

功能

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

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL:##{}

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

松散语法绑定:last_name = last-name = lastName 他们取的值都是相同的

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

总结:

  • 如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
  • 如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

4、注入值的数据校验

@ConfigurationProperties(prefix = "person")  @Component  @Data  @Validated //数据校验  public class Person {        @Email(message = "用户名必须是一个正确的邮箱格式")      private String lastName;      @Max(value = 200,message = "年龄不能超过200岁")      @Min(value = 0,message = "年龄必须大于0岁")      private Integer age;      private Boolean boss;      private Date birth;      private Map<String,Object> maps;      private List<String> lists;      private Dog dog;    }

经过刚才的测试得出,两个注解不能同时作用在一个属性上。