SpringBoot 从配置文件读取值到对象中

一、实现方式
1、@ConfigurationProperties(prefix = “person”),prefix标明从哪个前缀开头的属性开始,默认从application.properties/yml主配置文件中读取,也可以用过@PropertySource(value={“classpath:person.properties”})注解指定读取的配置文件。

  • 作用在类上,从配置文件中读取属性回填到对象,支持复杂的结构如:list、map、对象等,推荐使用。
  • 支持@Validated数据校验

2、@Value注解

  • 作用在属性上,需要对属性逐个绑定
  • 不支持复杂类型封装
  • 不支持@Validated

二、区别

@ConfigurationProperties@Value
功能作用在类上,实现批量注入属性值作用在属性上,需要逐个绑定
松散绑定支持不支持
SpEL(表达式)不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

三、代码演示
1、实例对象,使用@ConfigurationProperties

package com.wsy.properties.model;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;

@Component // 需要将对象注入到ioc容器中
@Data // lombok注解
@ConfigurationProperties(prefix = "person") // 根据前缀标明读取的具体位置
@Validated
public class Person {
	//@Email
    private String name;

    private int age;

    private String addr;

    private List<String> books;

    private Map<String, String> courseMapTeacher;

    private Dog dog;
}
package com.wsy.properties.model;

import lombok.Data;

@Data
public class Dog {
    private String name;

    private int age;
}

2、使用@Value注解

package com.wsy.properties.model;

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

@Component // 需要将对象注入到ioc容器中
@Data // lombok注解
//@ConfigurationProperties(prefix = "person") // 根据前缀标明读取的具体位置
@Validated
public class Person {
    /**
     * <bean class="Person">
     *     <property name="name" value="字面量/${key}从环境变量、配置文件中获取的值/#{SpEl}表达式"></property>
     * </bean>
     */
    @Email
    @Value("${person.name}")
    private String name;

    @Value("#{2*3}")
    private int age;

    @Value("${person.addr}")
    private String addr;

    //@Value注解不支持
    private List<String> books;

    //@Value注解不支持
    private Map<String, String> courseMapTeacher;

    //@Value注解不支持
    private Dog dog;
}

3、配置文件
application.properties

person.name=jack
person.age=18
person.addr=北京市
person.books=java,python.go
person.course-map-teacher.key1=v1
person.course-map-teacher.key2=v2
person.dog.name=tom
person.dog.age=2

application.yml

person:
  name: lucy
  age: 16
  addr: 北京
  books: [java,kafka,netty]
  course-map-teacher: {key1: v1,key2:v2}
  dog:
    name: ${person.name}
    age: ${random.int(5)} #表达式

4、演示结果

@ConfigurationProperties
Person(name=jack, age=18, addr=北京, books=[java, python.go], courseMapTeacher={key1=v1, key2=v2, key2v2=}, dog=Dog(name=tom, age=2))
@ValuePerson(name=jack, age=6, addr=北京, books=null, courseMapTeacher=null, dog=null)

使用@ConfigurationProperties方式时,如果@Email注释放开则会被校验住,而@Value则不会
且如果配置文件没有bean的配置,使用@Value会报错,而@ConfigurationProperties不会报错,默认加载对象的默认值

四、@PropertySource 读取指定配置文件

@Component // 需要将对象注入到ioc容器中
@Data // lombok注解
@ConfigurationProperties(prefix = "person") // 根据前缀标明读取的具体位置
@PropertySource("classpath:person.properties") // 指定具体的配置文件
public class Person

五、@ImportResource:导入Spring配置文件,让配置文件里面的内容生效
1、自定义spring配置文件:

<?xml version='1.0' encoding='UTF-8'?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx" >

    <bean id="person" class="com.wsy.properties.model.Person"></bean>
</beans>

2、在启动类上加上注解@ImportResource(locations = {“classpath:bean.xml”}),spring会加载配置文件,将配置文件中指定的类注入到ioc容器中

3、运行结果

Person(name=null, age=0, addr=null, books=null, courseMapTeacher=null, dog=null)

六、思维导图
在这里插入图片描述

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页