欧博app:SpringBoot获取配置文件,就这么简朴。

admin 4个月前 (05-31) 科技 31 0

在讲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
  1. 建立设置类,由于篇幅问题这里省略了 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

欧博app:SpringBoot获取配置文件,就这么简朴。 第1张

4、虚拟机的方式

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

欧博app:SpringBoot获取配置文件,就这么简朴。 第2张

四、小结

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

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

后记

由于本人能力有限,若文章有错误的地方,请人人指出,一起交流学习。今天就和人人讲到这里,喜欢我的小伙伴们,动动你的小手点个关注呗。

迎接人人关注我的民众号:阿福聊编程,历久更新Java种种技术文章。

欧博app:SpringBoot获取配置文件,就这么简朴。 第3张

,

欧博网址开户

www.schltkd.com欢迎进入欧博网址(Allbet Gaming),欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。

皇冠体育声明:该文看法仅代表作者自己,与本平台无关。转载请注明:欧博app:SpringBoot获取配置文件,就这么简朴。

网友评论

  • (*)

最新评论

标签列表

    文章归档

    站点信息

    • 文章总数:640
    • 页面总数:0
    • 分类总数:8
    • 标签总数:960
    • 评论总数:272
    • 浏览总数:9380