概念:

  • @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读取配置文件的两种方法

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

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

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

  4. springboot 读取配置文件

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

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

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

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

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

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

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

  8. SpringBoot 读取配置文件及profiles切换配置文件

    读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单. 先创 ...

  9. SpringBoot——读取配置文件@Value和@Configuration比较

    1.@Configuration package com.xgcd.springboot.bean; import org.springframework.boot.context.propertie ...

  10. SpringBoot | 读取配置文件信息

    server.port=8081 #修改端口号 server.servlet.context-path= /SpringBoot #修改URL #自定义配置 tz.name = xiaoming tz ...

随机推荐

  1. 如何有效地描述软件缺陷(Defect)?

    最近一个月偷懒了,刚看到一篇博文很不错.最近也是碰到一样的问题,由于我记录bug的描述不够清晰.导致开发看不懂我描述的bug,还有一些配置信息没记录好.出现一问三不知的情况,还被领导训.下面的博文是来 ...

  2. jsp页面格式时间yy-mm-dd

    这个问题把我花了1小时都没弄出来  各种报错  还是最后同学告知才知道的. 导入  :<%@ taglib uri="http://java.sun.com/jsp/jstl/func ...

  3. 【高级功能】使用Web存储

    Web存储允许我们在浏览器里保存简单的键/值数据.Web存储和cookie很相似,但它有着更好的实现方式,能保存的数据量也很大.这两种类型共享相同的机制,但是被保存数据的可见性和寿命存在区别. PS: ...

  4. c#中关键词out和ref的区别

    c#中关键词out和ref用来表明以传引用的方式传递参数. 区别如下: 如果方法的参数用out标记,表示方法被调用前不需初始化参数,方法内不能读取此参数的值,在方法返回前必须向此参数写入值: 如果方法 ...

  5. iOS-App生命周期

    iOS APP 生命周期   官方文档: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneO ...

  6. TStringList中AddObject使用

    结构体定义 PYpType=^TYpType; TYpType=record    yfcode:string;    ypcode:string;    YpUnitPrice:Currency;  ...

  7. Volley报错!!!No address associated with hostname

    年轻人检查你的网络去吧,这是没有网络导致的原因

  8. 防止输入时键盘覆盖掉textfiled

    添加监听者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardwasChange:) ...

  9. DB 查询分析器 6.03 ,遨游于任何Windows操作系统之上的最优秀的数据库客户端工具

    DB 查询分析器 6.03 ,遨游于任何Windows操作系统之上的最优秀的数据库客户端工具 中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员  .03版本已经完全兼容 ...

  10. EF操作数据库的步骤和一些简单操作语句

    这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...