IDEA-SpringBoot配置文件属性值注入

全局配置文件

	Spring Boot使用一个application.properties或者application.yml作为全局配置文件,在Spring Boot项目启动时,
会自动加载application.properties文件。
  • 通过配置文件进行属性注入
public class Pet {
    private String name;
    private String type;
    ...省略set get方法
    }
@Component 	//用于将Person类作为Bean注入Spring容器中
@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性注入该类中
public class Person {
    private int id;
    private String name;
    private List<String> hobby;
    private String[] family;
    private Map<String,String> map;
    private Pet pet;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", hobby=" + hobby +
                ", family=" + Arrays.toString(family) +
                ", map=" + map +
                ", pet=" + pet +
                '}';
    }
    ...省略set get方法
@ConfigurationProperties(prefix = “person”)将配置文件中以person开头的属性值通过setter方法注入实体类对应属性
@Component当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有这样它才能被@ConfigurationProperties注解赋值
 <!--配置处理器依赖,为了出现代码提示的效果来方便配置,在使用@ConfigurationProperties注解
 进行配置文件属性值注入时,可以添加以下依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
  • 对于yml文件,使用key:(空格)value格式配置属性,使用缩进控制层级关系,有行内写法缩进式写法两种方式。
  • application.properties配置文件优先级要高于application.yml配置文件优先级。
// properties文件格式 (二选一)
# 对实体类对象Person进行属性配置
person.id=1
person.name=tom
person.hobby=play,read,sleep
person.family=father,mother
person.map.k1=k1
person.map.k2=k2
person.pet.type=dog
person.pet.name=kimi
// yml文件格式
person:
  id: 2
  name: jerry
  hobby: [read,play,football]
  family: [father,mother]
  map: {k1: k1,k2: k2}
  pet: {type: cat,name: tom}

编写测试类,运行测试可在控制台得到person对象的属性

@RunWith(SpringRunner.class)
@SpringBootTest
class Chapter02ApplicationTests {

    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

配置文件属性值注解注入对比

- 使用Spring Boot全局配置文件配置属性时
如果配置的属性是Spring Boot默认提供的属性,如server.port,那么Spring Boot会自动扫描并读取属性值。
如果是如上图的实体类Person属性,则必须在程序中注入这些配置属性方可生效。
  • 使用@ConfigurationProperties注入属性
    – 该注解是Spring Boot提供
    – 该注解用来快速方便将配置文件中的自定义属性值批量注入某个Bean对象的多个对应属性中。
    – 需要注意的是,使用@ConfigurationProperties注解批量注入属性值时,要保证配置文件的属性和对应实体类的属性名一致,否则无法正确获取并注入属性值。
  • 使用@Value注入属性
    – 该注解是Spring框架提供,用来读取配置文件中的属性值并逐个注入Bean对象的对应属性
    – Spring Boot框架对Spring框架中@Value注解进行了默认继承,故还可以使用
    – 使用@Value注解注入的类型只能是基本数据类型
@Component //用于将Person类作为Bean注入Spring容器中
//@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性注入该类中
public class Person {
    @Value("${person.id}")
    private int id;
    @Value("${person.name}")
    private String name;
    private List<String> hobby;
    private String[] family;
    private Map<String,String> map;
    private Pet pet;
    //测试过程如上

对比分析

  • 底层框架
    – @ConfigurationProperties注解是SpringBoot自带;而@Value注解是Spring框架支持的
    – Spring Boot框架对Spring进行了默认支持,故也可使用@Value注解
  • 功能
    – @ConfigurationProperties注解:将配置文件中属性批量注入Bean对象
    – @Value注解:只能单个注入属性
  • 属性setter方法
    – @ConfigurationProperties注解进行属性注入时,必须为每一个属性设置setter方法,通过对应的注解才能够将配置文件中属性一一匹配。如果配置文件中没有配置属性值,会将对应Bean属性置空。
    – @Value注解不需要为属性设置setter方法,该注解会先通过表达式读取配置文件中的属性值,然后自动注入下方的Bean属性上。如果读取的配置文件属性为空,进行属性注入的程序会自动报错。
  • 复杂类型数据注入
    – @ConfigurationProperties注解支持任意数据类型属性注入,包括基本数据类型和复杂数据类型
    – @Value注解只能注入基本数据类型
  • 松散绑定
    – @ConfigurationProperties注解支持松散绑定语法
    – @Value注解不支持松散绑定语法进行属性注入
person.firstName=james  //标准写法,对应Person类属性名
person.first-name=james //使用“-”分隔多个单词
person.first_name=james //使用“_”分隔多个单词
PERSON.FIRST_NAME=james //使用大小写格式,推荐常量属性配置
  • JSR303数据校验
    – @ConfigurationProperties注解在进行配置文件属性值注入时,支持JSR303数据校验,其主要作用是校验配置文件中注入对应Bean属性的值是否符合相关值的规则
    – 如果注入的配置文件属性值不符合相关校验规则,程序会自动报错
    – @Value注解不支持JSR303数据校验功能
@Component
@ConfigurationProperties(prefix = "person")
@Validated 	//引入Spring框架支持的数据校验规则
public class Example{
	@Email  //对属性进行规则匹配
	private String email;
	public void setEmail(String email){
	this.email = email;
	}
}
  • SpEL表达式
    – @Value注解注入配置文件属性时,支持SpEL语法,即"#{xx}"
    – @ConfigurationProperties注解不支持SpEL语法
@Value("#{5*2}")  //使用@Value注解的SpEL表达式直接为属性注入值
private int id;
在IntelliJ IDEA中,为了在Spring Boot项目中定义一个YAML配置文件用于存储员工基本信息,你可以创建一个名为`employee.yml`的文件,其内容大概如下: ```yaml employees: - id: 001 name: 张三 birthDate: 1990-01-01 hobbies: - 阅读 - 游泳 gender: 男 - id: 002 name: 李四 birthDate: 1985-06-15 hobbies: - 篮球 - 跑步 gender: 女 ``` 然后你需要定义一个`Employee`类,使用Lombok库可以方便地处理getter和setter,以及属性注解。如果没有引入Lombok,可以在每个字段前加上对应的getter和setter。 ```java import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; @ConfigurationProperties(prefix = "employees") @Component public class Employee { private String id; private String name; private Date birthDate; private List<String> hobbies; private String gender; // getters and setters (using Lombok or manually) public String getId() { return id; } @ lombok.Getter public void setId(String id) { this.id = id; } public String getName() { return name; } @ lombok.Getter public void setName(String name) { this.name = name; } public Date getBirthDate() { return birthDate; } @ lombok.Getter public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } public List<String> getHobbies() { return hobbies; } @ lombok.Getter public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; } public String getGender() { return gender; } @ lombok.Getter public void setGender(String gender) { this.gender = gender; } } ``` 在这个Employee类上添加`@ConfigurationProperties`注解,Spring会自动将`employee.yml`中的配置映射到这个类的属性上。你可以通过@Autowired直接注入这个Employee对象到需要的地方,Spring会自动设置属性。例如: ```java @Service public class UserService { private final Employee employee; @Autowired public UserService(Employee employee) { this.employee = employee; } //... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值