zoukankan      html  css  js  c++  java
  • SpringBoot获取配置文件,就这么简单。

    摘自:https://www.cnblogs.com/xiaofuzi123456/p/12996386.html

    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
    
    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

    image-20200524174511729

    4、虚拟机的方式

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

    image-20200524174645120

    四、小结

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

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

    后记

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

    欢迎大家关注我的公众号:阿福聊编程,长期更新Java各种技术文章。

     
    分类: SpringBoot
  • 相关阅读:
    Win10解决RuntimeBroker.exe后台运行CPU占比高的方法
    easyexcel测试用例
    电脑Wlan不能上网的解决办法
    [LeetCode] Delete and Earn 删除与赚取
    [LeetCode] Daily Temperatures 日常温度
    [LeetCode] 738. Monotone Increasing Digits 单调递增数字
    [LeetCode] 737. Sentence Similarity II 句子相似度之二
    [LeetCode] Parse Lisp Expression 解析Lisp表达式
    [LeetCode] Asteroid Collision 行星碰撞
    [LeetCode] 644. Maximum Average Subarray II 子数组的最大平均值之二
  • 原文地址:https://www.cnblogs.com/xichji/p/13023484.html
Copyright © 2011-2022 走看看