SpringBoot 属性配置文件数据注入配置和yml与properties区别

kenx
• 阅读 1425

前言

我们知道SpringBoot 通过配置类来解放一堆的xml文件配置,通属性配置文件,来进行,系统全局属性配置,这样极大的简化了我们开发过程,java web 也可以甜甜的从此

SpringBoot 属性配置文件数据注入配置和yml与properties区别

快速配置

Spring Boot默认加载支持 application.properties、application.yaml和application*.yml三种拓展名结尾的全局属性配置文件处理

它们顺序优先级为: application*.properties>application*.yaml>application*.yml

即在application.properties或application.yml等文件中添加属性配置

可以使用@Value注解将属性值注入到beans中,或使用@ConfigurationProperties注解将属性值绑定到结构化的beans中

@Value是Spring框架提供的注解,用来读取配置文件中的属性并逐个注入到Bean对象对应的属性中,Spring Boot框架对Spring框架的@Value注解进行了默认继承

  1. resources文件下新增application.properties文件,配置对应的属性
student.name=kenx
student.age=23
  1. 新增java bean 把对应的属性注入到java bean中对应字段使用@Value注解将属性值注入到对应属性上。
@Component
@Data
public class User {
    @Value("${student.name}")
    private String name;
    @Value("${student.age}")
    private Integer age;
}

@Component 添加到spring ioc容器中,@Data 添加getter,setter

  1. 写用例测试
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.NONE,
        classes = cn.soboys.kmall.api.ApiApplication.class)
public class PropertiesTest {

    @Autowired
    private User properties;

    @Test
    public void a(){
        String a= String.format( "student name  is %s student age is %s",properties.getName(),properties.getAge());
        System.out.println(a);
    }
}

我看可以看到控制台正常打印,数据注入成功

2021-09-08 10:53:02 INFO  background-preinit org.hibernate.validator.internal.util.Version HV000001: Hibernate Validator 6.1.7.Final
2021-09-08 10:53:02 INFO  main PropertiesTest Starting PropertiesTest using Java 1.8.0_202 on xiangyongdeMacBook-Pro.local with PID 45463 (started by xiangyong in /Users/xiangyong/selfProject/project/kmall/kmall-api)
2021-09-08 10:53:02 INFO  main PropertiesTest The following profiles are active: test,mptest
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.4.1 
2021-09-08 10:53:08 INFO  main PropertiesTest Started PropertiesTest in 6.132 seconds (JVM running for 7.783)

student name  is kenx student age is 23
  1. @ConfigurationProperties注解将属性值绑定到结构化的beans

上面通过@Value一个·一个注入很不方便

@Component
@Data
@ConfigurationProperties(prefix = "student")
public class User {
    private String name;
    private Integer age;
}

这样极大简化代码,对于属性比较多,结构化bean,很有必要可以通过@ConfigurationProperties(prefix = "student")这种方式指定前缀

当然有时候我们需要自定义加载属性配置文件 使用@PropertySource加载配置文件

test.id=100
test.name=lucy
package com.lzx.springboot01demo.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration        // 自定义配置类
@PropertySource("classpath:test.properties")     // 指定自定义配置文件位置和名称
@EnableConfigurationProperties(MyProperties.class)        // 开启对应配置类的属性注入功能
@ConfigurationProperties(prefix = "test")        // 指定配置文件注入属性前缀
public class MyProperties {

    private Integer id;
    private String name;

    // 省略getter/setter方法
    // 省略toString()方法
}

1.@Configuration注解表示当前类是一个自定义配置类,并添加为Spring容器的组件,也可使用传统的@Component注解

  1. @PropertySource("classpath:test.properties")指定自定义配置文件位置和名称

  2. @ConfigurationProperties(prefix = "test")指定将配置文件中前缀为test的属性注入到配置类的属性中

  3. @EnableConfigurationProperties(MyProperties.class)表示开启对应配置类的属性注入功能,如果配置类上使用的是@Component注解而非@Configuration,@EnableConfigurationProperties(MyProperties.class)注解可以省略

application.properties配置文件

#配置数字
person.id=1
#配置字符串
person.name=tom
#配置List集合
person.hoby=吃饭,睡觉,打豆豆
#配置String[]数组
person.family=father,mother
#配置map集合
person.map.k1=v1
person.map.k2=v2
#配置对象type属性
person.pet.type=dog
#配置对象name属性
person.pet.name=旺财

application.y(a)ml配置文件

  1. value值为普通数据类型(例如:数字、字符串、布尔)
server:
  port: 8081
  path: /hello
  1. value值为数组或单列集合

主要有两种写法:缩进式写法和行内式写法;其中缩进式写法又有两种写法:

缩进式写法1

person:
  hobby:
    - play
    - read
    - sleep

缩进式写法2

person:
  hobby:
    play,
    read,
    sleep

行内式写法:

person:
  hobby: [play,read,sleep]
  1. value值为Map或对象

缩进式写法

person:
  map:
    k1: v1
    k2: v2

行内式写法:

person:
  map: {k1: v1, k2: v2}

注意 使用Spring Boot全局配置文件设置属性时,

如果配置的属性是已有属性,例如服务端口server.port,那么Spring Boot会扫描并读取这些配置属性,覆盖已有的默认配置; 如果配置的是自定义属性,则还需要在程序中注入这些配置属性方可生效

默认属性和参数引用

SpringBoot属性配置文件中默认给我们提供了一些特有的全局属性参数值我们可以直接获取

使用Spring Boot内嵌的RandomValuePropertySource类进行随机值注入。

# 配置随机值
my.secret=${random.value}
# 配置随机整数
my.number=${random.int}
# 配置随机long类型的整数
my.bigbumber=${random.long}
# 配置uuid
my.uuid=${random.uuid}
# 配置小于10的整数
my.number.less.than.ten=${random.int(10)}
# 配置范围在[1024,65536]的随机整数
my.number.in.range=${random.int[1024,65536]}

当然我们也可以自定义引用自己定义的值

# 参数间引用
app.name=MyApp
app.description=${app.name} is a Spring Boot application
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Spring boot 配置文件,配置注解详解 (properties 和yml )
从其他框架来看我们都有自己的配置文件,hibernate有hbm,mybatis有properties,同样,Springboot也有全局配置文件。Springboot使用一个全局的配置文件,而且配置文件的名字是固定的。有两种application.propertiesapplication.yml spring
Stella981 Stella981
3年前
Spring 学习笔记(三):Spring Bean
1Bean配置Spring可以看做是一个管理Bean的工厂,开发者需要将Bean配置在XML或者Properties配置文件中。实际开发中常使用XML的格式,其中<bean中的属性或子元素如下:id:Bean在BeanFactory中的唯一标识,在代码中通过BeanFac
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这