Spring Boot 系列 | 第二篇配置:文件相关知识
本文不算原创(参考了网上相关博客资料),也不做任何声明,仅仅是作为笔者的笔记记录。
本篇分为以下几点进行记录:
- 项目默认属性
- 自定义属性
- 属性之间参数引用
- 随机值
- 自定义配置文件
- 运行时指定属性值
- 多环境配置
项目默认属性
在观察项目结构的时候可以发现,在resources文件夹会默认生成一个applicaiton.properties文件,这个文件是新建项目时自动生成的,如果没有生成可以自己创建。Spring Boot支持properties格式的配置同时也支持yml格式的配置文件。个人习惯用properties格式。
项目默认的属相还是需要设置一下的,比如启动的端口号,项目的上下文位置,比如一些tomcat的相关配置
在application.properties中添加以下配置可以指定端口号和上下文路径
#指定端口号
server.port=8080
#指定上下文路径
server.context-path=/demo
比如配置了以上信息之后,访问路径就变为:http://localhost:8080/demo/xxx
自定义属性
通常我们可以自定义一些属性,比如我们在application.properties中添加:
com.demo.name=wang
com.demo.age=12
当我们需要使用这些属性的时候可以通过@Value("${key}")
这样的形式来获取,比如我在HelloController
中需要这两个属性
@RestController
public class HelloController {
@Value("${com.demo.name}")
String name;
@Value("${com.demo.age}")
String age;
@RequestMapping("/")
public String index() {
return name + ":" + age;
}
}
运行,这时在浏览器中输入http://localhost:8080/demo/
即可看到输出wang:12
另一种读取配置的方式为:将配置属性绑定到bean中
如下:
@Component
@ConfigurationProperties(prefix = "com.demo")
public class ConfigBean {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
然后再修改HelloController
:
@RestController
public class HelloController {
@Autowired
ConfigBean configBean;
@RequestMapping(value = "/")
public String index() {
return configBean.getName() + ":" + configBean.getAge();
}
}
运行,这时在浏览器中输入http://localhost:8080/demo/
即可看到输出wang:12
属性之间相互引用
属性之间也可以相互引用,使用 ${key}
,比如在properties中添加:
com.demo.info=${com.demo.name}的年龄是${com.demo.age}
修改HelloController:
@RestController
public class HelloController {
@Value("${com.demo.name}")
String name;
@Value("${com.demo.age}")
String age;
@Value("${com.demo.info}")
String info;
@RequestMapping("/")
public String index() {
return info;
}
}
运行,这时在浏览器中输入http://localhost:8080/demo/
看到输出是乱码的。
在我这个Mac IDEA 中需要按照以下步骤设置即可解决乱码:
- File -> Settings -> Editor -> File Encodings
- Properties Files (*.properties)下的Default encoding for properties files设置为UTF-8,将Transparent native-to-ascii conversion前的勾选上。
再次运行,此时可以看到输出为:wang的年龄是12
随机值
有时候可能会需要在配置文件中使用随机值,Spring Boot
,在配置文件中,支持使用${random}来产生随机值
#随机字符串
com.demo.value=${random.value}
#int
com.demo.int=${random.int}、
#long
com.demo.long=${random.long}
#10以内随机数
com.demo.num1=${random.int(10)}
#5-10随机数
com.demo.num2=${random.int[5-10]}
自定义配置文件
有时候可能我们并不想把所有的配置都写在application.properties
中.那我们可以自己建立properties
文件,在resources
文件夹中,可以创建目录。
我们把上面所用到的属性移到resources
下的test.properties
中,则ConfigBean
需要改成这样:
@Component
@ConfigurationProperties(prefix = "com.demo")
@PropertySource("classpath:test.properties")
public class ConfigBean {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
需要添加一个@PropertySource
注解来指定读取哪个配置文件.
运行时指定属性值
通常情况下,我们在IDEA开发的时候直接点击类然后点击run
就可以了,但是在部署到服务器之后,则需要将项目打包,然后在运行。
在终端(我直接使用IDEA的Terminal),先去到项目中的路径,然后输入mvn clean package
进行打包。
注意:如果是按照我的项目中步骤来做的话打包会失败,因为之前编写过的测试期望 “/”路径返回的字符串是:Greetings from Spring Boot!,但是现在已经改了返回值了,所以单元测试不通过导致构建失败,把测试方法内容注释掉再次打包即可。或者打包的命令后面添加参数:-Dmaven.test.skip=true来指定跳过单元测试
构建完成后你会发现在项目中的target
目录会生成一个jar
包
运行这个jar包:
java -jar demo-0.0.1-SNAPSHOT.jar
这个时候就可以把项目跑起来了,此时我们可以指定某些属性。
java -jar java -jar xx.jar --server.port=9090
这个时候你会发现项目运行绑定的端口变为9090了。这里指定的参数会覆盖properties中的配置。
如果觉得这样会有风险,也可以调用以下代码禁用运行时参数功能:
SpringApplication.setAddCommandLineProperties(false)
多环境配置
通常经常下,在开发的时候,我们可能会在开发环境/测试环境/正式环境。而且这些环境所需要的参数是不一样的。所以这个时候就可以使用多环境配置了。
多环境配置的方式为:
- application.properties配置通用的内容。
- application-{profile}.peoperties 配置指定环境的内容。
比如我有3个环境,开发/测试/生产
则可以创建3个文件:
- application-dev.properties
- application-staging.properties
- application-produce.properties
如果使用?
有两种方式:
- 在默认的application.properties中配置属性spring.profiles.active={profile}
在运行时指定参数 –spring.profiles.active={profile}
这样就可以读取对应环境的参数了。
总结
此篇整理了大部分Spring Boot配置相关的知识,可能有部分遗漏