本文目录

  • 前言
    • 1.@PropertySource读取.properties配置文件
    • 2.@PropertySource读取.yml配置文件
    • 3.其他问题

前言

我们了解完 @ConfigurationProperties 注解的使用,知道了它可以将 application.yml 或 application.properties 主配置文件中的属性值与 Java Bean 对应属性进行注入

此时就引出另一个问题,如果所有属性值都配置在 主配置文件 中,主配置文件就会越来越庞大,这显然是不可以的。此时我们可以使用 Spring 为我们提供的 @PropertySource 注解,去加载指定的配置文件,然后结合 @ConfigurationProperties 注解,便能够实现指定配置文件与 Java Bean 的注入操作

接下来,我们就来用一个实例来了解一下。如何使用 @ PropertySource 注解来加载指定配置文件,实现配置文件与Java Bean 类的注入。


1.@PropertySource读取.properties配置文件

person.properties配置文件

我们新建一个 person.properties 配置文件,用来存放 Person 类的配置信息。接下来使用 @ PropertySource 注解,来实现通过读取该配置,实现配置文件与 Java Bean 类的注入操作。

//person.properties
person.id=111
person.name=扛麻袋的少年
person.age=18
person.manager=true
person.birthday=2020/03/27
person.map.k1=v1
person.map.k2=v2
person.list=basketball,tennis,swim
person.address.province=山西省
person.address.distinct=晋中市
person.address.county=祁县

javaBean类

添加 @PropertySource(value = {“classpath:person.properties”})注解,通过 value 属性让它去加载指定路径配置文件。代码如下:

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = "classpath:person.properties",encoding = "UTF-8")    //读取指定路径配置文件
public class Person {private String id;private String name;private int age;private boolean isManager;private Date birthday;private Map<String, Object> map;private List<String> list;private Address address;/*** 省略get/set/toString() 方法*/}
/*** Address类*/
public class Address {private String province;private String distinct;private String county;/*** 省略get/set/toString() 方法*/
}

测试:
  本次是在一个完整的项目中测试,所以我们将Person类使用@Autowired注入。如下图所示,它可以实现 person.properties 文件中的配置信息与自定义的 Person 类完成注入操作:

2.@PropertySource读取.yml配置文件

Spring Boot 默认不支持@PropertySource读取yaml 文件。

  Spring 4.3 通过引入 PropertySourceFactory 接口使之成为可能。PropertySourceFactory 是PropertySource 的工厂类。默认实现是 DefaultPropertySourceFactory,可以构造ResourcePropertySource 实例。

可以通过普通的是实现构造 createPropertySource, 需要做两点:
1.导入resource 到Properties 对象
2.构造 PropertySource 使用Properties

具体例子:

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.lang.Nullable;import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;/*** 自定义一个yml属性读取工厂类*/
public class YamlPropertySourceFactory implements PropertySourceFactory {@Overridepublic PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {Properties propertiesFromYaml = loadYamlIntoProperties(resource);String sourceName = name != null ? name : resource.getResource().getFilename();return new PropertiesPropertySource(sourceName, propertiesFromYaml);}private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException {try {YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();factory.setResources(resource.getResource());factory.afterPropertiesSet();return factory.getObject();} catch (IllegalStateException e) {// for ignoreResourceNotFoundThrowable cause = e.getCause();if (cause instanceof FileNotFoundException)throw (FileNotFoundException) e.getCause();throw e;}}
}

注意:YAML 需要 SnakeYAML 1.18 或者更高版本。

@PropertySource 注解有一个 factory 属性,通过这个属性来注入 PropertySourceFactory,这里给出 YamlPropertySourceFactory的例子。

javaBean类

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = "classpath:person.yml",factory = YamlPropertySourceFactory.class,encoding = "UTF-8")  //读取指定路径配置文件
public class Person {private String id;private String name;private int age;private boolean isManager;private Date birthday;private Map<String, Object> map;private List<String> list;private Address address;/*** 省略get/set/toString() 方法*/}

person.yml配置文件

我们新建一个 person.yml 配置文件,用来存放 Person 类的配置信息。(注意:冒号和value值之间要有一个空格哦)

person:id: 222name: 扛麻袋的少年manager: truebirthday: 2020/03/27map:k1: v1k2: v2list: basketball,tennis,swimaddress:province: 山西省distinct: 晋中市county: 祁县

测试:

  本次同样是在一个完整的项目中测试,所以我们将Person类使用@Autowired注入。如下图所示,它可以实现 person.yml文件中的配置信息与自定义的 Person 类完成注入操作:

读取.yml配置,参考自:https://zhuanlan.zhihu.com/p/141814495

3.其他问题

  1.在使用@ConfigurationProperties注解时,遇到提示:Spring Boot Configuration Annotation Processor not configured

需要在maven中添加如下配置:

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

  2.如果读取到的配置内容,中文却是乱码的情况,需要Ctrl + Alt + S 进行设置,进入Editor---File Encoding 进行设置,将下图中的编码全改为UTF-8

也可以在@PropertySource注解中,使用encoding属性,指定编码格式为UTF-8
如下所示:
@PropertySource(value = “classpath:person.properties”,encoding = "UTF-8")
@PropertySource(value = “classpath:person.yml”,factory = YamlPropertySourceFactory.class,encoding = "UTF-8")

Tip:在改完编码后,可能之前配置文件中的中文会随着编码而变成乱码,删了中文重写一遍即可。


博主写作不易,加个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

我不能保证所写的内容都正确,但是可以保证不复制、不粘贴。保证每一句话、每一行代码都是亲手敲过的,错误也请指出,望轻喷 Thanks♪(・ω・)ノ

@PropertySource 注解的使用相关推荐

  1. 【Spring注解系列12】@Value与@PropertySource注解

    1.@Value与@PropertySource注解 @Value注解:主要用于赋值,该值可以是取值配置文件中的,也可以直接赋值,也可以使用SpEl表达式进行计算的结果,抑或直接从环境变量中获取. 该 ...

  2. Spring Boot @PropertySource注解加载指定配置文件(五)

    我们可以通过@ConfigurationProperties和@Value两个注解获取主配置文件application.properties 或 apllication.yml中的配置信息,但是如果我 ...

  3. Spring boot的@PropertySource注解

    @PropertySource 用于加载指定的配置文件 只能,用于properties文件 使用方式 结合@ConfigurationProperties注解 指定读取配置中的属性 @Property ...

  4. propertysource注解_Java开发必须掌握的 20+ 种 Spring 常用注解

    作者:IT_faquir 链接:https://blog.csdn.net/IT_faquir 注解本身没有功能的,就和xml一样.注解和xml都是一种元数据,元数据即解释数据的数据,这就是所谓配置. ...

  5. propertysource注解 找不到文件_WinXP系统电脑开机提示windows找不到null文件的解决方法...

    WinXP系统开机提示windows找不到null文件怎么办?XP系统电脑开机提示windows找不到null文件该如何解决?请看下文具体介绍. 操作方法: 1,这是一个驱动文件,在C:Windows ...

  6. propertysource注解 找不到文件_电脑提示Windows找不到文件?试试这两个技巧,轻松解决!...

    如果在电脑开机时,弹出了有关"windows找不到文件"的提示窗口,但运行基本正常,这有可能是某程序卸载以后,注册表中残留有信息. 或者是电脑杀毒过程当中,杀毒软件将此文件作为病毒 ...

  7. @value 静态变量_Spring注解驱动开发之八——@Value属性赋值、@PropertySource 加载外部配置文件...

    本文包含以下内容: 建立新的配置类 建立新的测试方法 通过@Value 进行赋值 通过@PropertySource  加载配置文件,并进行注入 拓展@Value  .@PropertySource ...

  8. Spring高级之注解@PropertySource详解(超详细)

    定义/作用 @PropertySource注解用于指定资源文件读取的位置,它不仅能读取properties文件,也能读取xml文件,并且通过YAML解析器,配合自定义PropertySourceFac ...

  9. 《深入浅出Spring》@PropertySource、@Value注解及动态刷新实现

    @Value的用法 系统中需要连接db,连接db有很多配置信息. 系统中需要发送邮件,发送邮件需要配置邮件服务器的信息. 还有其他的一些配置信息. 我们可以将这些配置信息统一放在一个配置文件中,上线的 ...

  10. Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例

    Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例 转自:通过注解的方式集成Spring 4 MVC+Hibernate 4+MySQL+Maven,开发项目样例 ...

最新文章

  1. Windows Pe 第三章 PE头文件(中)
  2. 转载:正则表达式30分钟入门教程
  3. 实例讲解Oracle数据库设置默认表空间问题
  4. 常见模块设计--数据字典
  5. Turtle库的学习积累
  6. VS2017 installed in a different location
  7. tensorboard : 无法将“tensorboard”项识别为 cmdlet、函数、脚本文件或可运行 程序的名称。
  8. 通用唯一标识码UUID的介绍及使用
  9. c语言截图代码,截图代码 哪位大神帮我找一下错,截出来的图是这样子的
  10. premiere安装失败解决办法
  11. table表格高级用法(一)
  12. reduce python3_python3中reduce函数的使用
  13. eclipse 构建maven web工程
  14. 【luogu P1156 垃圾陷阱】 题解
  15. JXTA中定义自己的成员服务
  16. Word常见基本操作-《和秋叶一起学Word》
  17. JavaScript基础教程之flag的用法
  18. 与孤独世界的博弈——诺贝尔奖得主约翰·纳什的传奇一生
  19. 苹果手机换品胜电池后还能保持峰值状态吗?
  20. python:计算四分位距IQR

热门文章

  1. android 新浪微博分享提示签名错误,Android ShareSDK 微博分享 (8995)app auth fail for appKeysignpackage 解决...
  2. python行列式值计算程序_2、3阶行列式计算(python代码)
  3. MT6573 1048MP 版本发布(笔记)
  4. 彻底理解View事件体系!
  5. plc顺序控制设计法是什么?
  6. Linux下配置日志服务器
  7. 短视频Go研发框架实践-hulk
  8. 动态箭头gif图标_教程|PPT绘制箭头最全攻略,收藏一下
  9. 马克思主义哲学笔记(四)
  10. 网络计算机无法访问 没有权限,教您无法访问您可能没有权限使用网络资源怎么解决...