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新特性中Preview功能如何运行调试详解

    Java新特性中Preview功能如何运行调试详解

    这篇文章主要为大家介绍了Java新特性中Preview功能如何运行调试详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java使用Sftp和Ftp实现对文件的上传和下载

    Java使用Sftp和Ftp实现对文件的上传和下载

    这篇文章主要介绍了Java使用Sftp和Ftp实现对文件的上传和下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • springboot项目中实现访问druid内置监控页面

    springboot项目中实现访问druid内置监控页面

    这篇文章主要介绍了springboot项目中实现访问druid内置监控页面的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java线程安全问题小结_动力节点Java学院整理

    Java线程安全问题小结_动力节点Java学院整理

    这篇文章主要介绍了Java线程安全问题小结的相关资料,需要的朋友可以参考下
    2017-05-05
  • 基于Java swing组件实现简易计算器

    基于Java swing组件实现简易计算器

    这篇文章主要介绍了基于Java swing组件实现简易计算器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 浅析JAVA Lock锁原理

    浅析JAVA Lock锁原理

    这篇文章主要介绍了JAVA Lock锁原理的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 详解Java编程规约(命名风格、常量定义、代码格式)

    详解Java编程规约(命名风格、常量定义、代码格式)

    这篇文章主要介绍了详解Java编程规约(命名风格、常量定义、代码格式),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-10-10
  • 教你如何用好 Java 中的枚举

    教你如何用好 Java 中的枚举

    在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式。下面小编将为大家详细介绍
    2021-09-09
  • java贪吃蛇游戏编写代码

    java贪吃蛇游戏编写代码

    这篇文章主要为大家详细介绍了java贪吃蛇游戏的编写代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 解决java junit单元测试@Test报错的问题

    解决java junit单元测试@Test报错的问题

    今天小编就为大家分享一篇解决java junit单元测试@Test报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11

最新评论