Spring Boot中采用两种配置文件,properties 和 yml。两种配置文件都可以进行spring boot 项目中变量的定义和参数的设置。
两种配置文件的主要区别
两种配置文件的区别主要体现在写法上,properties文件中每一个变量都需要书写完整,yml的写法是按照层次来的。
如properties配置文件
mysql.datasource.driver-class-name=com.mysql.jdbc.Driver
mysql.datasource.url=jdbc:mysql://127.0.0.1:3306/test
mysql.datasource.username=root
mysql.datasource.password=root
换做yml
mysql:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: root
注意,yml配置中:每个变量的冒号“:” 后面要多一个空格,否则可能读取出错;每一层属性名缩进,默认是两个空格,否则可能读取出错。
自定义变量读取
自定义变量这里包含两种:一种是系统默认的变量;一种是我们自己新增的变量。
系统默认变量,如我们在properties文件中,输入spring之后,系统会自动提示的这些,都属于系统默认变量。
系统默认变量,如果需要修改,我们只管修改就可以了,系统会自动的读取,一般不需要我们手动去读取。
如,我们修改Tomcat默认的端口号,将系统默认的8080修改为8081
server.port=8081
修改后,我们直接启动springboot,会在启动日志中看到Tomcat已启动,端口号为8081
o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path ''
系统新增变量的读取,可以使用@Value注解,只需要在变量上加@Value("${属性名}"),就可以将配置文件中的一个属性赋给一个变量,这里对properties文件和yml文件都适合。
@Value("${mysql.datasource.url}")
private String url;
@Value("${mysql.datasource.username}")
private String user;
@RequestMapping("/hello")
public String hello() {
return "url=" + url +"</br>" + "user=" + user;
}
上面这段代码,我们使用@Value注解将数据库配置信息赋给了变量url 和 user
将配置文件的属性赋给实体类
对于配置属性比较少时,可以使用@Value注解的方式获取。如果配置属性比较多的时候,逐个获取会比较麻烦。这时,我们可以把这些属性名作为变量来创建一个Javabean,并将属性值赋给Javabean变量。
我们依然读取上面的mysql的配置信息
package com.example.confingfile.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix="mysql.datasource")
@Component
public class ConfigBean {
private String url;
private String driver;
private String username;
private String password;
... getter setter
}
我们创建一个ConfigBean.java ,增加@Component注解,让spring容器可以扫描到。增加@ConfigurationProperties注解,表示该类为配置属性类,并加上配置prefix。这里特别注意下,由于ConfigBean 中给的是变量名,所以,prefix 属性后需要跟上变量名称前面的所有路径,否则,无法映射起来。由于Java的变量名中不允许有连字符,故我们将配置文件中的driver-class-name修改为driver,以保证可以正常的映射起来。
接下来创建controller来读取configbean 里面的属性值
@RestController
@EnableConfigurationProperties({ConfigBean.class})
public class ConfigBeanController {
@Autowired
ConfigBean configBean;
@RequestMapping("/conn")
public String conn() {
return configBean.getDriver() + "*" + configBean.getUrl() + "*"
+ configBean.getUsername() + "*" + configBean.getPassword();
}
}
在controller上面,增加@EnableConfigurationProperties注解,并指定ConfigBean.class。代码中,需要先将ConfigBean 注入到controller中,然后可以直接读取。
自定义配置文件
上面介绍的方法,都是在spring boot默认配置文件application.properties 或 application.yml 基础上的。如果配置文件太多,想自定义配置文件时,该怎么读取呢。我们在application.properties 文件目录下自定义一个配置文件 my.properties配置文件。
hello.you.name=zhangsan
hello.you.age=25
我们如何读取my.properties中的属性和属性值呢?如果这个属性定义在默认配置文件中,则可按照上面的两种方式读取。这里我们主要解决读取配置文件的问题。
如果在springboot1.4或之前的springboot版本,则需要@Configuration、@PropertySource和@ConfigurationProperties三个注解一起,来表示该文件是一个属性配置文件,并在@PropertySource注解上增加location,标注配置文件的路径。在springboot1.5以后,将@PropertySource后面的location修改为value。这里我们使用springboot1.5之后的版本进行代码示例
@Configuration
@PropertySource(value="classpath:my.properties")
@ConfigurationProperties(prefix="hello.you")
public class User {
private String name;
private int age;
...setter getter
}
上面代码中,关键部分,在@PropertySource注解的value属性中标注配置文件的路径和名称,其余部分跟上面讲解的内容相同,这里不再赘述。
多环境配置文件
在实际开发中,经常会出现不同环境设置不同配置文件的情况,最常见的就是开发环境、测试环境和生产环境分别使用不同名称的配置文件。springboot支持程序启动时,在application.yml中指定环境的配置文件。
假如有开发、测试和生产三个环境的配置文件
application-dev.yml 开发环境
application-test.yml 测试环境
application-prd.yml 生产环境
如何指定这个环境的配置文件呢?在application.yml中使用springboot的默认属性 spring.profiles.active,该配置来指定采用哪一个profile。假如我们使用生产环境的配置文件,则如下图配置,系统会读取到application-prd.yml配置文件。
我们看下application-prd.yml的属性和属性值
mysql:
datasource:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://10.134.123.210:3306/test
username: fdafjeiqcj
password: eqrw4452nk
启动springboot来测试,成功读取到对应的属性和属性值
以上为本人学习整理内容,如有错误,欢迎批评斧正,留言沟通交流。谢谢。