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
回车运行。
外部配置加载顺序
命令行参数
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
的类的所有属性和配置文件中相关的配置项进行绑定,绑定之后我们就可以通过这个类去访问全局配置文件中的属性值。
代码实例如下:
- 在主配置文件中添加如下配置
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 配置文件(这里可以使用注解来替代)。
后记
由于本人能力有限,若文章有错误的地方,请大家指出,一起交流学习。今天就和大家讲到这里,喜欢我的小伙伴们,动动你的小手点个关注呗。
欢迎大家关注我的公众号:阿福聊编程,长期更新Java各种技术文章。
SpringBoot获取配置文件,就这么简单。的更多相关文章
- SpringBoot获取配置文件的自定义参数
1.在application.properties中自定义参数 spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datas ...
- springboot获取配置文件中的内容
代码: GrilApplication.java @SpringBootApplication public class GrilApplication { public static void ma ...
- .net core —— 控制台如何获取配置文件的内容?
本文链接:https://blog.csdn.net/yenange/article/details/82457761参考: https://github.com/liuzhenyulive/Json ...
- SpringBoot配置分析、获取到SpringBoot配置文件信息以及几种获取配置文件信息的方式
Spring入门篇:https://www.cnblogs.com/biehongli/p/10170241.html SpringBoot的默认的配置文件application.properties ...
- SpringBoot获取全局配置文件的属性以及@ConfigurationProperties实现类型安全的配置
在SpringBoot,可以定义一个全局配置文件,全局配置文件有两种形式: 1). application.properties 2).application.yml 二者的后缀名不同,编辑的格式也不 ...
- SpringBoot用@ConfigurationProperties获取配置文件值
SpringBoot的配置文件有yml和properties两种,看一些文章说yml以数据为中心,比较好.个人觉得properties更好用,所以这里以properties格式为例来说. 我们都知道@ ...
- SpringBoot项目中,获取配置文件信息
1.在配置文件中设置信息,格式如下 wechat: mpAppId: wxdf2b09f280e6e6e2 mpAppSecret: f924b2e9f140ac98f9cb5317a8951c71 ...
- springBoot之配置文件的读取以及过滤器和拦截器的使用
前言 在之前的学习springBoot中,成功的实现了Restful风格的基本服务.但是想将之前的工程作为一个项目来说,那些是仅仅不够的.可能还需要获取自定义的配置以及添加过滤器和拦截器.至于为什么将 ...
- 利用SpringBoot+Logback手写一个简单的链路追踪
目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...
随机推荐
- POJ3169(差分约束:转载)
转载自mengxiang000000传送门 Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10278 Ac ...
- springboot配置静态资源访问路径
其实在springboot中静态资源的映射文件是在resources目录下的static文件夹,springboot推荐我们将静态资源放在static文件夹下,因为默认配置就是classpath:/s ...
- 异常: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
如果出现这个错误信息,如果你的项目是Maven结构的,那么一般都是你的项目的Maven Dependencies没有添加到项目的编译路径下 解决办法: ①选中项目->右键Properties-& ...
- 201771010113 李婷华 《面向对象程序设计(Java)》第六周总结
一.理论知识部分 第四章 类与对象 1.方法的定义:方法声明和方法体. 2.重载:一个类中可以有多个方法具有相同的名字,不同的类型,不同的参数. 3.构造器:也叫构造方法,是类中的一种特殊的方法,其作 ...
- OpenWrt R2020.03.05 去广告 抗污染 加速 UnPnP NAS
固件版本已经更新,新版本链接:https://www.cnblogs.com/zlAurora/p/12500932.html 容我啰嗦一下,为什么会有这个固件. 从KoolShare LED ...
- hive经典练习题
一.建表和加载数据 1.student表 create table if not exists student(s_id int,s_name string,s_birth string,s_sex ...
- Web_php_unserialize
0x01 <?php class Demo { private $file = 'index.php'; public function __construct($file) { $this-& ...
- SpringMVC中参数的传递(一)
前言 1.首先,我们在web.xml里面配置前端控制器DispatcherServlet以及字符编码过滤器(防止中文乱码),配置如下: <?xml version="1.0" ...
- ES6-10笔记(一)
大纲 (慕课的图先用着) scope-作用域 作用域是指程序源代码中定义变量的区域,规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript作用域共有两种主要的工作模型--词 ...
- 我的.emacs配置
我不是大神,使用vim和emacs只是兴趣,打发空闲时间. 上代码: ;; Added by Package.el. This must come before configurations of ; ...