SpringBoot获取配置文件的简单实现方法

前言

在讲SpringBoot 获取配置文件之前我们需要对SpringBoot 的项目有一个整体的了解,如何创建SpringBoot 项目,项目结构等等知识点,我在这里就不一一讲述了,没有学过的小伙伴可以自己在网上找一些资料进行学习,很简单的。

下面让我们开始今天的内容讲解吧。

一、SpringBoot 全局配置文件的加载顺序

在SpringBoot 当中,全局配置文件有两种不同的格式,一个是我们常见的properties, 一种是yml.

这两种格式的文件其实也没什么太大的区别,使用的时候按照个人的习惯来就行,下面我们用的是yml文件。

首先,当我们创建SpringBoot 的项目时,默认在resources目录下创建一个application.properties文件,这时我们可以在

这个文件当中对项目进行配置即可。但是在SpringBoot 中application.properties可以存放在以下几个位置:

file:./config/ 项目根目录下的config文件夹下

file:./ 项目根目录下

classpath:/config/ 类路径下的config文件夹下

classpath:/ 类路径下

文件的加载顺序:即根目录下的config目录下,然后是 根目录下,然后是classpath路径下的config目录下,最后是classpath路径下。

优先级由高到低,高优先级的配置会覆盖低优先级的配置。

假如:根目录下的config目录下定义端口为8084, 根目录下定义端口为8083 ,classpath路径下的config目录定义端口为8082,classpath路径下定义端口为8081,最后启动,启动的端口为8084 ,高优先级会覆盖低优先级。

注意: 并不是高优先级的被加载了,低优先级的就不会再加载,实际上是SpringBoot会从这四个位置全部加载主配置文件,并且还能产生互相配置的效果。

除此外,我们还可以通过spring.config.location来改变默认的配置文件位置。

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定默认加载的这些配置文件共同起作用形成互补配置。

在 G盘目录下,创建一个application.yml文件,定义端口为8085

打包项目,启动命令行:java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.yml 回车运行。

外部配置加载顺序

1、命令行参数

eg: java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8087

---- 由jar包外向jar包内进行寻找:

​ 2、 优先加载带profile

jar包外部的 application-{profile}.properties或application.yml(带spring.profile)配置文件

将打好的jar包放在一个目录下,然后再该文件夹下新建一个名为application.yml的文件,其中指定

port为8082 ,访问路径为/boot ,然后命令行直接启动项目。java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --application.yml

在讲配置文件之前,我先说一说yml文件配置信息书写格式

基本数据类型(8种基本数据类型)以k: v 形式书写即可

比如我在一个实体类(Person)中定义一个 属性(age),类型是 int ,在yml文件中的书写格式如下

person:
 age: 20

实体类对象(Person),Map ,k:v 在下一行来写对象的属性和值的关系,注意缩进

person:
 userName: zhans
 age: 20
#另一种行内写法
person: {userName: zhans.age: 20} 

List ,数组的书写,注意 - 后有空格

pets:
 - cat
 - dog
 - pig
#另一种行内写法
pets:{cat,dog,pi}

二、SpringBoot 获取配置文件的方式

**@Value **

创建配置类,由于篇幅问题这里省略了 setter、getter 方法,但是实际开发中这个是必须的,否则无法成功注入,@Component表示把当前配置类注入到Spring容器当中。

@Component
public class PersonConfig {

 @Value("${person.userName}")
 private String userName;
 @Value("${person.age}")
 private int age;

}

在主配置文件中添加如下配置(application.yml)

server:
 port: 8081
person:
 userName: hello
 age: 20

测试类:

@RestController
public class PersonController {
 @Autowired
 private Person person;

 @RequestMapping(value = "/get",method = RequestMethod.GET)
 public String findPerson(){
 return "姓名:"+person.getUserName()+"年龄:"+person.getAge();
 }
}

启动项目,访问地址http://localhost:8080/get运行结果:

姓名:hello年龄:20

所以,我们就可以通过 @Value(${key})的方式获取全局配置文件中的指定配置项。

@ConfigurationProperties

如果我们需要取 许多个配置项,通过 @Value 的方式去配置项需要一个一个去取,显然有点麻烦。所以我们可以使用 @ConfigurationProperties。

标有 @ConfigurationProperties的类的所有属性和配置文件中相关的配置项进行绑定,绑定之后我们就可以通过这个类去访问全局配置文件中的属性值。

代码实例如下:

1、在主配置文件中添加如下配置

user:
 username: admin
 password: 123456
 map: {k1: v1,k2: v2}
 list:
 - cat
 - dog
 person:
 userName: hello
 age: 20
 objects:
 - aaa
 - bbb
 - ccc

创建配置类,由于篇幅问题这里省略了 setter、getter ,toString 方法,但是实际开发中这个是必须的,否则无法成功注入。

@Component
@ConfigurationProperties(prefix = "user")
public class User {
 private String username;
 private String password;
 private Map<String,String> map;
 private Person person;
 private List<String> list;
 private Object[] objects;

}

这里 @ConfigurationProperties 有一个 prefix参数,主要是用来指定该配置项在配置文件中的前缀,即user。

测试类

@RestController
public class PersonController {
 @Autowired
 private Person person;
 @RequestMapping(value = "/findUser",method = RequestMethod.GET)
 public String findUser(){
 return user.toString();
 }
}

我们在页面访问 http://localhost:8081/findUser,页面就显示我们在yml文件中配置的信息了。

User{username='admin', password='123456', map={k1=v1, k2=v2}, person=com.zfcoding.config.Person@93471e6, list=[cat, dog], objects=[aaa, bbb, ccc]}

以上的两种方式有什么区别呢?

@ConfigurationProperties @Value
功能 批量注入配置文件的属性 一个一个指定
松散绑定 支持 不支持
JSR303数据校验 支持 不支持
复杂数据封装 支持 不支持(Map)

松散绑定,username 可以用user-name 表示,来获取值

JSR303数据校验,如果用@Value获取全局配置文件的属性,使用@Validated文件格式校验是不起作用的。

@PropertySource 注解加载指定的配置文件。

​ @PropertySource (value = “ ”) 指明加载类路径下的哪个配置文件来注入值

创建配置类,由于篇幅问题这里省略了 setter、getter ,toString 方法,但是实际开发中这个是必须的,否则无法成功注入。

@Component
@PropertySource( "classpath:student.properties")
@ConfigurationProperties(prefix = "student")
public class Student {

 private String sname;
}

在student.properties文件中添加如下配置

student.sname=admin

测试类

@SpringBootTest
class SpringbootExampleApplicationTests {
 @Autowired
 private DogConfig dogConfig;
 @Test
 void contextLoads() {
 System.out.println("注入的对象:"+dogConfig.getName());
 }

}

运行结果:

Student{sname='admin'}

@ImportResource 导入Spring 配置文件

@ImportResource 注解用来导入 Spring 的配置文件,如果Spring配置文件 "bean.xml",从而让配置文件里面的内容生效,通常可以把@ImportResource标注在@SpringBootApplication的启动类上即可。

举例说明:比如我们把PersonService注入到Spring容器当中,通过Spring配置文件的方式操作,代码示例如下:

public class PersonService {
}
@ImportResource("classpath:bean.xml")
@SpringBootApplication
public class SpringBootConfigApplication {

 public static void main(String[] args) {
 SpringApplication.run(SpringBootConfigApplication.class, args);
 }

}

Spring的配置文件:bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean id="personService" class="com.zfcoding.service.PersonService"></bean>
</beans>

测试的案例:

@SpringBootTest
class SpringBootConfigApplicationTests {
 @Autowired
 private PersonService personSerivcer;
 @Test
 void contextLoads() {
 System.out.println("注入的对象:"+personSerivcer);
 }
}

运行的结果:

注入的对象:com.zfcoding.service.PersonService@5b84f14

这Spring 中bean的配置实现,但是SpringBoot 推荐我们使用注解开发,那Springboot 中注解是如何实现bean 的注入呢?

@Configuration:指明当前类是配置类,就是代替上面说到的spring的配置文件.

@Bean 将方法返回值添加到容器当中,容器中这个组件默认的id 是方法名

@Configuration
public class MyConfig {
 @Bean
 public PersonSerivcer personSerivcer(){
 return new PersonSerivcer();
 }
}

这样就可以就可以通过注解实现代替Spring 中的配置文件了。

三、SpringBoot 的Profile

我们这里就以yml文件为例

第一种是我在 主配置文件编写的时候,文件名可以是application-{profile}.yml(application-dev.yml, application-prod.yml),默认使用 文件application.yml 的配置

1、如果我们想要使用的application-dev.yml 全局配置文件,在application.yml 指定即可。

配置实例:

在application.yml 配置文件中添加如下配置

spring:
 profiles:
 active: dev

在application-dev.ym 配置文件中添加如下配置l

server:
 port: 8080
#应用访问的项目路径
 servlet:
 context-path: /boot
person:
 username: 占山

2、yml支持多文档快方式

那么,在application-dev.ym 配置文件中添加如下配置l

spring:
 profiles:
 active: prod
---
server:
 port: 8080
 servlet:
 context-path: /zf
spring:
 profiles: dev
---
person:
 userName: 啊哈
server:
 port: 8081
 servlet:
 context-path: /boot
spring:
 profiles: prod

3、Program arguments

   在Program arguments中配置参数

--spring.profiles.active=dev

4、虚拟机的方式

在VM options下使用命令:-Dspring.profiles.active=prod

四、小结

实际开发中我们如果如果我们需要取 许多个配置项,就使用@ConfigurationProperties注解,如果只是注入一个属性就使用@Value,

@PropertySource 注解加载指定的配置文件,@ImportResource 导入Spring 配置文件(这里可以使用注解来替代)。

到此这篇关于SpringBoot获取配置文件的简单实现方法就介绍到这了,更多相关SpringBoot获取配置文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Boot 配置文件详解(小结)

    Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件.他们的作用都是修改Spring Boot自动配置的默认值.相对于properties文件而言,yml文件更年轻,也有很多的坑.可谓成也萧何败萧何,yml通过空格来确定层级关系,是配置文件结构跟清晰,但也会因为微不足道的空格而破坏了层级关系.本章重点介绍yml的语法和从配置文件中取值.还在等什么,赶快来学习吧! 技术:yaml.properties语法,ConfigurationProperties和Val

  • Spring Boot中配置文件application.properties使用

    一.配置文档配置项的调用 启动后在浏览器直接输入http://localhost:18080/user/test,就直接打印出配置文件中的配置内容. 二.绑定对象bean调用 有时候属性太多了,一个个绑定到属性字段上太累,官方提倡绑定一个对象的bean,这里我们建一个ConfigBean.java类,顶部需要使用注解@ConfigurationProperties(prefix = "com")来指明使用哪个 @ConfigurationProperties(prefix = &quo

  • Spring Boot 把配置文件和日志文件放到jar外部

    如果不想使用默认的application.properties,而想将属性文件放到jar包外面,可以使用如下两种方法: 只能设置全路径.因为Java -jar运行jar包时,无法指定classpath(无论通过参数还是环境变量,设置的classpath都会被覆盖). 方法1:命令行传参指定spring.config.location java -jar -Dspring.config.location=D:\zTest\config\config1.properties springbootre

  • SpringBoot配置文件的加载位置实例详解

    springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优先于配置的惯例,旨在让您尽快启动和运行.在一般情况下,我们不需要做太多的配置就能够让spring boot正常运行.在一些特殊的情况下,我们需要做修改一些配置,或者需要有自己的配置属性. SpringBoot启动会扫描以下位置的application.yml或者 application.properties文件作为SpringBoot的默认配置文件. -file:./config/    -file:./

  • SpringBoot获取yml和properties配置文件的内容

    (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @ConfigurationProperties 注解 --> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor --> <dependency> <groupId>org.springframework.boot</groupId>

  • 详解Spring Boot加载properties和yml配置文件

    一.系统启动后注入配置 package com.example.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframewo

  • springboot如何读取配置文件(application.yml)中的属性值

    在spring boot中,简单几步,读取配置文件(application.yml)中各种不同类型的属性值: 1.引入依赖: <!-- 支持 @ConfigurationProperties 注解 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId>

  • spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程

    本篇我将继续向小伙伴介绍springboot配置文件的配置,已经全局配置参数如何使用,好了下面开始我们今天的内容介绍. 我们知道Spring Boot支持容器的自动配置,默认是Tomcat,当然我们也是可以进行修改的: 1.首先我们排除spring-boot-starter-web依赖中的Tomcat:在pom文件中排除tomcat的starter <dependency> <groupId>org.springframework.boot</groupId> <

  • 在SpringBoot下读取自定义properties配置文件的方法

    SpringBoot工程默认读取application.properties配置文件.如果需要自定义properties文件,如何读取呢? 一.在resource中新建.properties文件 在resource目录下新建一个config文件夹,然后新建一个.properties文件放在该文件夹下.如图remote.properties所示 二.编写配置文件 remote.uploadFilesUrl=/resource/files/ remote.uploadPicUrl=/resource

  • SpringBoot入坑笔记之spring-boot-starter-web 配置文件的使用

    经过上一篇的介绍,相信小伙伴们已经按奈不住内心对springboot的向往,本篇我将继续向小伙伴介绍springboot配置文件的配置,已经全局配置参数如何使用,好了下面开始我们今天的内容介绍. 我们知道Spring Boot支持容器的自动配置,默认是Tomcat,当然我们也是可以进行修改的: 1.首先我们排除spring-boot-starter-web依赖中的Tomcat:在pom文件中排除tomcat的starter <dependency> <groupId>org.spr

随机推荐