SpringBoot属性注入

  • 1、通过application.yml和@Value进行注入
  • 2、通过ConfigurationProperties在实体类上注解注入属性值
  • 3、设置application.yml配置文件中的提示
  • 4、application.yml里面可以设置占位符
  • 4.1、可以引用其它属性
  • 4.2、使用随机数
  • 5、配合ConfigurationProperties注解实现jsr-303数据校验
  • 6、@ConfigurationProperties注解和@Value的区别
  • 7、指定外部的properties文件为属性注入的文件


1、通过application.yml和@Value进行注入

实体类

package cool.ale.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 dujlc
 */
@Component
public class User {
    @Value("${user.userName}")
    private String userName;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
}

application.yml

user:
  userName: XiaoLeLe
  age: 18
  birthday: 2021/06/30
  # 两种写法,写一种即可
  hobbies: [唱歌,跳舞]
#    - 唱歌
#    - 跳舞
  girl-friend: {18: 小红, 20: 小兰}
  address:
    id: 1
    desc: asdksamsdka
#    18 : 小红
#    20 : 小兰

测试类

package cool.ale.springboot_inject;

import cool.ale.beans.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootInjectApplicationTests {

    @Autowired
    private User user;

    @Test
    void contextLoads() {
        System.out.println(user);
    }

}

运行截图

springboop 注入 list springboot注入集合_spring boot

2、通过ConfigurationProperties在实体类上注解注入属性值

参考1,其它东西不用变,我们只需要将实体类的代码变成如下模样:

实体类

package cool.ale.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 dujlc
 */
@Component
// prefix指定的配置文件中对象的子节点将会自动匹配
@ConfigurationProperties(prefix = "user")
public class User {
    private String userName;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
}

注:这里需要注意一点,我们的配置文件当使用了ConfigurationProperties注解后,支持以下四种的松散匹配

user:
  userName: XiaoLeLe
user:
  user-name: XiaoLeLe
user:
  user_name: XiaoLeLe
user:
  USERNAME: XiaoLeLe

3、设置application.yml配置文件中的提示

当我们想设置我们的配置文件有提示功能(前提是我们必须要和ConfigurationProperties注解配合),我们可以按照以下两个步骤做:
1、引入jar包

<!-- 会生成 META-INF 元数据 用于提供 idea 自动提示配置文件的 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <!-- 设置当别的项目依赖到这个项目的时候,这个jar包不会传播 -->
    <optional>true</optional>
</dependency>

2、设置idea的属性

springboop 注入 list springboot注入集合_springboop 注入 list_02

4、application.yml里面可以设置占位符

4.1、可以引用其它属性

springboop 注入 list springboot注入集合_spring boot_03

4.2、使用随机数

springboop 注入 list springboot注入集合_spring boot_04

5、配合ConfigurationProperties注解实现jsr-303数据校验

1、先导入数据校验的包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、在被ConfigurationProperties注解的类上加上注解@Validated,并在需要校验的属性上加上需要的校验,但是注意一定要导入javax包下面的校验

@Component
@ConfigurationProperties(prefix = "user")
@Validated
public class User {
	@NotEmpty
    private String userName;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
}

当运行程序之后,控制台则会打印:

springboop 注入 list springboot注入集合_springboop 注入 list_05

6、@ConfigurationProperties注解和@Value的区别

@ConfigurationProperties

@Value

绑定

批量绑定配置文件中的属性

一个个指定

松散绑定

支持

支持部分,比如下划线就不支持

SPEL表达式

不支持

支持

自动提示

支持

不支持

JSR303

支持

支持

7、指定外部的properties文件为属性注入的文件

首先yml文件是不支持@PropertySource注解指定的。
1、在类上面写上指定的文件

@Component
@ConfigurationProperties(prefix = "user")
@Validated
@PropertySource("classpath:user.properties")
public class User {
    @NotEmpty
    private String userName;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
}

2、写配置的文件

user.userName=kkkk

配置文件位置截图:

springboop 注入 list springboot注入集合_springboop 注入 list_06