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会从这四个位置全部加载主配置⽂件,并且还能产⽣互相配置的效果。
除此外,我们还可以通过fig.location来改变默认的配置⽂件位置。
项⽬打包好以后,我们可以使⽤命令⾏参数的形式,启动项⽬的时候来指定配置⽂件的新位置;指定默认加载的这些配置⽂件共同起作⽤形成互补配置。
在 G盘⽬录下,创建⼀个l⽂件,定义端⼝为8085
打包项⽬,启动命令⾏:java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --fig.location=G:/l 回车运⾏。
外部配置加载顺序
1、命令⾏参数
eg: java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8087
---- 由jar包外向jar包内进⾏寻:
2、优先加载带profile
jar包外部的application-{profile}.properties或l(带spring.profile)配置⽂件
将打好的jar包放在⼀个⽬录下,然后再该⽂件夹下新建⼀个名为l的⽂件,其中指定
port为8082 ,访问路径为/boot ,然后命令⾏直接启动项⽬。java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --l
在讲配置⽂件之前,我先说⼀说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;
}
在主配置⽂件中添加如下配置(l)
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 "姓名:"+UserName()+"年龄:"+Age();
}
}
姓名:hello年龄:20
所以,我们就可以通过 @Value(${key})的⽅式获取全局配置⽂件中的指定配置项。
@ConfigurationProperties
如果我们需要取许多个配置项,通过 @Value 的⽅式去配置项需要⼀个⼀个去取,显然有点⿇烦。所以我们可以使⽤
@ConfigurationProperties。
标有 @ConfigurationProperties的类的所有属性和配置⽂件中相关的配置项进⾏绑定,绑定之后我们就可以通过这个类去访问全局配置⽂件中的属性值。
代码实例如下:
1、在主配置⽂件中添加如下配置
user:spring怎么读取配置
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(){
String();
}
}
User{username='admin', password='123456', map={k1=v1, k2=v2}, person=fig.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("注⼊的对象:"+Name());
}
}
运⾏结果:
Student{sname='admin'}
@ImportResource 导⼊Spring 配置⽂件
@ImportResource 注解⽤来导⼊ Spring 的配置⽂件,如果Spring配置⽂件 "l",从⽽让配置⽂件⾥⾯的内容⽣效,通常可以把@ImportResource标注在@SpringBootApplication的启动类上即可。
举例说明:⽐如我们把PersonService注⼊到Spring容器当中,通过Spring配置⽂件的⽅式操作,代码⽰例如下:
public class PersonService {
}
@ImportResource("l")
@SpringBootApplication
public class SpringBootConfigApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootConfigApplication.class, args);
}
}
Spring的配置⽂件:l
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans /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}.l, l),默认使⽤⽂件l 的配置
1、如果我们想要使⽤的l 全局配置⽂件,在l 指定即可。
配置实例:
在l 配置⽂件中添加如下配置
spring:
profiles:
active: dev
在 配置⽂件中添加如下配置l
server:
port: 8080
#应⽤访问的项⽬路径
servlet:
context-path: /boot
person:
username: 占⼭
2、yml⽀持多⽂档快⽅式
那么,在 配置⽂件中添加如下配置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
四、⼩结

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。