从配置文件中获取配置信息的几种方法

1、利用ResourceBundle类从properties文件中获取配置信息
创建配置文件并写入配置信息


image.png

使用以下代码可以轻松获取配置信息

package com.course.httpclient.cookies;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;

public class MyCookiesForGet {
    //定义一个String属性,用来存储获取到的url信息
    private String url;
    //定义一个ResourceBundle类的对象,用来从application.properties文件中获取配置信息
    private ResourceBundle resourceBundle;

    @BeforeTest
    public void BeforeTest(){
        //调用getBundle方法,告诉resourceBundle从哪个配置文件中获取配置信息,定义Locale.CHINA是中文信息
        resourceBundle=ResourceBundle.getBundle("application", Locale.CHINA);
        //传入test.url配置名称,获取配置信息并赋值给url
        url=resourceBundle.getString("test.url");
    }

    @Test
    public void testGetCookies() throws IOException {
        //拼接url
        String uri=url+resourceBundle.getString("getcookies");

        //httpclient请求接口获取返回结果并打印
        HttpClient httpClient=new DefaultHttpClient();
        HttpGet httpGet=new HttpGet(uri);
        HttpResponse response=httpClient.execute(httpGet);
        String result= EntityUtils.toString(response.getEntity());
        System.out.println(result);


    }

}

2、利用SpringBoot获取properties或yaml文件中的配置信息
配置文件的名称一定要写成application,或者写成application-prod,application-dev,通过- 横杠带后缀的方式。
比如这样写:


image.png

application.yaml中写的是:

spring:
  profiles:
    active: prod
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dbgirl?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
    username: username
    password: password
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

该文件的名称一定要写成application才能从该文件中获取配置信息
通过active: prod来区分是哪个配置文件,哪个环境,目前是生产环境,配置成active:dev就是开发环境
datasource的配置是数据库的信息
jpa的配置是jpa插件,连接数据库会用到

看application-prod.yaml中写的内容:

server:
  port : 8081 #端口号
  servlet:
    context-path: /test #请求路径
cupSize: B
age: 18
content: "cupSize:${cupSize}+age:${age}" #注解里面使用注解

girl:
  cupSize : B
  age : 22

从该文件中读取server的端口号和路径、参数信息
2.1 以下代码是用@value注解从配置文件中获取配置信息

package com.imooc.controller;

import com.imooc.properties.GirlProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/testtwo") //写到类前面,controller类中的每个方法请求时url都要加上/testtwo
public class HelloController {
    //使用value注解把cupSize的参数值从yaml文件中获取过来,然后赋值给cupSize参数
    @Value("${cupSize}")
    private String cupSize;

   @Value("${age}")
    private String age;

    //请求方式注解,value是指请求路径,method是请求方法
    //value = {"/hello","/hi"} 是指请求url时用/hello或者/hi都可以
    @RequestMapping(value = {"/hello","/hi"},method = RequestMethod.GET)
    public String say(){
        return cupSize+" "+age;
    }
}

2.2以下代码是在配置文件中写组合配置参数:
配置文件中这样写:


image.png

代码中这些写:

package com.imooc.controller;

import com.imooc.properties.GirlProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/testtwo") //写到类前面,controller类中的每个方法请求时url都要加上/testtwo
public class HelloController {
//    //获取组合参数content的值赋值给content
    @Value("${content}")
    private String content;


    //请求方式注解,value是指请求路径,method是请求方法
    //value = {"/hello","/hi"} 是指请求url时用/hello或者/hi都可以
    @RequestMapping(value = {"/hello","/hi"},method = RequestMethod.GET)
    public String say(){
         return content;
    }
}

2.3以下代码是从配置文件中获取配置参数并转换成类的属性,然后设置get和set方法去调用
配置文件中这样写:


image.png

定义实体类,使用这两个注解:
@Component
//获取前缀是girl的配置信息
@ConfigurationProperties(prefix = "girl")
代码如下:

package com.imooc.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
//获取前缀是girl的配置信息
@ConfigurationProperties(prefix = "girl")
public class GirlProperties {
    private String cupSize;
    private Integer age;
    public String getCupSize() {
        return cupSize;
    }
    public void setCupSize(String cupSize) {
        this.cupSize = cupSize;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

controller中使用@Autowired注解,把实体类注入到controller中,使用get方法获取参数值,代码如下:

package com.imooc.controller;

import com.imooc.properties.GirlProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/testtwo") //写到类前面,controller类中的每个方法请求时url都要加上/testtwo
public class HelloController {

    //使用@Autowired自动注入函数
    @Autowired
    private GirlProperties girlProperties;

    //请求方式注解,value是指请求路径,method是请求方法
    //value = {"/hello","/hi"} 是指请求url时用/hello或者/hi都可以
    @RequestMapping(value = {"/hello","/hi"},method = RequestMethod.GET)
    public String say(){
        return girlProperties.getCupSize()+girlProperties.getAge();
    }
}

3、利用写工具类从yaml文件和properties文件中获取配置信息
先在resource中新建一个yaml的配置文件,写入一些内容


image.png

和一个properties的文件:


image.png

编写工具类代码:

package com.meituan.Util;

import org.yaml.snakeyaml.Yaml;

import java.io.*;
import java.util.Map;
import java.util.Properties;

/*
该类中封装了从yaml中获取配置信息和从properties中获取配置信息、修改配置信息3个方法

测试类中直接调用该方法传入key值就可以了。
 */

public class ElementSource {
    private static String testdatayaml = "src/main/resources/testdata.yaml";
    private static String testdataproperties = "src/main/resources/testdata.properties";
    //从yaml文件中获取信息
    public String getElementsource(String name){

        try {
            Yaml yaml = new Yaml();
            Map map;
            map = (Map) yaml.load(new FileInputStream(testdatayaml));

            if (map == null){
                return null;
            }else if (map.get(name) == null){
                return null;
            }else {
                String resource = map.get(name).toString();
                return resource;
            }
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }


    }

    //从properties配置文件中获取配置信息,其实不用写这个工具类,直接利用resourcebundle就可以直接获取配置信息
    public String getproelementsource(String keyname){
        Properties properties = new Properties();
        try{
            InputStream inputStream = new FileInputStream(testdataproperties);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
            properties.load(bufferedReader);
            inputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }


        if (properties.containsKey(keyname)){
            return properties.getProperty(keyname);
        }else {
            System.out.println("获取的值不存在");
            return null;
        }

    }

    //根据某个key值修改properties配置文件中的value值
    public void setproelementsource(String keyname,String value ){
        try{
            //重新new一个properties
            Properties properties = new Properties();
            //要先创建一个inputstream的流,把文件中的内容赋予给properties,要不然properties的内容就是null,就会导致修改时把之前的内容覆盖
            InputStream inputStream = new FileInputStream(testdataproperties);
            properties.load(inputStream);
            //要关闭inputstream流
            inputStream.close();


            //创建输出流
            OutputStream outputStream = new FileOutputStream(testdataproperties);
            //创建bufferwriter 写入数据
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"utf-8"));
            //往配置文件中写入数据,如果没有对应的key值则新增,如果有就修改
            properties.setProperty(keyname,value);
            //添加注释信息
            properties.store(bufferedWriter,keyname+" "+value);
            //关闭bufferwriter
            bufferedWriter.close();
            //关闭outputstream流
            outputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

测试类中直接调用该方法传入key值即可从配置文件中获取数据信息和修改数据信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345