springboot 配置文件读取的两种方式,以及使用到的注解解释

本文介绍了Spring Boot中如何读取核心配置文件application.properties和自定义配置文件detifalManager.properties的内容,包括使用@Value注解和Environment方式两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件的信息。

pom文件

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
    <!-- 单元测试使用 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot</artifactId>
      <version>1.5.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <version>1.5.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <version>1.5.6.RELEASE</version>
    </dependency>
  </dependencies>

 

Spring-Boot读取配置文件的方式:

一.读取核心配置文件信息application.properties的内容

     核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单。

核心配置文件application.properties内容如下:

test.msg=Hello World SpringBoot
test.name=test
test.password= 123test

方式一:使用@Value方式(常用)

package cn.ar.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * User: Jayden
 * Date: 2018/6/28
 * Time: 9:57
 */
@RestController
//@PropertiesSource("classpath:application.properties")
public class FirstController { @Value("${test.name}") private String name; @Value("${test.password}") private String password; @RequestMapping(value = "/test") public String say(){ return name+":application.propertoes里面的name值"+"/t"+password+"密码"; } }

注意:1.在@Value的${}中包含的是核心配置文件中的键名。在Controller类上加@RestController表示将此类中的所有视图都以JSON方式显示,类似于在视图方法上加@ResponseBody。

2.@PropertySource配置文件路径设置,在类上添加注解,如果在默认路径下可以不添加该注解 ,我这里就在默认路径下,所以上面没用这个注解。
如果有多及目录, 比如 classpath:config/my.properties指的是src/main/resources目录下config目录下的my.properties文件.

3.多配置文件引用,若取两个配置文件中有相同属性名的值,则取值为最后一个配置文件中的值:

比如:@PropertySource({"classpath:config/my.properties","classpath:config/config.properties"})

访问:http://localhost:8080/test时得到:"方式一:test:application.propertoes里面的name值/t123test密码"

 

方式二:使用Environment方式

package cn.ar.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * User: Jayden
 * Date: 2018/6/28
 * Time: 9:57
 */
@RestController
public class FirstController {
   /* @Value("${test.name}")
    private String  name;
    @Value("${test.password}")
    private String password;

    @RequestMapping(value = "/test")
    public String  say(){
        return name+":application.propertoes里面的name值"+"/t"+password+"密码";
    }*/
   @Autowired
   private Environment env;
    @RequestMapping(value = "/test")
    public String  say(){
        return env.getProperty("test.name") + "      " +env.getProperty("test.password");
    }


}

注意:这种方式是依赖注入Evnironment来完成,在创建的成员变量private Environment env上加上@Autowired注解即可完成依赖注入,然后使用env.getProperty("键名")即可读取出对应的值。

 

 

二.读取自定义配置文件信息,例如:detifalManager.properties

  1. 首先建立对象与配置文件映射关系
  2. 方法中使用自动注入方式,将对象注入,调用get方法获取属性值
  3. 注意:新版本的@ConfigurationProperties没有了location属性,使用@PropertySource来指定配置文件位置
  4. prefix=”user1”指的是配置文件中的前缀,如user1.name,在定义对象属性名时为private String name;
  5. 读取配置文件中的集合时,使用List来接收数据,但List必须先实例化,负责会报错

为了不破坏核心文件的原生态,但又需要有自定义的配置信息存在,一般情况下会选择自定义配置文件来放这些自定义信息,这里在resources目录下创建配置文件detifalManager.properties

resources/detifalManager.properties内容如下:

user1.name=admin11111111
user1.password=admin123qwqwq
user1.age= 15
user1.sex=男

 

创建管理配置的实体类:
package cn.ar.controller;


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

/**
 * Created with IntelliJ IDEA.
 * User: Jayden
 * Date: 2018/6/28
 * Time: 10:24
 */
@Component//加上注释@Component,可以直接在其他地方使用@Autowired来创建其实列对象
@ConfigurationProperties(prefix = "user1")//设置配置文件的前缀
@PropertySource("classpath:detifalManager.properties")//设置自定义文件的路径
public class Manager {
    private String name;
    private String password;
    private String sex;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

注意:
    在@ConfigurationProperties注释中有两个属性:
新版的springboot 没有这个属性:locations:指定配置文件的所在位置,可以使用@propertySource("classpath:****")指定
prefix:指定配置文件中键名称的前缀(我这里配置文件中所有键名都是以user1.开头)
    使用@Component是让该类能够在其他地方被依赖使用,即使用@Autowired注释来创建实例。

创建测试Controller

package cn.ar.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created with IntelliJ IDEA.
 * User: Jayden
 * Date: 2018/6/28
 * Time: 10:33
 */
@RestController
public class SecondController {
    @Autowired
    Manager manager;
    @RequestMapping("/test1")
    public String say(){
        return  "name"+ manager.getName() + "password" + manager.getPassword();
    }
}

注意:由于在manager类上加了注释@Component,所以可以直接在这里使用@Autowired来创建其实例对象。

访问:http://localhost:8080/test1时得到:"name admin11111111 password  admin123qwqwq"

 

 

 

转载于:https://www.cnblogs.com/laosunlaiye/p/9237937.html

### Spring Boot 读取配置文件方式总结 #### 方法一:`@Value` 注解 通过 `@Value` 注解可以方便地注入单个属性到类的字段中。这种方式适用于简单场景,尤其是只需要获取少量配置项的情况。例如,在 `application.properties` 或 `application.yml` 中定义如下配置: ```properties my.property=Hello, Spring Boot! ``` 或者使用 YAML 格式: ```yaml my: property: Hello, Spring Boot! ``` 可以在 Java 类中这样读取该配置: ```java @Component public class MyConfig { @Value("${my.property}") private String myProperty; public void printProperty() { System.out.println(myProperty); } } ``` 这种方法的优点在于实现简单,缺点是不支持复杂的数据结构绑定[^2]。 --- #### 方法二:`@ConfigurationProperties` 注解 当需要处理一组具有相同前缀的配置时,推荐使用 `@ConfigurationProperties` 注解。它允许将多个相关联的配置映射到一个 POJO 对象上。例如,假设存在以下配置: ```yaml my: app: name: MyApp version: 1.0.0 list: - item1 - item2 ``` 可以通过创建对应的实体类来绑定这些配置: ```java @ConfigurationProperties(prefix = "my.app") @Data // Lombok 自动生成 getter 和 setter public class AppConfig { private String name; private String version; private List<String> list; } ``` 接着将其注册为 Bean 并启用配置加载功能: ```java @Configuration @EnableConfigurationProperties(AppConfig.class) public class Configurer {} ``` 此方法的优势是可以轻松管理复杂的嵌套数据结构并提供类型安全的支持[^1]。 --- #### 方法三:`Environment` 接口 Spring 的 `Environment` 接口提供了另一种灵活的方式来访问应用上下文中所有的属性值。无论是在开发阶段还是生产环境中都可以利用这一机制动态调整行为逻辑。比如要获取某个特定键对应的内容可以直接调用其相应的方法: ```java @Autowired private Environment environment; public void printProperty() { String value = environment.getProperty("my.property"); System.out.println(value); } ``` 相比其他两种方式而言,虽然灵活性更高但也稍微显得不够直观简洁一些。 --- #### 方法四:`@PropertySource` 自定义资源位置 如果项目中有额外的需求需要用到外部自定义 `.properties` 文件而不是默认路径下提供的那些,则可通过声明 `@PropertySource` 来引入新的资源配置源。注意此时还需要配合 `@ComponentScan` 扫描包以及确保正确设置编码格式防止乱码等问题发生。 假设有这样一个名为 `custom-config.properties` 的文件位于项目的根目录之外的地方,并且里面包含了这样的条目: ```properties external.config=value-from-external-source ``` 那么我们就可以按照下面的样子编写代码去加载这个特殊的配置文档了: ```java @Configuration @PropertySource("file:/path/to/custom-config.properties") public class ExternalConfig { @Autowired private Environment env; public void displayExternalConfig() { System.out.println(env.getProperty("external.config")); } } ``` 这里需要注意的是,对于相对路径来说可能需要考虑不同操作系统之间的差异性;而对于绝对路径则可能会带来部署上的不便之处[^3]。 --- ### 总结表格对比 | **特性/方法** | **@Value** | **@ConfigurationProperties** | **Environment** | **@PropertySource** | |-----------------------|--------------------------|----------------------------------|---------------------------|------------------------------| | **适用范围** | 单独属性 | 复杂对象 | 动态运行期 | 非标准位置 | | **优点** | 实现简单 | 支持复杂数据 | 灵活 | 可导入外部文件 | | **局限性** | 不支持复杂结构 | 需要显式开启 | 较繁琐 | 路径依赖可能导致移植困难 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值