SpringBoot 配置文件给实体注入值方式

目录
  • 配置文件给实体注入值
    • properties用法
    • yaml用法
    • 通过配置文件给实体类注入属性
    • 上面yml中注意
    • 也可以使用properties注入
  • 配置文件值注入方式
    • 1.1 从全局配置文件中读取配置到实体类 (@ConfigurationProperties)
    • 1.2 全局配置文件注入值(@Value)
    • 1.3 从指定文件读取并配置实体类(@PropertySource+@ConfigurationProperties)
    • 1.4 从指定文件读取并注入值(@PropertySource+@Value)

配置文件给实体注入值

SpringBoot 默认的全局配置文件有两个 application.properties 和application.yml

properties用法

# 例如修改端口号 直接赋值
server.port=8888

yaml用法

# 例如修改端口号
server:
    port: 8888
  • YML中赋值是以键值对的形式,且利用缩进表示层级关系,同一级缩进必须一致
  • 大小写敏感,支持松散写法,且冒号后面必须有一个空格

通过配置文件给实体类注入属性

// 实体类
@Component // 把实体类放入到spring容器中
@ConfigurationProperties(prefix = "student") // 识别配置文件
public class Student {
    private String name;
    private int age;
    private boolean sex;
    private Date birthday;
    private Map<String, Object> location;
    private String[] hobbies;
    private List<String> skills;
    private Pet pet;

    // .... set/get/toString
}
# yml 配置文件
student:
	name: zs
	age: 23
	sex: true
	birthday: 2020/10/1
	location: {province: 湖北,city: 武汉, zone: 洪山}
	hobbies: [足球, 篮球]
	skills: [编程, 金融]
	pet:
		nickName: wc
		strain: hsq

在这里注意不同数据类型的写法,简单的数据直接赋值

# map类型和对象类型 的两种写法
# 1.行内写法
location: {province: 湖北,city: 武汉, zone: 洪山}
pet: {nickName: wc, strain: hsq}
# 2.分行写
location:
	province: 湖北
	city: 武汉
	zone: 洪山
pet:
	nickName: wc
	strain: hsq
# 数组、list、set
# 1、行内写法, 其中中括号还可以省略
hobbies: [足球, 篮球]
skills: [编程, 金融]
# 2、分行写
hobbies:
	- 足球
	- 篮球
skills:
	- 编程
	- 金融

到 SpringBoot 测试文件中测试输出

    @Autowired
    Student student;
    @Test
    void contextLoads() {
        System.out.println(student);
    }

结果

Student{name='zs', age=23, sex=true, birthday=Thu Oct 01 00:00:00 CST 2020, location={province=湖北, city=武汉, zone=洪山}, hobbies=[足球,篮球], skills=[编程, 金融], pet=Pet{nickName='wc', strain='hsq'}}

上面yml中注意

# 如果对字符串加单引号,双引号会有什么区别
location: {province: "湖北",city: '武汉', zone: 洪山}
# 如果引号中只是字符串时没什么区别
location: {province: "湖\n北",city: '武\n汉', zone: 洪\n山}
# 此时双引号中的转义字符会被识别,会换行,单引号和不加引号会原样输出

也可以使用properties注入

student.name=ls
student.age=24
...

其中properties文件和yml文件中的值可以互相引用。两个配置文件可以互补,properties文件优先级高于yml

另外如果要注入的值不在这两个默认配置文件中,这是需要使用@PropertySource注解,遗憾的是该注解只支持properties文件,不支持yml文件

@PropertySource(value = {"classpath:conf.properties"})
public class Student {
    ...

配置文件值注入方式

1.1 从全局配置文件中读取配置到实体类 (@ConfigurationProperties)

配置文件 (application.yml)(写在application.properties也可以,格式变一下即可)

person:
  lastName: Mary
  age: 16
  birthDate: 2004/01/01
  maps: {one:1,two:2,three:3}
  lists:
    - 1
    - 2
    - 3
  pet:
    name: wangcai
    age: 3

实体类(javaBean):

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 *
 * @Component:
 *     只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 *
 * @ConfigurationProperties:
 *     告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定(默认配置文件为application.properties与
 *     application.yml);
 *
 * prefix = "person":
 *       配置文件中哪个下面的所有属性进行一一映射
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Date birthDate;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Pet pet;
    //省略get,set方法
    @Override
    public String toString() {
        String mapValue = "";

        if(this.maps!=null){
            for(String key:this.maps.keySet()){
                Object value = this.maps.get(key);
                mapValue += key+"\t"+value+"\t";
            }
        }
        return "lastName:"+this.lastName+
                "\nage:"+this.age+
                "\nbirthDate:"+this.birthDate+
                "\nmaps:"+mapValue+
                "\nlists:"+this.lists+
                this.pet;
    }
}
public class Pet {
    private String name;
    private Integer age;
    //省略get,set方法

    @Override
    public String toString() {
        return "\nPet:\n\tPet name:"+this.name+
                "\n\tPet age:"+this.age+"\n";
    }
}

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

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

测试

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    Person person;
    @Test
    void contextLoads() {
        System.out.println(person.toString());
    }
}

1.2 全局配置文件注入值(@Value)

@Value 其实是Spring中的注解,其功能使用xml文件描述是这样的:

 <bean class="Person">
     <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
 <bean/>

其中property表示的是Person类中的各项属性,name用于指定具体属性,value用于指定值。

value的值主要有3种:

  • 字面量,也就是数字(1,2…)、字符串(abc)、布尔变量(true、false)等常量
  • ${key},从环境变量、配置文件中获取值
  • #{SpEL}, Spring的表达式语言,可以执行一些计算,调用一些函数
@Component
public class Person {
    @Value("${person.last-name}")  //@Value("#{'Lily'.toUpperCase()}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    private Date birthDate;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Pet pet;
    //省略get,set和toString
}

1.3 从指定文件读取并配置实体类(@PropertySource+@ConfigurationProperties)

在 resources 目录下创建 person.properties

person.lastName = Lily
person.age = 20
person.birthDate = 2000/01/01
person.maps.one = 1
person.maps.two = 2
person.lists = a,b,ch
person.pet.name = wangcai
person.pet.age = 3

更改 Person 类中的注解

@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
    //...省略属性,get,set,toString
}

要注意的是,PropertySource 只支持properties文件,不支持yml文件读取。

1.4 从指定文件读取并注入值(@PropertySource+@Value)

创建配置文件

更改注释

@Component
@PropertySource(value = {"classpath:person.properties"})
public class Person {
    @Value("${person.last-name}")
    private String lastName;
    //...省略属性,get,set,toString
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 在SpringBoot下读取自定义properties配置文件的方法

    SpringBoot工程默认读取application.properties配置文件.如果需要自定义properties文件,如何读取呢? 一.在resource中新建.properties文件 在resource目录下新建一个config文件夹,然后新建一个.properties文件放在该文件夹下.如图remote.properties所示 二.编写配置文件 remote.uploadFilesUrl=/resource/files/ remote.uploadPicUrl=/resource

  • 史上最全面的Spring Boot配置文件深入讲解

    前言 Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍.Spring Boot配置文件对Spring Boot来说就是入门和基础,经常会用到,所以写下做个总结以便日后查看. 下面话不多说了,来一起看看详细的介绍吧 1.配置文件 当我们构建完Spring Boot项目后,会在resources目录下给我们一个默认的全局配置文件 application.properties,这是一个空文件,因为Spring Boot在底层已经把配置都给我们自动配置好了,当在

  • SpringBoot属性注入的多种方式实例

    目录 一.@Value注解注入属性 二.@ConfigurationProperties注解批量注入属性 三.注入实体对象 四.自定义文件注入 总结 一.@Value注解注入属性 SpringBoot默认可以将application.properties文件或application.yml文件中定义的属性值注入到java类中,这种注入实际上是通过java类属性的setter方法进行的. 例:将application.yml中的以下属性注入到类中: ## 自定义属性 petshop:   name

  • springboot yml配置文件值注入方式

    目录 yml配置文件值注入 搭建项目 创建实体类 spring boot核心配置文件application.yml 测试类 运行 自动注入yml文件和properties文件 yml文件的自动注入class Properties配置文件自动注入 代码中直接注入 yml配置文件值注入 搭建项目 参考 IDEA快速搭建spring-boot项目(Spring initializr) pom.xml 创建项目后,还需在pom.xml中的<dependencies>标签添加该依赖. <depen

  • SpringBoot 配置文件给实体注入值方式

    目录 配置文件给实体注入值 properties用法 yaml用法 通过配置文件给实体类注入属性 上面yml中注意 也可以使用properties注入 配置文件值注入方式 1.1 从全局配置文件中读取配置到实体类 (@ConfigurationProperties) 1.2 全局配置文件注入值(@Value) 1.3 从指定文件读取并配置实体类(@PropertySource+@ConfigurationProperties) 1.4 从指定文件读取并注入值(@PropertySource+@V

  • springboot配置文件中使用${}注入值的两种方式小结

    目录 配置文件中使用${}注入值方式 在springboot中使用System.setProperty设置参数 配置文件自扫描 spring配置文件${}的用法 话不多说直接看就完事了 配置文件中使用${}注入值方式 在springboot中使用System.setProperty设置参数 user:   user-name: ${username}   age: ${age} 配置文件是这种写法,我们可以用System.setProperty来设置参数,System.setProperty相当

  • 关于springboot 配置文件中属性变量引用方式@@解析

    这种属性应用方式是 field_name=@field_value@. 两个@符号是springboot为替代${}属性占位符产生,原因是${}会被maven处理,所以应该是起不到引用变量的作用. @@方式可以引用springboot非默认配置文件(即其他配置文件)中的变量: springboot默认配置文件是 src/main/resources/application.properties 补充知识:springboot项目使用@Value注解获取配置文件中的配置信息 application

  • springboot application.properties 文件注入数组方式

    目录 application.properties 文件注入数组 在application.properties中注入value,list和map 配置文件 注解 数据注入 application.properties 文件注入数组 1.application.properties ips=192.168.0.105,192.168.0.106,0:0:0:0:0:0:0:1 2.代码 @Value("#{'${ips}'.split(',')}") private List<S

  • springboot配置文件读取pom文件信息方式

    目录 配置文件读取pom文件信息 解决的问题 解决 修改后的写法 maven打包命令 可能会出现的一些问题 Pom文件依赖配置说明 scope依赖范围 配置文件读取pom文件信息 解决的问题 springboot(当然别的也可以)多环境切换需要修改配置文件硬编码,打包时不够方便. 解决 配置文件能读取pom文件中的配置,根据命令选择不同配置注入springboot的配置文件中 pom配置文件: <!-- 环境 --> <profiles> <!-- 开发 --> <

  • SpringBoot 属性配置中获取值的方式

    目录 SpringBoot 属性配置中获取值 首先,定义一个实体类去写属性 测试和生产区分 SpringBoot 获取值和配置文件 1.@ConfigurationProperties(prefix = "student")方式 2.@Value方式 3.@PropertySource 4.@ImportResource和@Bean SpringBoot 属性配置中获取值 在配置文件中定义属性的值,然后再获取,在这里做一个总结,首先,在application.yml文件中定义端口和属性

  • SpringBoot使用@Value实现给静态变量注入值

    SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值 例如 application-dev.properties 配置文件有如下配置: 给普通变量赋值时,直接在变量声明之上添加@Value()注解即可,如下所示: 当要给静态变量注入值的时候,若是在静态变量声明之上直接添加@Value()注解是无效的,例如: 虽然没有编译和运行上的报错,经调试可知这种注解方式mailUsername.mailPassword.mailHost的值都是null,也就是说直接给静态变

  • SpringBoot yaml中的数组类型取值方式

    目录 yaml中的数组类型取值 先说下简单的配置如何取值 springboot配置文件yml的数组形式 配置文件 实体类 yaml中的数组类型取值 yaml中简单的风格,十分受大家的欢迎 先说下简单的配置如何取值 # application-dev.yml testValue: testValueChild: testValueChildValue ... // SomeServiceImpl.java @Service public class SomeServiceImpl { // 这样就

  • SpringBoot详解如果通过@Value注解给静态变量注入值

    目录 前序 方案一 方案二 方案三 使用场景 总结 最近做项目的时候,给static变量赋值, 使用 @value注解 ,结果 获取一直为null , 1.spring不允许/不支持把值注入到静态变量中 2.Spring的@Value依赖注入是依赖set方法 3.set方法是普通的对象方法 4.static变量是类的属性,static没有set方法 前序 SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值 例如,application-dev.properti

  • 关于springboot配置文件密文解密方式

    目录 一.配置文件密文解密 二.配置中心密文解密( 以springcloud+nacos为例 ) 总结 在使用 springboot 或者 springcloud 开发的时候,通常为了保证系统的安全性,配置文件中的密码等铭感信息都会进行加密处理,然后在系统启动的时候对密文进行解密处理. 一.配置文件密文解密 在使用 springboot 或者 springcloud 的时候,通常会在 application.yaml 配置文件中配置数据库的连接信息. 例如: mysql: driver: com

随机推荐