在使用SpringBoot开发中需要将一些配置参数放在yml文件中定义,再通过Java类来引入这些配置参数

SpringBoot提供了一些注解来实现这个功能

  • ConfigurationProperties
  • Value
  • EnableConfigurationProperties

下面提供例子来说明如何引入常规变量,数组,List,Map,引用对象。

[相关代码-GitHub]

引入pom

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

<!--lombok 插件,非必须 -->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
</dependency>

注解类

这里定义了一个全局的注解类,

@Data
@ToString
@ConfigurationProperties(prefix = "all")
public class AllConfigurationProperties {

//普通变量
private String name;
   //引用对象
private OtherProperties other = new OtherProperties();
//数组
private String[] server;
//list
private List list;
//map
private Map map;
//复杂map
private Map<String, ModuleConfig> modules = new LinkedHashMap();
//复杂list
private List<ModuleConfig> modulesList; }
ConfigurationProperties:标明者是一个配置类,需要prefix配置yml中的配置前缀。

需要注意几点
1. 配置类中的名称应当符合JavaBean的命名方式
2. 配置类中的名称应当与yml中的相同,否则应使用@Value指定
比如:
yml文件:

all:
  name: libai
------------------------------------
@Value("${all.name}")
private String myName;
3. 如果已经使用@Value方式,可不用写Setter方法。否则必须为该变量写Setter方法,这里使用lombok的注解@Data来配置,会自动生成Setter,Getter,ToString方法

4. 默认值设置:
  (1)当使用@Value时,可以通过如下方式实现   @Value("${nzrpc.netty.port:8321}")
       private int nport;
     当yml没有配置nzrpc.netty.port 时,默认值便是8321
  (2) 或者是直接对变量赋值
    private int nport = 8321 ;
    private  OtherProperties other = new OtherProperties();
 

上述配置类的引用对象
@Data
public class ModuleConfig {
private static final long serialVersionUID = 5508512956753757169L;
private String name;
private String version;
private String owner;
} @Data
public class OtherProperties { private Long id;
private String version;
}

使能配置类

@Slf4j
@EnableConfigurationProperties(AllConfigurationProperties.class)
@Configuration
public class AutoConfiguration { @Autowired
AllConfigurationProperties properties; @PostConstruct
public void init(){ System.out.println("properties = " + properties); } }

这里使用@EnableConfigurationProperties使能配置类。它会为AllConfigurationProperties注入yml中的配置参数,并创建一个bean,后续可使用@Autowired注入使用

@Configuration注明这是一个SpringBoot的配置类

使用方法init()输出配置.

yml中配置

all:
name: libai
other:
id: 100
version: 1.0.1 server:
- 127.0.0.1
- 127.0.0.2
- 127.0.0.3 list:
- 111
- 222
- 333 map:
key1: value1
key2: value2
key3: value3 modules:
key1:
name: modules-name-1
version: modules-version-1
owner: modules-owner-1
key2:
name: modules-name-2
version: modules-version-2
owner: modules-owner-2 modulesList:
- name: modules-name-3
version: modules-version-3
owner: modules-owner-3
- name: modules-name-4
version: modules-version-4
owner: modules-owner-4

输出

properties =
AllConfigurationProperties(
name=libai,
other=OtherProperties(id=100, version=1.0.1),
server=[127.0.0.1, 127.0.0.2, 127.0.0.3],
list=[111, 222, 333],
map={
   key1=value1,
    key2=value2,
   key3=value3
   },
modules={
   key1=ModuleConfig(name=modules-name-1, version=modules-version-1, owner=modules-owner-1),
   key2=ModuleConfig(name=modules-name-2, version=modules-version-2, owner=modules-owner-2)
   },
modulesList=[
   ModuleConfig(name=modules-name-3, version=modules-version-3, owner=modules-owner-3),
   ModuleConfig(name=modules-name-4, version=modules-version-4, owner=modules-owner-4)
   ])

注解ConfigurationProperties注入yml配置文件中的数据的更多相关文章

  1. spring boot: 从配置文件中读取数据的常用方法(spring boot 2.3.4)

    一,从配置文件中读取数据有哪些方法? 通常有3种用法: 1,直接使用value注解引用得到配置项的值 2,  封装到Component类中再调用 3,  用Environment类从代码中直接访问 生 ...

  2. Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题

    在写一个工具类的时候,因为要用到yml中的自定义参数,使用@Value发现值不能正常注入,都显示为null: yml文件中的自定义格式 调用工具类的时候不能new的方式 要使用@Autowired的方 ...

  3. springboot在yml配置文件中配置类的属性笔记

    首先建立一个简单的实体类,我这里以学生为例,并加上@Component和@ConfigurationProperties(prefix ="student")注解,其中prefix ...

  4. web中纯java获取配置文件中的数据

    /*********获取配置文件,但配置文件中的值改变,不会随着值的改变也获取的参数值改变**********/  /**   * 原因是因为,类装载,装载完后,不会再去装载了   * *///  I ...

  5. 在controller中无法通过注解@Value获取到配置文件中定义的值

    1. 默认的我们通常只在dao层用到jdbc的配置,然后使用到@Value注解获取到值. 这时候会在spring-dao扫描中加入下面配置 <context:property-placehold ...

  6. css注入获取网页中的数据

    <style><?php echo htmlspecialchars($_GET['x']);?></style> <br><br>< ...

  7. java中读取配置文件中的数据

    1.先在项目中创建一个包(如:config),再创建一个配置文件(如:a.properties),添加配置信息如下:比如:name=kakaage=28 2.代码:import java.io.IOE ...

  8. SpringBoot中yml配置文件

    1.yml配置文件书写格式 格式是在普通配置文件中以“.”分割的属性名称,该为“: ”和换行. 例子: //普通格式 spring.datasource.driver-class-name=com.m ...

  9. springboot项目logback.xml或者logback-spring.xml中读取不到application.yml或application.properties配置文件中的配置解决办法

    在springboot项目中我们可能想要实现不同环境的日志项目配置不同,比如我想让不同环境的日志路径不同. 这时候我们很容易想: 1.到将日志路径配置在springboot的:application- ...

随机推荐

  1. Scrapy 1.4 文档 03 Scrapy 教程

    在本教程中,我们假设您已经安装了Scrapy.如果没有,请参阅安装指南. 我们将要抓取 quotes.toscrape.com,一个列出著名作家的名言(quote)的网站. 本教程将引导您完成以下任务 ...

  2. Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面

    一.看下内部原理 简化后的认证过程分为7步: 用户访问网站,打开了一个链接(origin url). 请求发送给服务器,服务器判断用户请求了受保护的资源. 由于用户没有登录,服务器重定向到登录页面 填 ...

  3. 《Hadoop金融大数据分析》读书笔记

    <Hadoop金融大数据分析> Hadoop for Finance Essentials 使用Hadoop,是因为数据量大数据量如此之多,以至于无法用传统的数据处理工具和应用来处理的数据 ...

  4. Oracle .NET Core Beta驱动已出,自己动手写EF Core Oracle

    使用.net core也有一段时间了,一直都没有Oracle官方的正式版驱动程序,更别说EF版本了.之前基于Oracle官方的.net core预览版本写了个Dapper的数据库操作实现,但是总感觉不 ...

  5. java之集合Collection详解之3

    package cn.itcast_03; public class Student { // 成员变量 private String name; private int age; // 构造方法 p ...

  6. 玩转spring mvc(六)---自定义异常跳转页面

    本文主要是关于如何在出现异常 如404时,跳转到自定义的异常页面,当然这不是spring的知识,但可以整合进去. 在web.xml中新增如下代码,里边的路径可以根据实际情况进行修改 <!-- 7 ...

  7. fixed元素随滚动条无抖动滚动

    页面上用fixed定位一个元素,随滚动条滚动位置不变,最开始我只用了css给元素身上写上fixed属性,发现滚动时元素会发生抖动,随后我就在网上找到解决办法,封装了个方法,如下: Css部分 此部分是 ...

  8. 由一条sql语句想到的子查询优化

    摘要:相信大家都使用过子查询,因为使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,比较灵活,我也喜欢用,可最近因为一条包含子查询的select count(*)语句导致点开管理系 ...

  9. compact_op.go

    package clientv3 import (     pb "github.com/coreos/etcd/etcdserver/etcdserverpb" ) // Com ...

  10. bzoj2281 [Sdoi2011]黑白棋

    一眼$nimk$游戏,后来觉得不对劲,看了黄学长博客发现真的不是$nimk$. 就当是$nimk$做吧,那么我们要保证每一位上一的个数都是$d+1$的倍数. $dp$:$f[i][j]$表示从低到高第 ...