获取配置文件中的属性

2023-11-15

spring boot的工程启动的时候,内部文件默认是加载classpath路径或者classpath:/config目录下的application.properties文件的。当然也可以指定加载其它的配置文件,如何获取配置文件中的属性呢?实例如下:

【1】、获取默认classpath下的application.properties配置文件中的属性

application.properties中的内容为:

local.ip=127.0.0.1
  • 1

一、获取classpath下的application.properties文件中属性

1、直接通过配置文件的环境变量获取 
启动类:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext app = SpringApplication.run(App.class, args);
    /*通过getEnvironment函数默认获取到的文件即为application.properties,然后用getProperty函数从文件中获取键的属性*/
    System.out.println(app.getEnvironment().getProperty("local.ip"));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

或者创建一个类,用来获取配置属性,例如

package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/*注意:由于@SpringBootApplication中有一个注解@ComponentScan自动扫描启动类所在的包,而PropertiesConfig正好在启动包下,如果
 * 该类不与启动类在同一包下,需要该类加载到spring boot的启动源中*/
@Component
public class PropertiesConfig {

    @Autowired
    private Environment env;

    public void show(){     
    System.out.println(env.getProperty("local.ip"));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

启动类中的方法为:

        ConfigurableApplicationContext app = SpringApplication.run(App.class, args);
        app.getBean(PropertiesConfig.class).show();
  • 1
  • 2

当运行启动类的时候,输出如下:

127.0.0.1
  • 1

2、用@Value注解来获取 
新建一个配置类,专门用来获取application.properties文件中的属性。

package com.example.demo;
import 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

/*注意:由于@SpringBootApplication中有一个注解@ComponentScan自动扫描启动类所在的包,而PropertiesConfig正好在启动包下,如果
 * 该类不与启动类在同一包下,需要该类加载到spring boot的启动源中*/
@Component
public class PropertiesConfig {

    /*通过@Value注解会默认把application.properties中的local.ip键对应的属性自动赋给localIp属性*/
    @Value("${local.ip}")
    private String localIp;

    public void show(){
        System.out.println("localIp=" + localIp);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

启动类为:

        ConfigurableApplicationContext app = SpringApplication.run(App.class, args);
        app.getBean(PropertiesConfig.class).show();
  • 1
  • 2

当运行启动类的时候,输出如下:

127.0.0.1
  • 1

【2】、获取自定义的properties配置文件属性

当在工程目录下自定义了配置文件,例如在/src/main/resources/下的/fileConfig的目录下创建一个jdbc.properties文件,或者在服务器中非工程目录下D:\tmp创建一个jdbc1.properties配置文件。 如果启动spring boot工程的时候,系统默认是没有加载该配置文件的,因此在系统环境中获取不到该配置文件,若想获取到该配置文件中的属性,可以通过下面两种方式进行获取:在启动的参数中指定启动自定义配置文件;在配置类上指定要加载的自定义配置文件。

自定义jdbc.properties配置文件:

jdbc.username=lzj
jdbc.password=123456
  • 1
  • 2

自定义jdbc1.properties配置文件:

jdbc.username1=lzj
jdbc.password1=123456
jdbc.url=jdbc:mysql://localhost:3306/databasename
  • 1
  • 2
  • 3

一、在启动spring boot的参数中进行指定 
run as -> run configurations -> arguments 
在program arguments框中填入下列参数:

--spring.config.location=classpath:/fileConfig/jdbc.properties, file:D:/tmp/jdbc1.properties
  • 1

如果配置文件直接在classpath或者classpath下的config目录下,例如app.properties,也可以直接如下配置:

--spring.config.name=app
  • 1

如按上面配置后,spring boot启动的时候会自动加载指定的文件,下面获取自定义文件中的属性就和获取默认classpath下的application.properties配置文件中的属性的方法完全一致,请参考上面获取方式。

二、在配置类上指定要加载的自定义配置文件 
1、例如还是要获取classpath下的/fileConfig/jdbc.properties和D:/tmp/jdbc1.properties的自定义配置文件属性,现在不需要在启动的参数中进行指定了,定义一个配置类,在配置类中进行指定加载的自定义配置文件。 
配置类ConfigTest :

package com.example.demo;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;

@Configuration
@PropertySource("classpath:/fileConfig/jdbc.properties")
@PropertySource("file:D:/tmp/jdbc1.properties")
/*或者按如下配置:
@PropertySources({@PropertySource("classpath:/fileConfig/jdbc.properties"), @PropertySource("file:D:/tmp/jdbc.properties")})*/
public class ConfigTest {

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

配置完要加载的配置文件后,下面就是要获取自定义的配置文件中的属性了。 
创建获取classpath:/fileConfig/jdbc.properties的bean类JdbcTest:

package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class JdbcTest {

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    public void show(){
        System.out.println("username=" + username);
        System.out.println("password=" + password);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

创建获取D:/tmp/jdbc1.properties的bean的类JdbcFile :

package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class JdbcFile {

    @Value("${jdbc.username1}")
    private String username;

    @Value("${jdbc.password1}")
    private String password;

    @Value("${jdbc.url}")
    private String url;

    public void show(){
        System.out.println("username=" + username);
        System.out.println("password=" + password);
        System.out.println("url=" + url);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

启动类如下:

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext app = SpringApplication.run(App.class, args);
    app.getBean(JdbcTest.class).show();
    app.getBean(JdbcFile.class).show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出结果为:

username=lzj
password=123456
username=zhangsan
password=654321
url=jdbc:mysql://localhost:3306/databasename
  • 1
  • 2
  • 3
  • 4
  • 5

2、上面一种方式通过配置类加载自定义配置文件后,然后通过@value注解从配置类中获取键值。下面一种方式也是先通过配置类加载自定义的配置文件,但是通过@ConfigurationProperties注解自动把配置文件中的键对应的值注入到相应的属性中。例如: 
配置类ConfigTest 同上:

package com.example.demo;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;

@Configuration
@PropertySource("classpath:/fileConfig/jdbc.properties")
@PropertySource("file:D:/tmp/jdbc1.properties")
/*或者按如下配置:
@PropertySources({@PropertySource("classpath:/fileConfig/jdbc.properties"), @PropertySource("file:D:/tmp/jdbc.properties")})*/
public class ConfigTest {

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

下面创建一个类SourceProperties,用来获取自定义配置文件中的键值,类中的属性一定要和自定义配置文件中的键的名字保持一致,否则不能把配置文件中键对应的值注入到类对象的属性中。在上面的配置类中加载了classpath:/fileConfig/jdbc.properties和file:D:/tmp/jdbc1.properties两个自定义的配置文件,在SourceProperties类中只需要定义两个配置文件中包含的键为类对象的属性,然后通过set方法把配置文件中键对应的值注入到类对象的属性中就可以了。

package com.example.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
/*prefix可以指定配置文件中键的前缀。例如配置文件中有一个键为jdbc.username,配置了prefix="jdbc"后,在下面的属性中只需要定义username就可以了。在值注入的时候,就会自动把配置文件中的jdbc.username对应的值自动注入到username属性中*/
@ConfigurationProperties(prefix="jdbc")
public class SourceProperties {

    /*username对应jdbc.properties文件中的jdbc.username键*/
    private String username;
    /*username1对应jdbc1.properties文件中的jdbc.username1键*/
    private String username1;
    /*password对应jdbc.properties文件中的jdbc.password键*/
    private String password;
    /*password1对应jdbc1.properties文件中的jdbc.password1键*/
    private String password1;
    /*url对应jdbc1.properties文件中的jdbc.url键*/
    private String url;

    /*一定要给需要注入的属性设置get方法,否则值注入不进来*/
    public void setUsername(String username) {
        this.username = username;
    }

    public void setUsername1(String username1) {
        this.username1 = username1;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setPassword1(String password1) {
        this.password1 = password1;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void show(){
        System.out.println("---username=" + username);
        System.out.println("---username1=" + username1);
        System.out.println("---password=" + password);
        System.out.println("---password=" + password1);
        System.out.println("---url=" + url);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

启动类为:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext app = SpringApplication.run(App.class, args);
    app.getBean(SourceProperties.class).show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行启动类,输出结果为:

---username=lzj
---username1=zhangsan
---password=123456
---password=654321
---url=jdbc:mysql://localhost:3306/databasename
  • 1
  • 2
  • 3
  • 4
  • 5

可见完全取到了自定义配置文件中的键值。

【3】、另外,配置文件中还可以定义变量,可以为配置文件中没有定义的键赋一个默认的值

1、在配置文件中定义变量 
下面以spring boot默认加载的application.properties为例,在该配置文件中配置如下,先定义了一个name的键值对,然后又定义了一个local.name的键值对,但local.name中的键值对引用了name的键值对。

name=lzj
local.name=hello ${name}
  • 1
  • 2

启动类为:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext app = SpringApplication.run(App.class, args);
    System.out.println(app.getEnvironment().getProperty("name"));
        System.out.println(app.getEnvironment().getProperty("local.name"));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行启动类,输出结果为:

lzj
hello lzj
  • 1
  • 2

可见,获得了配置文件中键对应的值。

2、为配置文件中没有定义的键默认赋一个值。 
还是以spring boot默认加载的application.properties为例,其配置内容为:

local.ip=127.0.0.1
  • 1

配置文件中只配置了local.ip,没有配置local.port,下面我们从配置文件中获取local.port,如果不存在的话,就默认赋一个值。创建一个PropertiesConfig 类,用来获取键值。

package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/*注意:由于@SpringBootApplication中有一个注解@ComponentScan自动扫描启动类所在的包,而PropertiesConfig正好在启动包下,如果
 * 该类不与启动类在同一包下,需要该类加载到spring boot的启动源中*/
@Component
public class PropertiesConfig {

    /*从配置文件取local.port对应的值,如果不存在,就默认赋一个8888的值。*/
    @Value("${local.port:8888}")
    private Integer localPort;

    public void show(){
    System.out.println("local.port=" + localPort);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

启动类为:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        ConfigurableApplicationContext app = SpringApplication.run(App.class, args);
        app.getBean(PropertiesConfig.class).show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行启动类,输出:

local.port=8888
  • 1

版权声明:转载请注明出处 https://blog.csdn.net/u010502101/article/details/78702093

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取配置文件中的属性 的相关文章

随机推荐

  • js动态加载js和css

    一 动态加载CSS动态创建css样式有两种方式 1 动态插入css外部文件的方法 function loadStyle url var link document createElement link link type text css
  • Android Instrumentation模拟鼠标点击事件

    看了几遍网上的博客一直没有 模拟出鼠标点击事件和按钮事件 后来抱着试试态度再重试的时候终于有所斩获 下面把具体的情况记录一下 首先我们必须了解类 Instrumentation Instrumentation发送键盘鼠标事件 Instrum
  • 什么是DNS服务器?有哪些作用?

    什么是DNS服务器 DNS服务器是 Domain Name System或者Domain Name Service 域名系统或者域名服务 域名系统为Internet上的主机分配域名地址和IP地址 用户使用域名地址 该系统就会自动把域名地址转
  • 智能一体化运维平台(一)java实现ssh连接

    一 思路 1 作为java的web后台应用 在做ssh连接的时候 比如导入所需要的协议jar包 如ssh jar 本次测试 本人使用的是 2 导入jar包后 开始进入代码编程 首先需要进行创建用户名 密码 端口 ip地址等变量 用来存储对应
  • 腾讯云技术分享:MySQL AHI 实现解析

    MySQL 定位用户记录的过程可以描述为 打开索引 gt 根据索引键值逐层查找 B 树 branch 结点 gt 定位到叶子结点 将 cursor 定位到满足条件的 rec 上 如果树高为 N 则需要读取索引树上的 N 个结点并进行比较 如
  • linux 线程和进程的区别与联系::

    进程 承担分配系统资源的基本实体 线程 调度的基本单位 线程是进程里面的执行流 线程在进程的地址空间内运行 linux中没有真正意义上的线程 线程是用进程模拟的 地址空间上 线程没有自己独立的地址空间 共享进程的空间 但是进程包含独立的地址
  • 微信小程序-“授权失败”场景的优雅处理

    微信小程序中提供了相关API 让开发者能获取到微信用户的相关信息 在首次去获取的时候会展示一个用户是否同意授权的对话框 发现有不少线上的小程序都没有处理好用户 拒绝授权 导致的 授权失败 场景 一个观点 私认为 开发微信小程序在用户授权上有
  • 蘑菇街前端面试

    vue与jquery的区别 为什么现在很多人使用vue vue怎样实现双向数据绑定 内部原理 1 jQuery首先要获取到dom对象 然后对dom对象进行进行值的修改等操作 2 Vue是首先把值和js对象进行绑定 然后修改js对象的值 Vu
  • iview Table中switch值无法刷新问题

    table里面的开关在修改状态以后 翻页后状态不在变化 render h params gt return h i switch props size large value params row filterContact on可以传入绑
  • Tkinter 组件详解(七):Entry

    Tkinter 组件详解之Entry Entry 输入框 组件通常用于获取用户的输入文本 何时使用 Entry 组件 Entry 组件仅允许用于输入一行文本 如果用于输入的字符串长度比该组件可显示空间更长 那内容将被滚动 这意味着该字符串将
  • leetcode刷题——多维枚举(一)

    题目一 思路 双指针 bool isSubsequence char s char t int fast 0 int slow 0 while slow
  • JavaWeb之Servlet详解

    文章目录 一 什么是Servlet 二 Servlet 1 Servlet是如何起作用的 2 Servlet接口中的方法 3 Servlet对象的生命周期 三 ServletConfig 1 什么是ServletConfig 2 Servl
  • MOS驱动自举电容和限流电阻的选取

    自举电容选取 最近做逆变时出现了异常 使用2104驱动MOS管 蓝色为滤波后双端带载时出现的波形 一端带载时没有问题 放大波形后发现输出波形在占空比满值时垮掉 产生严重的震荡 可以看到波形顶部斜向下 我们可以推断是驱动自举电容值偏小 当占空
  • ARMv8-A 地址翻译技术之MMU的前世今生

    MMU的重要性不言而喻 支撑操作系统之上的各种复杂应用 但在正式讲MMU之前 我们先说说MMU的发展史 因为ARMv8 A的MMU相当复杂 直接切入正题 会显得比较枯燥 废话不多说 咱们马上开始 一 前言 关于虚拟内存系统的演变史 MMU在
  • 计划 060703

    ESOE项目暂时作为一个自娱型项目 每日投入30分钟 近期按计划完成以下工作 1 完成计划 ok 2 完成对ESOE项目的介绍 ok 060704 3 在blog发布已有的 ESOE Specification v0 1 doc 英文版 o
  • 什么是.NET架构

    什么是 NET架构 NET架构主要分为3部分 FCL Framework Class Library CTS Common Type System 其中包括Common Language Specification CLR Common L
  • 教你自制一款简单的助听器

    助听器实质上是一种低频放大器 可用耳机进行放音 当使用者用上耳机后 可提高老年者的听觉 同时可对青少年的学习和记忆能带来方便 一 工作原理 本电路由话筒 前置低放 功率放大电路和耳机等部分组成 原理电路图见图1 其印刷板电路图见图2 驻极体
  • c++面对对象基础知识

    一 类的定义格式 class calss name private data member declarations public member functions 二 构造函数 1 在程序声明对象时 将自动调用构造函数 2 c 提供两种构
  • 腾讯2017暑期实习生笔试题题解

    7个月没有刷题了 现在真的是菜到爆炸 所以来牛客水一水编程题 一 构造回文 题意 给定一个字符串s 你可以从中删除一些字符 使得剩下的串是一个回文串 如何删除才能使得回文串最长呢 输出需要删除的字符个数 输入描述 输入数据有多组 每组包含一
  • 获取配置文件中的属性

    spring boot的工程启动的时候 内部文件默认是加载classpath路径或者classpath config目录下的application properties文件的 当然也可以指定加载其它的配置文件 如何获取配置文件中的属性呢 实