springboot项目中读取.env文件参数值的两种主流实现方式

 更新时间:2025年12月25日 08:29:40   作者:ppo_wu  
在Spring Boot项目中,.env文件并非Spring Boot原生支持的配置格式,但可以通过第三方库或自定义读取逻辑来加载.env文件中的参数,下面我们就来看看具体实现方法吧

在Spring Boot项目中,.env文件 并非Spring Boot原生支持的配置格式(Spring Boot默认支持application.properties/application.yml),但可以通过第三方库(如dotenv-java)或自定义读取逻辑来加载.env文件中的参数,并让Spring Boot识别这些参数。

以下是两种主流实现方式,推荐使用dotenv-java(简洁、适配性强)。

方式一:使用dotenv-java库(推荐)

dotenv-java是专门用于加载.env文件的Java库,能将.env中的配置加载到JVM的系统环境变量或Spring的环境变量中,让Spring Boot可以通过@ValueEnvironment等方式读取。

步骤1:添加依赖

pom.xml(Maven)或build.gradle(Gradle)中引入dotenv-java依赖:

Maven

<dependency>
    <groupId>io.github.cdimascio</groupId>
    <artifactId>dotenv-java</artifactId>
    <version>3.0.0</version> <!-- 推荐使用最新版本 -->
</dependency>

Gradle

implementation 'io.github.cdimascio:dotenv-java:3.0.0'

步骤2:创建.env文件

在项目的根目录(或src/main/resources目录)下创建.env文件,写入配置参数:

# .env文件内容
DB_URL=jdbc:mysql://localhost:3306/mydb
DB_USERNAME=root
DB_PASSWORD=123456
APP_NAME=my-spring-boot-app

步骤3:加载.env文件(两种方式)

在启动类中手动加载(简单)

在Spring Boot启动类中,通过Dotenv.load()加载.env文件,并将配置设置到系统环境变量中(Spring Boot会优先读取系统环境变量)。

import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EnvDemoApplication {

    public static void main(String[] args) {
        // 加载.env文件(默认读取项目根目录的.env)
        Dotenv dotenv = Dotenv.load();
        // 将.env中的配置设置到系统环境变量(可选,也可直接通过dotenv.get()获取)
        dotenv.entries().forEach(entry -> System.setProperty(entry.getKey(), entry.getValue()));

        SpringApplication.run(EnvDemoApplication.class, args);
    }
}

自定义EnvironmentPostProcessor(更优雅,推荐)

通过Spring的EnvironmentPostProcessor扩展点,在Spring Boot启动时自动加载.env文件,将配置注入到Spring的环境中(无需手动设置系统变量)。

创建自定义的EnvironmentPostProcessor实现类:

import io.github.cdimascio.dotenv.Dotenv;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.io.ClassPathResource;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class DotenvEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        // 方式1:读取项目根目录的.env
        Dotenv dotenv = Dotenv.load();

        // 方式2:读取src/main/resources下的.env(推荐,打包后可包含在jar中)
        // Dotenv dotenv = Dotenv.configure().directory(new ClassPathResource("").getPath()).load();

        // 将.env中的配置转换为MapPropertySource,注入到Spring环境中
        Map<String, Object> envMap = new HashMap<>();
        dotenv.entries().forEach(entry -> envMap.put(entry.getKey(), entry.getValue()));
        environment.getPropertySources().addFirst(new MapPropertySource("dotenv", envMap));
    }
}

注册自定义的EnvironmentPostProcessor:在src/main/resources/META-INF目录下创建spring.factories文件,内容如下:

org.springframework.boot.env.EnvironmentPostProcessor=com.example.demo.DotenvEnvironmentPostProcessor

步骤4:读取.env中的参数

通过@ValueEnvironment@ConfigurationProperties等方式读取参数:

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

import javax.annotation.Resource;

@RestController
public class EnvController {

    // 方式1:使用@Value注解
    @Value("${DB_URL}")
    private String dbUrl;

    @Value("${APP_NAME}")
    private String appName;

    // 方式2:使用Environment对象
    @Resource
    private Environment environment;

    @GetMapping("/env")
    public String getEnv() {
        String dbUsername = environment.getProperty("DB_USERNAME");
        String dbPassword = environment.getProperty("DB_PASSWORD");
        return "dbUrl: " + dbUrl + "<br/>" +
                "appName: " + appName + "<br/>" +
                "dbUsername: " + dbUsername + "<br/>" +
                "dbPassword: " + dbPassword;
    }
}

方式二:自定义读取逻辑(不依赖第三方库)

如果不想引入第三方库,可以通过Java的IO流读取.env文件,解析内容后注入到Spring环境中。

步骤1:编写读取.env的工具类

import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.util.ResourceUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class EnvReader {

    public static void loadEnv(ConfigurableEnvironment environment) {
        Properties properties = new Properties();
        Map<String, Object> envMap = new HashMap<>();

        try {
            // 读取src/main/resources下的.env文件(也可读取项目根目录的.env)
            FileInputStream inputStream = new FileInputStream(ResourceUtils.getFile("classpath:.env"));
            properties.load(inputStream);

            // 解析Properties到Map
            properties.forEach((key, value) -> envMap.put(key.toString(), value.toString()));

            // 注入到Spring环境中(优先级最高)
            environment.getPropertySources().addFirst(new MapPropertySource("customEnv", envMap));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

步骤2:在启动类中加载.env

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.ConfigurableEnvironment;

@SpringBootApplication
public class EnvDemoApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(EnvDemoApplication.class);
        // 启动前加载.env
        application.addInitializers(context -> {
            ConfigurableEnvironment environment = context.getEnvironment();
            EnvReader.loadEnv(environment);
        });
        application.run(args);
    }
}

步骤3:读取参数(同方式一)

通过@ValueEnvironment读取参数即可。

注意事项

.env文件的位置

  • 若放在项目根目录,开发环境下可直接读取,但打包成jar后,根目录的.env不会被包含在jar中,需手动放在jar同级目录。
  • 若放在src/main/resources目录,打包后会被包含在jar中,推荐此方式。

配置优先级:Spring Boot的配置优先级为:系统环境变量 > 命令行参数 > .env文件 > application.properties/yml(可通过addFirst/addLast调整.env的优先级)。

敏感信息.env文件不要提交到版本控制系统(如Git),需在.gitignore中添加.env规则,避免敏感信息泄露。

多环境配置:可通过Dotenv.configure().filename(".env.dev")加载不同环境的.env文件(如.env.dev.env.prod)。

到此这篇关于springboot项目中读取.env文件参数值的两种主流实现方式的文章就介绍到这了,更多相关springboot读取.env参数值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现的properties文件动态修改并自动保存工具类

    Java实现的properties文件动态修改并自动保存工具类

    这篇文章主要介绍了Java实现的properties文件动态修改并自动保存工具类,可实现针对properties配置文件的相关修改与保存功能,需要的朋友可以参考下
    2017-11-11
  • 详解Java中的增强 for 循环 foreach

    详解Java中的增强 for 循环 foreach

    foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理。能够提高性能,并减少代码出错的几率。
    2017-05-05
  • Lombok中@EqualsAndHashCode注解的使用及说明

    Lombok中@EqualsAndHashCode注解的使用及说明

    这篇文章主要介绍了Lombok中@EqualsAndHashCode注解的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot整合接口管理工具Swagger

    SpringBoot整合接口管理工具Swagger

    ​ Swagger是一系列 RESTful API的工具,通过Swagger可以获得项目的⼀种交互式文档,客户端SDK的自动生成等功能。本文通过代码示例详细介绍了SpringBoot整合接口管理工具Swagger,需要的朋友可以借鉴参考
    2023-04-04
  • SpringBoot项目开发中常用的依赖

    SpringBoot项目开发中常用的依赖

    这篇文章主要介绍了SpringBoot项目开发中常用的依赖详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java中验证 Mybatis 数据分片可以减轻GC压力的操作方法

    Java中验证 Mybatis 数据分片可以减轻GC压力的操作方法

    这篇文章主要介绍了Java中验证 Mybatis 数据分片可以减轻GC压力的操作方法,本文使用 Spock(可集成Spring Boot项目) 编写测试用例,基于 Groovy (JVM语言),感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Spring Cloud使用Feign实现Form表单提交的示例

    Spring Cloud使用Feign实现Form表单提交的示例

    本篇文章主要介绍了Spring Cloud使用Feign实现Form表单提交的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java 的ArrayList集合底层实现与最佳实践

    Java 的ArrayList集合底层实现与最佳实践

    本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、特殊场景与常见问题、性能优化与最佳实践以及与LinkedList的对比,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • Java中实现定时任务执行的几种常见方式总结

    Java中实现定时任务执行的几种常见方式总结

    几乎在所有的项目中,定时任务的使用都是不可或缺的,如果使用不当甚至会造成资损,这篇文章主要总结介绍了Java中实现定时任务执行的几种常见方式,需要的朋友可以参考下
    2025-09-09
  • Java内部类的使用教程详解

    Java内部类的使用教程详解

    在Java中,有些类可以被定义在另一个类的内部,我们把在一个类里面定义的类称为内部类。本文主要介绍了Java内部类的使用,需要的可以参考一下
    2023-04-04

最新评论