SpringBoot属性注入

一、SpringBoot的属性注入解释:( @Value @ConfigurationProperties )

1.1):使用SpringBoot全局配置文件设置属性时:

  • 如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot内部会自动扫描并 读取这些配置文件中的属性值并覆盖默认属性。

  • 如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配 置属性方可生效。

1.2):属性注入常用注解包括:

  • @Configuration:声明一个类作为配置类。

  • @Bean:声明在方法上,将方法的返回值加入Bean容器。

  • @Value:属性注入。

  • @ConfigurationProperties(prefix = "users"):批量属性注入。

  • @PropertySource("classpath:/jdbc.properties")指定外部属性文件。在类上添加。

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

二、使用@Value属性注入:

Demo案例代码,并利用@Value注解注入:

目录结构:(下面我只写用得到的代码哦!注意目录名字

Users.java

package com.sxtt.controller.Beans;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;

/***
 * @Author Laugh"
 *
 * 可以通过@Value + SPEL 直接绑定SpringBoot配置文件 .yml里的值
 * @Value()  固定写法,“${XXXX.XXXX}”  配置文件里面的值
 * 案例1:
 * @Value("${users.username}")
 * private String username;
 *
 * 案例2:
 * @ConfigurationProperties(prefix="users")
 * 常用于bean属性和.yml配置文件
 * prefix属性   可以指定配置文件中的某节点,该节点中的子节点将自动和属性进行配对绑定
 * 注意:ConfigurationProperties 这个注解 比较简单,应该说是比较容易/松散,不限定特殊写法,例如:大写 / 驼峰 / 下划线 / 中划线 / 小写 都会被识别
 */
@Component
public class Users {
    @Value("${users.username}")
    private String username;
    @Value("${users.age}")
    private Integer age;
    private List<String> hobby;
    private Date birthday;
    private Map<Integer,String> girlfriend;
    private Address address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public List<String> getHobby() {
        return hobby;
    }

    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Map<Integer, String> getGirlfriend() {
        return girlfriend;
    }

    public void setGirlfriend(Map<Integer, String> girlfriend) {
        this.girlfriend = girlfriend;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Users{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", hobby=" + hobby +
                ", birthday=" + birthday +
                ", girlfriend=" + girlfriend +
                ", address=" + address +
                '}';
    }
}

application.yml

server:
  port: 8080
  servlet:
    context-path: /laugh

users:
  user_Name: Laugh"
  age: 25
  birthday: 2022/02/25

  # 行内写法
  #hobby: [吃,喝,玩,乐]

  # 一般写法
  hobby:
    - 吃
    - 喝
    - 玩

  # 行内写法

  #girlfriend: {15: 小天, 18: 小锤, 20: 小鸟, 21: 小璐 }

  # 一般写法
  girlfriend:
    15: 小天
    18: 小锤
    20: 小鸟
    21: 小露
  # 需要注意: address 为对象,所以下面的 id / desc 必须为对象的属性
  address:
    id: 1
    desc: 陕西省西安市高新区

补充:yml,引用属性占位符。

address:
    id: 1
    desc: ${users.user_Name}的家在陕西省西安市高新区

输出:

App.java

package com.sxtt;
import com.sxtt.controller.Beans.Users;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class App {
    @Autowired
    private Users user;
    @Test
    void contextLoads(){
        System.out.println(user);
    }
}

输出结果

三、使用@ConfigurationProperties属性注入:

Demo案例代码,并利用@ConfigurationProperties注解注入:

目录结构同上

注意其余不变,改变的只有Users.java哦:

Users.java

package com.sxtt.controller.Beans;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

/***
 * @Author Laugh"
 *
 * 可以通过@Value + SPEL 直接绑定SpringBoot配置文件 .yml里的值
 * @Value()  固定写法,“${XXXX.XXXX}”  配置文件里面的值
 * 案例1:
 * @Value("${users.username}")
 * private String username;
 *
 * 案例2:
 * @ConfigurationProperties(prefix="users")
 * 常用于bean属性和.yml配置文件
 * prefix属性   可以指定配置文件中的某节点,该节点中的子节点将自动和属性进行配对绑定
 * 注意:ConfigurationProperties 这个注解 比较简单,应该说是比较容易/松散,不限定特殊写法,例如:大写 / 驼峰 / 下划线 / 中划线 / 小写 都会被识别
 */
@Component
@ConfigurationProperties(prefix="users")
public class Users {
    private String username;
    private Integer age;
    private List<String> hobby;
    private Date birthday;
    private Map<Integer,String> girlfriend;
    private Address address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public List<String> getHobby() {
        return hobby;
    }

    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Map<Integer, String> getGirlfriend() {
        return girlfriend;
    }

    public void setGirlfriend(Map<Integer, String> girlfriend) {
        this.girlfriend = girlfriend;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Users{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", hobby=" + hobby +
                ", birthday=" + birthday +
                ", girlfriend=" + girlfriend +
                ", address=" + address +
                '}';
    }
}

输出结果

四、补充说明:

补充一、数据校验

server:
  port: 8080
  servlet:
    context-path: /laugh

users:
  user_Name: Laugh"
  age: 25
  birthday: 2022/02/25

  # 行内写法
  #hobby: [吃,喝,玩,乐]

  # 一般写法
  hobby:
    - 吃
    - 喝
    - 玩

  # 行内写法

  #girlfriend: {15: 小天, 18: 小锤, 20: 小鸟, 21: 小璐 }

  # 一般写法
  girlfriend:
    15: 小天
    18: 小锤
    20: 小鸟
    21: 小露
  # 需要注意: address 为对象,所以下面的 id / desc 必须为对象的属性
#  address:
#    id: 1
#    desc: ${users.user_Name}的家在陕西省西安市高新区

代码:

输出结果:

详表:

注解验证的数据类型说明
Null 所有类型 验证元素值必须为 null
NotNull 所有类型 验证元素值必须不为 null
NotBlank CharSequence 验证元素值不能为 null,并且至少包含一个非空白字符。
NotEmpty CharSequence、Collection、Map、Array 验证元素值不能为 null,且不能为空
Size(min = min, max = max) 同 NotEmpty 验证元素的 size 必须在 min 和 max 之间(包含边界),认为 null 是有效的
AssertFalse boolean、Boolean 验证元素值必须为 false,认为 null 是有效的
AssertTrue 同 AssertFalse 验证元素值必须为 true,认为 null 是有效的
DecimalMax(value=, inclusive=) BigDecimal、BigInteger、CharSequence,byte、 short、int、long 及其包装类型,由于舍入错误,不支持double和float 验证元素值必须小于等于指定的 value 值,认为 null 是有效的
DecimalMin 同 DecimalMax 验证元素值必须大于等于指定的 value 值,认为 null 是有效的
Max 同 DecimalMax,不支持CharSequence 验证元素值必须小于等于指定的 value 值,认为 null 是有效的
Min 同 DecimalMax,不支持CharSequence 验证元素值必须大于等于指定的 value 值,认为 null 是有效的
Digits(integer =, fraction =) 同 DecimalMax 验证元素整数位数的上限 integer 与小数位数的上限 fraction,认为 null 是有效的
Positive BigDecimal、BigInteger,byte、short、int、long、float、double 及其包装类型 验证元素必须为正数,认为 null 是有效的
PositiveOrZero 同Positive 验证元素必须为正数或 0,认为 null 是有效的
Negative 同Positive 验证元素必须为负数,认为 null 是有效的
NegativeOrZero 同Positive 验证元素必须为负数或 0,认为 null 是有效的
Future Date、Calendar、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime、HijrahDate、JapaneseDate、MinguoDate、ThaiBuddhistDate 验证元素值必须是一个将来的时间,认为 null 是有效的
FutureOrPresent 同 Future 验证元素值必须是当前时间或一个将来的时间,认为 null 是有效的
Past 同 Future 验证元素值必须是一个过去的时间,认为 null 是有效的
PastOrPresent 同 Future 验证元素值必须是当前时间或一个过去的时间,认为 null 是有效的
Email(regexp = 正则表达式,flag = 标志的模式) CharSequence 验证注解的元素值是Email,可以通过 regexp 和 flag 指定自定义的 email 格式,认为 null 是有效的
Pattern 同 Email 验证元素值符合正则表达式,认为 null 是有效的

补充二、随机数/随机字符串

4.1):随机数补充,及其用法:

名称描述
$(random.value) 取随机字符串
$(random.int) 取随机 int 型数据
$(random.long) 取随机 long 型数据
$(random.interesting(10)) 取10以内随机数
$(random.int[10,20] 取10-20之间的随机数
users:
  user_Name: ${random.value}}
  age: ${random.int}}

补充三、配置测试与正式环境方式

默认配置文件:(可以选择激活使用那个配置文件)

添加开发环境:

添加测试环境:

运行结果:(在默认配置中设置“test”为主,所以端口为8081反之则为8082)

补充四、yml写法

.yml配置文件,可以有很多种写法:

4.2):小写:

users:
  username: Laugh"
  age: 25

4.3):大写:

users:
  USERNAME: Laugh"
  AGE: 25

4.4):驼峰:

users:
  userName: Laugh"
  age: 25

4.5):中划线:

users:
  user-Name: Laugh"
  age: 25

4.6):下划线:

users:
  user_Name: Laugh"
  age: 25
posted @ 2022-08-05 17:25  Laugh"  阅读(874)  评论(1编辑  收藏  举报