Spring Boot配置文件用法解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/magi1201/article/details/83276358

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之后,系统会自动提示的这些,都属于系统默认变量。

系统默认变量,如果需要修改,我们只管修改就可以了,系统会自动的读取,一般不需要我们手动去读取。

扫描二维码关注公众号,回复: 3848603 查看本文章

如,我们修改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来测试,成功读取到对应的属性和属性值

以上为本人学习整理内容,如有错误,欢迎批评斧正,留言沟通交流。谢谢。

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/83276358