SpringBoot读取外部配置文件的方法
1.SpringBoot配置文件
SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件。支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的YAML的文件配置。
以设置应用端口为例
properties文件示例(application.properties):
server.port=80
YAML文件示例(application.yml):
server:port: 80
在properties和yml/yaml配置文件同时存在的情况下, 在同一目录下,properties配置优先级 > YAML(YML)配置优先级
2.配置文件目录
SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同。
可放置目录(优先级从高到低)
./config/ (当前项目路径config目录下);
./ (当前项目路径下);
classpath:/config/ (类路径config目录下);
classpath:/ (类路径config下).
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载配置文件并互补配置;
我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
接着getSearchLocations方法中去逗号解析成Set,其中内部类Loader负责这一配置文件的加载过程,
包括加载profile指定环境的配置,以application+’-’+name格式的拼接加载。
多种目录配置同时存在情况
接下来还是以端口配置为例
在resources/目录下配置文件设置端口为8888;
在resources/config目录下配置文件设置端口为9999;
在项目路径下配置文件设置端口为6666;
在项目路径config目录下配置文件设置端口为7777;
]
最终运行结果:
Tomcat started on port(s): 7777 (http) with context path '/beedo'
Started BeedoApplication in 4.544 seconds (JVM running for 5.335)
通过控制变量法得以论证
其优先级由高到底,高优先级的配置会覆盖低优先级的配置
3.自定义配置属性
SpringBoot提供了许多的配置,但通常情况我们需要自定义自己的配置应用自己的系统中,如你需要配置一个默认的用户名密码做为系统的登录用。
首先创建一个实体类,作为配置注入用,并使用@ConfigurationProperties注解进行批量注入, 也可以使用Spring底层注解@Value("${user.username}")的方式一个一个注入达到同意的效果
@Component
@ConfigurationProperties(prefix = "user")
public class Login{private String username;private String password;...
}
或者@Value写法
@Component
public class Login{private String username;private String password;...
}
配置文件写法
# yml文件写法
user:username: adminpassword: 123# properties写法
login.username=admin
login.password=123
编写一个junit测试用例,看看配置的值是否正常注入:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DeployApplicationTests {@Autowiredprivate Login login;@Testpublic void contextLoads() {System.out.println(login);}
}
从输出结果上看,值已正常注入
Login{username=‘admin’, password=‘123’}
@ConfigurationProperties与@Value两种注解对比
比较项 | @ConfigurationProperties | @Value |
---|---|---|
全量注入 | 支持 | 不支持 |
松散绑定(Relaxed Binding) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303 | 支持 | 不支持 |
松散绑定:驼峰命名(userName)、横干拼接(user-name)、下划线(user_name)之间可以互相识别绑定称为做松散绑定
JSR303:通过@Email,@Nullable,@Digits 等等注解进行邮箱、判空、数字格式等等数据的校验,更多相关内容请参考IBM的中文文档:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html
@ConfigurationProperties通常用于将配置全量注入某个类中;
@Value通常用于注入某一些特定配置值中;
使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方法才可以,而使用@Value注解修饰的字段不需要提供set方法
自定义配置提示
在编写配置时,你会发现自定义配置没有提示,让你在使用自定义配置时变的很麻烦,其实SpringBoot早已为我们准备好了提示的需要,只需要用引入相关依赖即可有提示。
在没有加入依赖时idea会有如下提示:
添加依赖,该idea提示便消失,编写自定义配置时也有相应提示:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
需要运行一下
4.指定配置文件
通常情况下我们将配置配置在application开头的主配置文件中,这样随着项目的增大配置项的增多会使文件变得非常臃肿,其实SpringBoot早已考虑到了该问题,SpringBoot提供了@PropertySource和@ImportResource两个注解用于加载外部配置文件使用。
- @PropertySource通常用于属性加载配置文件,注意@PropertySource注解不支持加载yaml文件,支持properties文件。
- @ImportResource通常用于加载Spring的xml配置文件
@PropertySource使用
装配properties配置文件
在sources/config下创建一个yaml文件命名为user.properties内容与上方user的配置一样
Login类可如下写法
@PropertySource(value = {"classpath:config/user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class Login{private String username;private String password;...
}
运行一下,同样能达到加载配置效果
同时加载多个配置问题
细心的你,会发现@PropertySource注解中属性value为一个数组,如果同时加载多个配置文件,并且不同配置文件中对同一个属性设置了不同的值,那么Spring会识别哪一个呢?
带着疑问,我们可以通过控制变量法进行测试,具体过程再在赘述。
@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})
结论:Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。
装配yaml配置文件
如果你有强迫症,一定想加载yaml配置文件,那么可以通过PropertySourcesPlaceholderConfigurer类来加载yaml文件,将原来的user.properties改成user.yaml,Bean配置类中加入如下代码,Login配置类和一开始的方式一致。
@Bean
public static PropertySourcesPlaceholderConfigurer loadProperties() {PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();//yaml.setResources(new FileSystemResource("classpath:config/user.yml"));//File路径引入yaml.setResources(new ClassPathResource("config/user.yml"));//class路径引入configurer.setProperties(yaml.getObject());return configurer;
}
运行一下,仍然可以能达到加载配置效果的
@ImportResource使用
SpringBoot提出零xml的配置,因此SpringBoot默认情况下时不会识别项目中Spring的xml配置文件。为了能够加载xml的配置文件,SpringBoot提供了@ImportResource注解该注解可以加载Spring的xml配置文件,通常加于启动类上。
@ImportResource(value = {"classpath:/beans.xml"})
@SpringBootApplication(scanBasePackages = {"team.seagull.client"})
public class DeployApplication {public static void main(String[] args) {SpringApplication.run(DeployApplication.class, args);}
}
其他问题
idea使用.properties文件出现中文乱码问题?
idea对.properties默认编码为GBK,通常我们项目为UTF-8编码,这样程序在读取时就会出现乱码问题;
解决方法:idea 中 打开如下选项File->Sttings->Editor->FileEncodings
将GBK修改为UTF-8并勾选
Transparent native-to ascill conversion(在运行的时候转换成ascii码)
SpringBoot读取外部配置文件的方法相关推荐
- springboot加载外部xml_SpringBoot读取外部配置文件的方法
1.SpringBoot配置文件 SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件.支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的Y ...
- 读取外部配置文件_SpringBoot外部配置、优先级及配置详解
一.外部配置及优先级 SpringBoot的外部配置属性值官方给出了很多种方式,以便可以在不同的环境中使用相同的代码. 其使用了非常特别的PropertySource命令,旨在允许合理的覆盖值.当然, ...
- 无需Java环境,Jar包一键启停(静默启停),开机自启,读取外部配置文件
无需Java环境,Jar包一键启停(静默启停),开机自启,读取外部配置文件 前言 一.目录结构 1.根目录 2.bin 目录 3.conf 目录 4.target 目录 二.文件内容 1.startu ...
- @PropertySource读取外部配置文件中的k-v保存到运行的环境变量中,加载完微博的配置文件以后使用${}取配置文件中的键值
@PropertySource读取外部配置文件中的k-v保存到运行的环境变量中,加载完微博的配置文件以后使用${}取配置文件中的键值 该注解value={},可以使用String数组形式,读取多个配置 ...
- webpack打包VUE项目读取外部配置文件,灵活配置域名
参考方案一 作为一个兼职前端和运维的java程序员,今天我司测试人员提出了一个需求,当后台服务地址ip地址改变后,webpack打包的VUE项目得更改地址重新打包,太麻烦了,最好可以读取外部配置文件的 ...
- SpringBoot打成jra包启动时读取外部配置文件实现动态配置
场景 若依前后端分离版手把手教你本地搭建环境并运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在上面 ...
- springboot加载外部xml_Springboot引用外部配置文件的方法步骤
现在的项目越来越多的都是打包成jar运行尤其是springboot项目,这时候配置文件如果一直放在项目中,每次进行简单的修改时总会有些不方便,这里我们看下打包成jar之后,从外部配置文件中读取配置信息 ...
- springboot 打jar 包部署时 读取外部配置文件
案例:本文主要描述linux系统执行jar包读取jar包同级目录的外部配置文件 方法一:相对路径设置配置文件 (1)在jar包同级目录创建配置文件conf.properties并写入配置数据: con ...
- springboot读取xml配置文件
xml文件内容 在src/main/resources下面添加<operator-config.xml>文件,文件内容如下: <?xml version="1.0" ...
最新文章
- ORM(一)OQL结构图
- 181102 Python环境搭建(安装Sublime Text3)
- 【Spring-Boot】【入门 01】第一个 Spring Boot 程序
- path manipulation怎么解决_PyCharm报错与解决方法一览
- java报错误设置属性值_java – 设置属性值时出错;嵌套异常是org.springframework.beans.NotWritablePropertyException:...
- ICCV 2019 | 基于关联语义注意力模型的图像修复
- Android API Guides---RenderScript
- Oracle RAC环境下如何定位并杀掉最终阻塞的会话
- iOS微信运动 刷分
- ML for trading -cs7646-02
- jmeter使用心得(一)
- iMindMap手绘思维导图软件免费版
- 程序员幽默:39个奇葩代码注释,每一个都能笑抽
- 【渝粤教育】电大中专Windows操作系统 (2)作业 题库
- SQL学习五、计算字段
- PTA 1027 Colors in Mars(读懂题目意思很重要!!)
- token值过期的处理
- 视频去水印软件哪个好用?
- DataV轮播表组件dv-scroll-board宽度问题
- 专科生要怎么做才能进入阿里巴巴、百度、腾讯这样的公司?