SpringBoot 读取配置文件及profiles切换配置文件
读取核心配置文件
核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单。
先创建一个简单的springBoot程序,可以参考:
http://www.cnblogs.com/lspz/p/6344327.html
一、通过@value注解来读取
核心配置文件application.properties内容如下:
server.port=9090
test.msg=Hello World Springboot!
编制Example.java
package com.example.web;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Example {
@RequestMapping("/")
public String home(@Value("${test.msg}") String msg) {
return msg;
}
}
注意:在@Value的${}中包含的是核心配置文件中的键名。在Controller类上加@RestController表示将此类中的所有视图都以JSON方式显示,类似于在视图方法上加@ResponseBody,spring boo默认已经配置了很多环境变量,例如,tomcat的默认端口是8080,项目的contextpath是“/”等等,我们在application.properties中设置了server.port=9090,重写了spring boot 内嵌tomcat端口。
访问:http://localhost:9090 时将得到 Hello World Springboot!
二、使用Environment方式
package com.example.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebController {
@Autowired
private Environment env;
@RequestMapping(value = "index", method = RequestMethod.GET)
public String index() {
return env.getProperty("test.msg");
}
}
注意:这种方式是依赖注入Evnironment来完成,在创建的成员变量private Environment env上加上@Autowired注解即可完成依赖注入,然后使用env.getProperty("键名")即可读取出对应的值。
访问:http://localhost:9090/index 时将得到Hello World Springboot!
三、读取自定义配置文件
为了不破坏核心文件的原生态,但又需要有自定义的配置信息存在,一般情况下会选择自定义配置文件来放这些自定义信息,这里在resources目录下创建配置文件my-web.properties
resources/my-web.properties内容如下:
com.name=testName
com.password=123
创建管理配置的实体类:
package com.example.model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:/my-web.properties")
@ConfigurationProperties(prefix = "com")
public class ConfigBean {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
注意:
spring boot1.5以上版本@ConfigurationProperties取消了location需要用@PropertySource来指定自定义的资源目录。
prefix:指定配置文件中键名称的前缀(我这里配置文件中所有键名都是以web.开头)
使用@Component是让该类能够在其他地方被依赖使用,即使用@Autowired注释来创建实例。
创建测试Controller
package com.example.web;
import com.example.model.ConfigBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
ConfigBean configBean;
@RequestMapping("/user")
public String user() {
return configBean.getName() + ":" + configBean.getPassword();
}
}
由于在ConfigBean类上加了注释@Component,所以可以直接在这里使用@Autowired来创建其实例对象。
访问:http://localhost:9090/user 时将得到testName:123
四、参数间引用
可以利用${…}在application.properties引用变量
myapp.name=spring
myapp.desc=${myapp.name} nice
五、在application.properties配置随机变量
在application.properties配置随机变量,利用的是RandomValuePropertySource类
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
六、使用profiles实现快速切换配置
新建一个properties文件application-prod.properties对应为
生产环节的配置。
application-prod.properties:
server.port=8080
test.msg=This is prod!
接下来,使用CMD进入src目录打包jar:
mvn package -Dmaven.test.skip=true
success后使用
java -jar -Dspring.profiles.active=prod target/loadProperties-0.0.1-SNAPSHOT.jar运行。
访问:http://localhost:8080/ 时得到 This is prod!
注意:
发现端口已经变成8080了。这是因为在“application-prod.properties”中规定了server.port=8080。
“java -jar”的命令中使用-D来传递参数:
java -jar -D配置=值 jar名.jar
“-Dspring.profiles.active=”用来指定切换到哪个配置,表达式为:“application-${profile}.properties”
七、配置文件优先级
application.properties和application.yml文件可以放在一下四个位置:
外置,在相对于应用程序运行目录的/congfig子目录里。
外置,在应用程序运行的目录里
内置,在config包内
内置,在Classpath根目录
同样,这个列表按照优先级排序,也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性,此外,如果你在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。