springboot读取配置文件的几种方式
时间: 2025-03-19 07:17:45 浏览: 65
### 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** |
|-----------------------|--------------------------|----------------------------------|---------------------------|------------------------------|
| **适用范围** | 单独属性 | 复杂对象 | 动态运行期 | 非标准位置 |
| **优点** | 实现简单 | 支持复杂数据 | 灵活 | 可导入外部文件 |
| **局限性** | 不支持复杂结构 | 需要显式开启 | 较繁琐 | 路径依赖可能导致移植困难 |
---
阅读全文
相关推荐


















