概念:

  • @ConfigurationProperties : 是springboot的注解,用于把主配置文件中配置属性设置到对于的Bean属性上

  • @PropertySource :是spring的注解,用于加载指定的属性配置文件到Spring的Environment中,可以和 @Value、@ConfigurationProperties配合使用

  • @EnableConfigurationProperties : 用来开启ConfigurationProperties注解配置;如果不使用的话,@ConfigurationProperties加入注解的类上加@Component也是可以交于springboot管理。

1、读取默认配置文件(application.properties、application.yml)

application.yml配置:

实现方式一 @ConfigurationProperties + @Component作用于类上

@ConfigurationProperties(prefix="person")
@Componment
@Data // lombok,用于自动生成getter、setter
public class Person {
private String name;
} @RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Person person; @GetMapping("/person")
public String parsePerson() {
return person.getName();
}
}

实现方式二 @ConfigurationProperties + @Bean作用在配置类的bean方法上

@Data
public class Person {
private String name;
} @Configuration
public class PersonConf{
@Bean
@ConfigurationProperties(prefix="person")
public Person person(){
return new Person();
}
} @RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Person person;
@GetMapping("/person")
public String parsePerson() {
return person.getName();
}
}

实现方式三 @ConfigurationProperties注解到普通类、 @EnableConfigurationProperties注解定义为bean

@ConfigurationProperties(prefix="person")
@Data
public class Person {
private String name;
}
// 说明: @EnableConfigurationProperties可以直接注到启动类上,也可以放在自定义配置类,自定义配置类使用@Configuration标注
@SpringBootApplication
@EnableConfigurationProperties(Person.class)
public class DbApplication {
public static void main(String[] args) {
SpringApplication.run(DbApplication.class, args);
}
} @RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Person person; @GetMapping("/person")
public String parsePerson() {
return person.getName();
}
}

实现方式四 @Value作用属性上

@RestController
@RequestMapping("/db")
public class TestController {
@Value("${person.name}")
private String name; @GetMapping("/person")
public String parsePerson() {
return name;
}
}

实现方式五 使用自带的Environment对象

@RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Environment environment; @GetMapping("/person")
public String parsePerson() {
return environment.getProperty("person.name");
}
}

2、读取自定义配置文件(比如:dangxiaodang.properties)

dangxiaodang.properties配置:(说明: PropertySource不支持yml、yaml,详细请看扩展内容)

实现方式一 @Configuration + @PropertySource + Environment

@Data
public class Person {
private String name;
} @Configuration
@PropertySource(value = "classpath:dangxiaodang.properties")
public class PersonConf {
@Autowired
private Environment environment;
@Bean
public Person person(){
Person person = new Person();
person.setName(environment.getProperty("person.name"));
return person;
}
} @RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Person person; @GetMapping("/person")
public String parsePerson() {
return person.getName();
}
}

实现方式二 @Configuration + @PropertySource + @Value

@Component
@PropertySource(value = "classpath:dangxiaodang.properties")
@Data
public class Person {
@Value("${person.name}")
private String name;
} @RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Person person; @GetMapping("/person")
public String parsePerson() {
return person.getName();
}
}

实现方式三 @Configuration + @PropertySource + @ConfigurationProperties

@Component
@PropertySource("classpath:dangxiaodang.properties")
@ConfigurationProperties(prefix = "person")
public class Person{
private String name;
} @RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Person person; @GetMapping("/person")
public String parsePerson() {
return person.getName();
}
}

扩展内容

  • 分析:@PropertySource 的注解中,有一个factory属性,可指定一个自定义的PropertySourceFactory接口实现,用于解析指定的文件。其中默认的实现是DefaultPropertySourceFactory,继续跟进,使用了PropertiesLoaderUtils.loadProperties进行文件解析,所以默认就是使用Properties进行解析的。
  • 解决方案:
    • 自定义实现类实现PropertySourceFactory
    • 自定义类继承DefaultPropertySourceFactory
  • 实现代码:

    dangxiaodang.yaml配置文件:(yml也支持)

public class YamlPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
Properties ymlProperties = factory.getObject();
String propertyName = name != null ? name : resource.getResource().getFilename();
return new PropertiesPropertySource(propertyName, ymlProperties);
}
} @Component
@PropertySource(value = "classpath:dangbo.yml", factory = YamlPropertySourceFactory.class) // 指定对应的factory
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
private String name;
} @RestController
@RequestMapping("/db")
public class TestController {
@Autowired
private Person person; @GetMapping("/person")
public String parsePerson() {
return person.getName();
}
}

【springboot读取配置文件】@ConfigurationProperties、@PropertySource和@Value的更多相关文章

  1. SpringBoot读取配置文件源码探究

    1. SpringBoot读取配置文件源码探究 1.1. 概览 springboot的源码是再原来的Spring源码上又包了一层,看过spring源码都知道,当我们从入口debug进去的时候,原来的S ...

  2. springboot读取配置文件中的信息

    在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...

  3. SpringBoot读取配置文件的内容

    1.@Value读取 在springboot项目中,如果要读取配置文件application.properties或application.yml文件的内容,可以使用自带的注解@Value.以prop ...

  4. Springboot读取配置文件的两种方法

    第一种: application.yml配置中的参数: zip: Hello Springboot 方法读取: @RestController public class ControllerTest ...

  5. SpringBoot 读取配置文件的值 赋给静态变量

    需求:写了一个工具类,但是工具类中的一些变量需要放到配置文件中,而这个工具类中的变量与方法都是静态的,这个时候我需要一个办法将配置文件中的相关配置读取过来赋值给这些静态变量.找了一些文章,试了一些方法 ...

  6. springboot 读取配置文件

    读取配置文件 在以前的项目中我们主要在 XML 文件中进行框架配置,业务的相关配置会放在属性文件中,然后通过一个属性读取的工具类来读取配置信息. 在 Spring Boot 中我们不再需要使用这种方式 ...

  7. SpringBoot读取配置文件三步走

    1首先新建application.properties文件 cn.qdl.demo.url=http://localhost:8080 2写一个类包上面的配置文件,类名随便取 public class ...

  8. springboot读取配置文件的顺序

    前言 今天测试一些东西,发现配置文件连接的数据库一直不正常,数据也不对,今天请教了之后,原来springboot的配置文件加载不仅仅是项目内的配置文件. 正文 项目目录是这样的:文件夹下有:项目,ap ...

  9. Springboot读取配置文件及自定义配置文件

    1.创建maven工程,在pom文件中添加依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...

随机推荐

  1. 《aspose》 word表格循环导出图片

    废话不多说,直接上代码,网上代码都不能用,迫不得已,最后查询了官网的源码.上菜! 模板文件可以自己去github去下载. package com.aspose.words.examples.mail_ ...

  2. java校验导入的模板

    /** * 验证导入模板的正确性 InputStream inputStream = file.getInputStream(); */ @SuppressWarnings("depreca ...

  3. 换一种视角看DNS(采坑篇)

    换一种视角看DNS 我们尽量用精炼的语言,尽可能的规划DNS的全貌(当然笔者水平有限,如有错误请不吝赐教). 通常啊我们在个人PC中能看到DNS的配置身影就是在上网的时候,通常如果你不配置DNS可能找 ...

  4. linux虚拟摄像头vivid配置

    总述    最近在看摄像头驱动,需要配置虚拟摄像头的驱动,但是教程里面是linux2.6内核的,实际电脑的是Ubuntu16,内核是linux4.15版本,从2.6到4.15内核好多文件发生了变化,所 ...

  5. Hive调优相关

    前言 Hive是由Facebook 开源用于解决海量结构化日志的数据统计,是基于Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL查询功能. 在资源有限的情况下,提 ...

  6. UI自动化实战进阶后续

    前言 最近几天因为回老家的缘故,暂时没空学习和记录,好不容易抽空那就赶紧开始后面的实战. 前面我们已经基本完成了测试的框架,并且也有了PO设计模式,后面我们还缺少什么呢?做为自动化测试最主要的测试报告 ...

  7. 2019牛客暑期多校训练营(第一场)H XOR(线性基)

    题意:给你n个数字,然后让你求所有满足异或和为0的子集的大小之和. 先对n个数求线性基,设线性基大小为r,可以分别计算线性基内数的贡献和线性基外数的贡献 1.线性基外:共n-r个数,枚举每个数x,将线 ...

  8. HDU2732 Leapin' Lizards 最大流

    题目 题意: t组输入,然后地图有n行m列,且n,m<=20.有一个最大跳跃距离d.后面输入一个n行的地图,每一个位置有一个值,代表这个位置的柱子可以经过多少个猴子.之后再输入一个地图'L'代表 ...

  9. 支撑性服务 & 自动化

    连载传送门: 什么是云原生? 云原生设计理念 .NET 微服务 谈到云原生,绕不开"容器化" Backing services 云原生系统依赖于许多不同的辅助资源,例如数据存储.消 ...

  10. MHA 高可用介绍

    目录 MHA 介绍 MHA 简介(Master High Availability) MHA 工作原理(转载) MHA 架构 MHA 工具 Manager 节点 Node 节点 MHA 优点 MHA ...