在使用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. Linux时间子系统之(一):时间的基本概念

    专题文档汇总目录 Notes:Linux时间基准点:Linux时间和broken-down time(struct tm):不同精度的时间表示time_t.timeval.timespec. 原文地址 ...

  2. Linux时间子系统之(六):POSIX timer

    专题文档汇总目录 Notes:首先讲解了POSIX timer的标识(唯一识别).POSIX Timer的组织(管理POSIX Timer).内核中如何抽象POSIX Timer:然后分析了POSIX ...

  3. 使用Coding Pages托管网站

    作者:荒原之梦 Coding官网: https://coding.net Coding Pages官网页面: https://coding.net/pages/ 具体过程如下: 1 注册Coding账 ...

  4. C++使用类和对象

    1. 内置函数 程序调用函数时需要一定的时间和空间开销,其执行过程一般如下: 而C++提供了一种高效率的方法,即在编译的时候将所调用函数的代码直接嵌入到主函数中,而不是将流程转出去,这样可以避免函数调 ...

  5. Python将html转化为pdf

    前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...

  6. PHP引用符&的用法举例

    php的引用就是在变量或者函数.对象等前面加上&符号.在PHP 中引用的意思是:不同的名字访问同一个变量内容.与C语言中的指针是有差别的,C语言中的指针里面存储的是变量的内容在内存中存放的地址 ...

  7. Linux.安装phantomjs

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  8. 在Windows Server 2008 R2下搭建jsp环境(四)-在测试的过程中可能出现的问题

    环境基本部署好了之后,便开始测试,一定要让他经得起"考验",他才会值得你的信赖.Tomcat服务器部署成功的的验证方法(默认端口的情况下): 1.loacalhost:8080 2 ...

  9. 【bzoj1758】[Wc2010]重建计划

    Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案, ...

  10. BZOJ_2561_最小生成树_最小割

    BZOJ_2561_最小生成树_最小割 题意: 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条 ...