文章插图
Spring Boot获取文件总的来说有三种方式,分别是@Value注解,@ConfigurationProperties注解和Environment接口 。这三种注解可以配合着@PropertySource来使用,@PropertySource主要是用来指定具体的配置文件 。
@PropertySource解析
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Repeatable(PropertySources.class)public @interface PropertySource {String name() default ""; String[] value(); boolean ignoreResourceNotFound() default false; String encoding() default ""; Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class;}
- value():指定配置文件
- encoding():指定编码,因为properties文件的编码默认是IOS8859-1,读取出来是乱码
- factory():自定义解析文件类型,因为该注解默认只会加载properties文件,如果想要指定yml等其他格式的文件需要自定义实现 。
zhbin.config.web-configs.name=JAVA旅途zhbin.config.web-configs.age=22
zhbin.config.web-configs.name=Java旅途zhbin.config.web-configs.age=18
新增一个类用来读取配置文件@Configuration@PropertySource(value = https://www.isolves.com/it/cxkf/kj/2020-07-09/{"classpath:config.properties"},encoding="gbk")public class GetProperties {@Value("${zhbin.config.web-configs.name}")private String name;@Value("${zhbin.config.web-configs.age}")private String age;public String getConfig() {return name+"-----"+age;}}
如果想要读取yml文件,则我们需要重写DefaultPropertySourceFactory,让其加载yml文件,然后再注解@PropertySource上自定factory 。代码如下:
public class YmlConfigFactory extends DefaultPropertySourceFactory {@Overridepublic PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {String sourceName = name != null ? name : resource.getResource().getFilename();if (!resource.getResource().exists()) {return new PropertiesPropertySource(sourceName, new Properties());} else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {Properties propertiesFromYaml = loadYml(resource);return new PropertiesPropertySource(sourceName, propertiesFromYaml);} else {return super.createPropertySource(name, resource);}}private Properties loadYml(EncodedResource resource) throws IOException {YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();factory.setResources(resource.getResource());factory.afterPropertiesSet();return factory.getObject();}}
@PropertySource(value = https://www.isolves.com/it/cxkf/kj/2020-07-09/{"classpath:config.properties"},encoding="gbk",factory = YmlConfigFactory.class)
二、Environment读取文件配置文件我们继续用上面的两个,定义一个类去读取配置文件@Configuration@PropertySource(value = https://www.isolves.com/it/cxkf/kj/2020-07-09/{"classpath:config.properties"},encoding="gbk")public class GetProperties {@AutowiredEnvironment environment;public String getEnvConfig(){String name = environment.getProperty("zhbin.config.web-configs.name");String age = environment.getProperty("zhbin.config.web-configs.age");return name+"-----"+age;}}
三、@ConfigurationProperties读取配置文件@ConfigurationProperties可以将配置文件直接映射成一个实体类,然后我们可以直接操作实体类来获取配置文件相关数据 。新建一个yml文件,当然properties文件也没问题
zhbin:config:web-configs:name: Java旅途age: 20
新建实体类用来映射该配置@Component@ConfigurationProperties(prefix = "zhbin.config")@Datapublic class StudentYml {// webConfigs务必与配置文件相对应,写为驼峰命名方式private WebConfigs webConfigs = new WebConfigs();@Datapublic static class WebConfigs {private String name;private String age;}}
- prefix = "zhbin.config"用来指定配置文件前缀
zhbin:config:web-configs:- name: Java旅途age: 20- name: Java旅途2age: 202
@Component@ConfigurationProperties(prefix = "zhbin.config")@Datapublic class StudentYml {private List<WebConfigs> webConfigs = new ArrayList<>();@Datapublic static class WebConfigs {private String name;private String age;}}
经验与坑- properties文件默认使用的是iso8859-1,并且不可修改
- yml文件的加载顺序高于properties,但是读取配置信息的时候会读取后加载的
- @PropertySource注解默认只会加载properties文件
- @PropertySource注解可以与任何一种方式联合使用
推荐阅读
- Tomcat爆出安全漏洞!Spring Cloud/Boot框架多个版本受影响
- Springboot 动态改变Log级别
- 可以秒杀全场的SpringCloud微服务电商实战项目,文档贼全
- 聊聊Spring boot2.X开发环境搭建和基本开发
- 让Mac电脑读取NTFS硬盘的免费开源的软件
- 扒一扒Spring家族的前世今生
- 一文搞懂 Spring JPA
- 一 当用SpringApplication.run的时候发生了什么
- Spring简单入门教程(二)spring的体系结构
- Java中读取File文件内容转为String类型