如何在SpringBoot下读取java 自定义配置文件properties配置文件

Spring Boot 配置文件 – 在坑中实践
一、自动配置
二、自定义属性
三、random.* 属性
四、多环境配置
运行环境:JDK 7 或 8,Maven 3.0+
技术栈:SpringBoot 1.5+
一、自动配置
Spring Boot 提供了对应用进行自动化配置。相比以前 XML 配置方式,很多显式方式申明是不需要的。二者,大多数默认的配置足够实现开发功能,从而更快速开发。
什么是自动配置?
Spring Boot 提供了默认的配置,如默认的 Bean ,去运行 Spring 应用。它是非侵入式的,只提供一个默认实现。
大多数情况下,自动配置的 Bean 满足了现有的业务场景,不需要去覆盖。但如果自动配置做的不够好,需要覆盖配置。比如通过命令行动态指定某个 jar ,按不同环境启动(这个例子在第 4 小节介绍)。那怎么办?这里先要考虑到配置的优先级。
Spring Boot 不单单从 application.properties 获取配置,所以我们可以在程序中多种设置配置属性。按照以下列表的优先级排列:
1.命令行参数
2.java:comp/env 里的 JNDI 属性
3.JVM 系统属性
4.操作系统环境变量
5.RandomValuePropertySource 属性类生成的 random.* 属性
6.应用以外的 application.properties(或 yml)文件
7.打包在应用内的 application.properties(或 yml)文件
8.在应用 @Configuration 配置类中,用 @PropertySource 注解声明的属性文件
9.SpringApplication.setDefaultProperties 声明的默认属性
可见,命令好参数优先级最高。这个可以根据这个优先级,可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。
还有第 6 点,根据这个在多 moudle 的项目中,比如常见的项目分 api 、service、dao 等 moudles,往往会加一个 deploy moudle 去打包该业务各个子 moudle,应用以外的配置优先。
二、自定义属性
泥瓦匠喜欢按着代码工程来讲解知识。git clone 下载工程 springboot-learning-example ,项目地址见 GitHub – 。
a. 编译工程
在项目根目录 springboot-learning-example,运行 maven 指令:
cd springboot-learning-example
mvn clean install
b. 运行工程 test 方法
运行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 测试类的 getHomeProperties 方法。可以在控制台看到输出,这是通过自定义属性获取的值:
HomeProperties{province='ZheJiang', city='WenLing', desc='dev: I'm living in ZheJiang WenLing.'}
怎么定义自定义属性呢?
首先项目结构如下:
├── pom.xml
└── src
├── main
├── java
└── org
└── spring
└── springboot
├── Application.java
└── property
├── HomeProperties.java
└── UserProperties.java
└── resources
├── application-dev.properties
├── application-prod.properties
└── application.properties
└── test
├── java
└── org
└── spring
└── springboot
└── property
├── HomeProperties1.java
└── PropertiesTest.java
└── resouorces
└── application.yml
在 application.properties 中对应 HomeProperties 对象字段编写属性的 KV 值:
## 家乡属性 Dev
home.province=ZheJiang
home.city=WenLing
home.desc=dev: I'm living in ${home.province} ${home.city}.
这里也可以通过占位符,进行属性之间的引用。
然后,编写对应的 HomeProperties Java 对象:
* 家乡属性
* Created by bysocket on 17/04/2017.
@Component
@ConfigurationProperties(prefix = "home")
public class HomeProperties {
public String getProvince() {
public void setProvince(String province) {
this.province =
public String getCity() {
public void setCity(String city) {
this.city =
public String getDesc() {
public void setDesc(String desc) {
this.desc =
public String toString() {
return "HomeProperties{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
", desc='" + desc + '\'' +
通过 @ConfigurationProperties(prefix = “home”) 注解,将配置文件中以 home 前缀的属性值自动绑定到对应的字段中。同是用 @Component 作为 Bean 注入到 Spring 容器中。
如果不是用 application.properties 文件,而是用 application.yml 的文件,对应配置如下:
## 家乡属性
province: 浙江省
city: 温岭松门
desc: 我家住在${home.province}的${home.city}
键值对冒号后面,必须空一格。
注意这里,就有一个坑了:
application.properties 配置中文值的时候,读取出来的属性值会出现乱码问题。但是 application.yml 不会出现乱码问题。原因是,Spring Boot 是以 iso-8859 的编码方式读取 application.properties 配置文件。
注意这里,还有一个坑:
如果定义一个键值对 user.name=xxx ,这里会读取不到对应写的属性值。为什么呢?Spring Boot 的默认 StandardEnvironment 首先将会加载 “systemEnvironment” 作为首个PropertySource. 而 source 即为System.getProperties().当 getProperty时,按照读取顺序,返回 “systemEnvironment” 的值.即 System.getProperty(“user.name“)
(Mac 机子会读自己的登录账号,这里感谢我的死党 )
三、random.* 属性
Spring Boot 通过 RandomValuePropertySource 提供了很多关于随机数的工具类。概括可以生成随机字符串、随机 int 、随机 long、某范围的随机数。
运行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 测试类的 randomTestUser 方法。多次运行,可以发现每次输出不同 User 属性值:
UserProperties{id=-1091890, age=41, desc='泥瓦匠叫做3cf8fbf62700bcbd17770', uuid='582bcc01-bb7f-41db-94d5-c22aae186cb4'}
application.yml 方式的配置如下( application.properties 形式这里不写了):
## 随机属性
id: ${random.long}
age: ${random.int[1,200]}
desc: 泥瓦匠叫做${random.value}
uuid: ${random.uuid}
四、多环境配置
很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。所以看项目结构,有两个环境的配置:
application-dev.properties:开发环境
application-prod.properties:生产环境
Spring Boot 是通过 application.properties 文件中,设置 spring.profiles.active 属性,比如 ,配置了 dev ,则加载的是 application-dev.properties :
# Spring Profiles Active
spring.profiles.active=dev
那运行 springboot-properties 工程中 Application 应用启动类,从控制台中可以看出,是加载了 application-dev.properties 的属性输出:
HomeProperties{province='ZheJiang', city='WenLing', desc='dev: I'm living in ZheJiang WenLing.'}
将 spring.profiles.active 设置成 prod,重新运行,可得到 application-prod.properties的属性输出:
HomeProperties{province='ZheJiang', city='WenLing', desc='prod: I'm living in ZheJiang WenLing.'}
根据优先级,顺便介绍下 jar 运行的方式,通过设置 -Dspring.profiles.active=prod 去指定相应的配置:
mvn package
java -jar -Dspring.profiles.active=prod springboot-properties-0.0.1-SNAPSHOT.jar
常用的样板配置在 Spring Boot 官方文档给出,我们常在 application.properties(或 yml)去配置各种常用配置:博客分类:
spring boot使用application.properties默认了很多配置。但需要自己添加一些配置的时候,我们应该怎么做呢。
若继续在application.properties中添加
wisely2.name=wyf2
wisely2.gender=male2
定义配置类:
@ConfigurationProperties(prefix = "wisely2")
public class Wisely2Settings {
public String getName() {
public void setName(String name) {
this.name =
public String getGender() {
public void setGender(String gender) {
this.gender =
若新用新的配置文件
如我新建一个wisely.properties
wisely.name=wangyunfei
wisely.gender=male
需定义如下配置类
@ConfigurationProperties(prefix = "wisely",locations = "classpath:config/wisely.properties")
public class WiselySettings {
public String getName() {
public void setName(String name) {
this.name =
public String getGender() {
public void setGender(String gender) {
this.gender =
最后注意在spring Boot入口类加上@EnableConfigurationProperties
@SpringBootApplication
@EnableConfigurationProperties({WiselySettings.class,Wisely2Settings.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
使用定义的properties
在别的bean中可直接注入
@Controller
public class TestController {
@Autowired
WiselySettings wiselyS
@Autowired
Wisely2Settings wisely2S
@RequestMapping("/test")
public @ResponseBody String test(){
System.out.println(wiselySettings.getGender()+"---"+wiselySettings.getName());
System.out.println(wisely2Settings.getGender()+"==="+wisely2Settings.getGender());
return "ok";
新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。
京东地址:
当当地址:
亚马逊地址:
或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。
浏览 107820
locations 这个属性没了?看看这个文章http://fabiomaffioletti.me/blog//spring-configuration-properties-locations-deprecation-another-approach/
locations 这个属性没了?我也发现没了,这可如何是好
如果我有一个配置类和多个格式相同内容不同的配置文件,我想根据这几个配置文件生成几个不同的配置类实例,用注解应该怎么做?找到了定义好类public class DataConfig { private S private String driverClassN private S private S private T&&&&&&& ...getter and setter...}在配置类里面定义@Configurationpublic class PropertiesConfTest { @Bean(name="edmsDataConfig") @ConfigurationProperties(prefix = "datasource.edms") public DataConfig edmsDataConfig(){
return new DataConfig(); } @Bean(name="uicDataConfig") @ConfigurationProperties(prefix = "datasource.uic") public DataConfig uicDataConfig(){
return new DataConfig(); }}
如果我有一个配置类和多个格式相同内容不同的配置文件,我想根据这几个配置文件生成几个不同的配置类实例,用注解应该怎么做?我也有这个问题,不知道怎么处理
你书里的源代码在哪下载啊?.cn/?#book/bookdetail/bookDetailAll.jsp?book_id=b47a1c54--b3e2-b8bc4899a97e&isbn=978-7-121-28208-9
浏览: 1155806 次
来自: 合肥
浏览量:50211
浏览量:89306
博主你好。如果groovy的代码保存在数据库里,不是文件里,这 ...
建议博主将源码放在一些不需要注册才可以下载的地方.
jjianwen68 写道使用两个configuration来 ...
P208 代码解释 pinciple -& princi ...
141页 6.1.5 starter pom 上面一行 附录
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
原本这个章节是要介绍《log4j多环境不同日志级别的控制的》但是没有这篇文章做基础的话,学习起来还是有点难度的,所以我们先一起了解下spring boot属性文件之多环境配置,当然文章中也会提到属性文件基本的一些知识,然后慢慢在升华到多环境配置。
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷。我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是在pom.xml中引入模块化的Starter POMs,其中各个模块都有自己的默认配置,所以如果不是特殊应用场景,就只需要在application.properties中完成一些属性配置就能开启各模块的应用。
在之前的各篇文章中都有提及关于application.properties的使用,主要用来配置数据库连接、日志相关配置等。除了这些配置内容之外,本文将具体介绍一些在application.properties配置中的其他特性和使用方法。
自定义属性与加载
这方面的知识我们在之前一篇文章
中就已经有介绍过了,这里也当做温故下吧,当然重点还是之后的多环境配置文件。
我们在使用Spring Boot的时候,通常也需要定义一些自己使用的属性,我们可以如下方式直接定义:
在src/main/resources/application.properties:加入:
#自定义属性.
=Spring Boot教程
然后通过@Value("${属性名}")注解来加载对应的配置属性,具体如下:
(以下这种方式已经过时了,不推荐使用,但能正常运行的)。
@Component
public class BlogProperties {
@Value("${com.kfit.blog.name}")
private String name;//博客作者
@Value("${com.kfit.blog.title}")
private String title;//博客标题
// 省略getter和setter
通过单元测试来验证BlogProperties中的属性是否已经根据配置文件加载了。
引入单元测试依赖:
&!-- spring boot 单元测试. --&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-test&/artifactId&
&scope&test&/scope&
&/dependency&
进行编码进行单元测试:
package com.
import org.junit.A
import org.junit.T
import org.junit.runner.RunW
import org.springframework.beans.factory.annotation.A
import org.springframework.boot.test.SpringApplicationC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import com.kfit.properties.BlogP
* @author Angel(QQ:)
* @version v.0.1
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(App.class)
public class AppTest{
@Autowired
private BlogProperties blogProperties;
public void testBlog() throws Exception {
System.out.println("AppTest.testBlog()="+blogProperties);
Assert.assertEquals("Angel",blogProperties.getName());
Assert.assertEquals("Spring Boot教程", blogProperties.getTitle());
运行单元测试,完美的看到我们想要的结果了,但是我们刚刚提到了BlogProperties写法已经不推荐使用了,那么怎么写会比较perfect呢?看如下优雅的编码风格:
先引入spring boot提供的一个配置依赖:
&!--spring boot 配置处理器 --&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-configuration-processor&/artifactId&
&optional&true&/optional&
&/dependency&
在这里我们主要使用@ConfigurationProperties注解进行编码,
修改BlogProperties为:
* prefix="com.kfit.blog" :
* 在application.properties配置的属性前缀,
* 在类中的属性就不用使用{@value}进行注入了。
* @author Angel(QQ:)
* @version v.0.1
@ConfigurationProperties(prefix="com.kfit.blog")
public class BlogProperties {
private String name;//博客作者
private String title;//博客标题
// 省略getter和setter
在启动类中加入:@EnableConfigurationProperties({BlogProperties.class})
在运行单元测试还是能够正常进行的。
这种的好处就是只需要配置一个地方,其它地方就是正常定义类的属性即可了。
参数间的引用
在application.properties中的各个参数之间也可以直接引用来使用,就像下面的设置:
=${com.kfit.blog.name}正在写《${com.kfit.blog.title}》
com.kfit.blog.desc参数引用了上文中定义的name和title属性,最后该属性的值就是Angel正在努力写《Spring Boot教程》。
使用随机数
在一些情况下,有些参数我们需要希望它不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。
# 随机字符串
=${random.value}
=${random.int}
# 随机long
=${random.long}
# 10以内的随机数
=${random.int(10)}
# 10-20的随机数
=${random.int[10,20]}
通过命令行设置属性值
相信使用过一段时间Spring Boot的用户,一定知道这条命令:java -jar xxx.jar --server.port=8888,通过使用--server.port属性来设置xxx.jar应用的端口为8888。
在命令行运行时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888,该设置在样例工程中可见,读者可通过删除该值或使用命令行来设置该值来验证。
通过命令行来修改属性值固然提供了不错的便利性,但是通过命令行就能更改应用运行的参数,那岂不是很不安全?是的,所以Spring Boot也贴心的提供了屏蔽命令行访问属性的设置,只需要这句设置就能屏蔽:SpringApplication.setAddCommandLineProperties(false)。
在Eclipse中具体操作如下:
【右键工程】--【Run As】 -- 【Run configurations】--找到【Arguments】--【Program arguments】-- 添加【--server.port=8888】
多环境配置
以上都不是重点,这才是重点,这才是重点,这才是重点,重要的事情说3遍。我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
如:spring.profiles.active=test就会加载application-test.properties配置文件内容
下面,以不同环境配置不同的服务端口为例,进行样例实验。
针对各环境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties
在这三个文件均都设置不同的server.port属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80
application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置
测试不同配置的加载:
执行java -jar xxx.jar,可以观察到服务端口被设置为8080,也就是默认的开发环境(dev)
执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为9090,也就是测试环境的配置(test)
执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为80,也就是生产环境的配置(prod)
按照上面的实验,可以如下总结多环境的配置思路:
application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置
application-{profile}.properties中配置各个环境不同的内容
通过命令行方式去激活不同环境的配置。
多环境高级应用
在某些情况下,应用的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设EmailService中包含的send(String email)方法向指定地址发送电子邮件,但是我们仅仅希望在生产环境中才执行真正发送邮件的代码,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。
我们可以借助Spring的注解@Profile实现这样的功能,这样需要定义两个实现EmailService借口的类:
* 发送邮件接口.
* @author Angel(QQ:)
* @version v.0.1
public interface EmailService {
/**发送邮件*/
publicvoid send();
发送邮件的具体实现(dev-开发环境的代码):
@Profile("dev") //开发环境的时候.
public class DevEmailServiceImpl implements EmailService{
publicvoid send() {
System.out.println("DevEmailServiceImpl.send().开发环境不执行邮件的发送.");
发送邮件的具体实现(prod-生产环境的代码):
@Profile("prod") //生产环境.
public class ProdEmailServiceImpl2 implements EmailService{
publicvoid send() {
System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送.");
//具体的邮件发送代码.
//mail.send();
@Profile("dev")表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。那么如何设置Profile呢?
在配置文件中指定
在application.properties中加入:
spring.profiles.active=dev
通过命令行参数
java -jar app.jar --spring.profiles.active=dev
【Spring Boot 系列博客】
视频&交流平台:
/course/introduction.htm?courseId=
http://-qq-/blog/2321532
网易云课堂视频最新更新:
第十一章 Spring Boot 日志
1、spring boot日志—理论
2、Spring Boot日志-logback
3、Spring Boot日志-log4j2
第十二章 Spring Boot 知识点2
1、spring boot 服务配置和部署
2、Spring Boot 定制URL匹配规则
历史章节:
第一章 快速开始
1、Spring Boot之Hello World
2、Spring Boot之Hello World访问404
第二章 Spring Boot之JSON
1、spring boot返回json数据
2、Spring Boot完美使用FastJson解析JSON数据
第三章 Spring Boot热部署
1、Spring Boot热部署(springloader)
2、springboot + devtools(热部署)
第四章 Spring Boot数据库
1、Spring Boot JPA/Hibernate/Spring Data概念
2、Spring Boot JPA-Hibernate
3、Spring Boot Spring Data JPA介绍
4、Spring Boot JdbcTemplate
5、Spring Boot集成MyBatis
第五章 web开发
1、全局异常捕捉
2、配置server信息
3、spring boot使用thymeleaf
4、Spring Boot 使用freemarker
5、Spring Boot添加JSP支持
第六章 定时任务
1、Spring Boot定时任务
2、Spring Boot 定时任务升级篇(动态修改cron参数)
3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)
4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)
5、Spring Boot Quartz介绍
6、Spring Boot Quartz在Java Project中使用
7、Spring Boot 集成Quartz普通使用
8、Spring Boot 集成Quartz升级版
9、Spring Boot 集成Quartz二次升级版
10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象
第七章 Spring Boot MyBatis升级篇
1、Spring Boot MyBatis升级篇-注解
2、Spring Boot MyBatis升级篇-注解-自增ID
3、Spring Boot MyBatis升级篇-注解-增删改查
4、Spring Boot MyBatis升级篇-注解-分页查询
5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效
6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found
7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇
8、Spring Boot MyBatis升级篇-注解-@Result
9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:&script&
10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider
11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题
12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper
13、Spring Boot MyBatis升级篇-XML
14、Spring Boot MyBatis升级篇-XML-自增ID
15、Spring Boot MyBatis升级篇-XML-增删改查
16、Spring Boot MyBatis升级篇-XML-分页查询
17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效
18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)
19、Spring Boot MyBatis升级篇-XML-注解-初尝试
20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter
第八章 Spring Boot 知识点1
1、Spring Boot 拦截器HandlerInterceptor
2、Spring Boot启动加载数据CommandLineRunner
3、Spring Boot环境变量读取和属性对象的绑定
4、Spring Boot使用自定义的properties
5、Spring Boot使用自定义的properties
6、Spring Boot使用@SpringBootApplication
7、Spring Boot 监控和管理生产环境
第十章 Spring Boot 打包部署
1、Spring Boot打包部署((提供Linux的sh文件))
第十一章 Spring Boot 日志
1、spring boot日志—理论
2、Spring Boot日志-logback
3、Spring Boot日志-log4j2
更多查看博客:
浏览 24652
论坛回复 /
(0 / 3371)
楼主,我查询了一下官方文档,@Profile只能用在Component和Configuration上,service注解上使用并不行,我自己的代码试过好像并不可以我这里很确认的告诉你,使用@Service注解是没有任何问题的,在看到你提出的疑问之后,我也写代码进行测试了,确实能够按照我们想要的进行运行。您在看看您的代码是否正常。
浏览: 1295568 次
u 写道在使用热部署devtools的时候, ...
zpl11111 写道xiangcunchouren 写道一般 ...
youzizhu1126 写道感谢博主分享,我才能照着学,真心 ...
感谢博主分享,我才能照着学,真心感谢,
xiangcunchouren 写道一般登录登录表单提交的时候 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 beego 自定义配置文件 的文章

 

随机推荐