Java实现.env文件读取敏感数据

文章目录

    • 1.common-env-starter模块
        • 1.目录结构
        • [2.DotenvEnvironmentPostProcessor.java 在{xxx}解析之前执行,提前读取配置](#2.DotenvEnvironmentPostProcessor.java 在{xxx}解析之前执行,提前读取配置)
        • [3.EnvProperties.java 这里的path只是为了代码提示](#3.EnvProperties.java 这里的path只是为了代码提示)
        • [4.EnvAutoConfiguration.java Env模块自动配置类](#4.EnvAutoConfiguration.java Env模块自动配置类)
        • [5.spring.factories 自动配置和注册EnvironmentPostProcessor](#5.spring.factories 自动配置和注册EnvironmentPostProcessor)
        • 6.pom.xml
    • 2.common-env-starter-demo模块

1.common-env-starter模块

1.目录结构
2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行,提前读取配置
java 复制代码
package com.sunxiansheng.env.processor;

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

/**
 * Description: 在${xxx}解析之前执行,可以读取xxx,设置到环境中,在后续的解析时就会进行替换了
 *
 * @Author sun
 * @Create 2025/1/10 19:40
 * @Version 1.0
 */
public class DotenvEnvironmentPostProcessor implements EnvironmentPostProcessor{

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        // 从 Spring 的配置中获取 sun-rays.env.path
        String dotenvPath = environment.getProperty("sun-rays.env.path");

        if (dotenvPath != null) {
            // 加载 .env 文件
            Dotenv dotenv = Dotenv.configure()
                    .directory(dotenvPath)
                    .filename(".env")
                    .load();

            // 将 .env 中的值注入到系统属性中,确保占位符解析时可用
            dotenv.entries().forEach(entry ->
                    environment.getSystemProperties().put(entry.getKey(), entry.getValue())
            );

            System.out.println("Loaded .env from path: " + dotenvPath);
        } else {
            System.err.println("sun-rays.env.path not configured!");
        }
    }
}
3.EnvProperties.java 这里的path只是为了代码提示
java 复制代码
package com.sunxiansheng.env.config.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * Description: 这里的path只是为了代码提示,实际上DotenvEnvironmentPostProcessor.java不从这里获取配置
 *
 * @Author sun
 * @Create 2025/1/10 20:04
 * @Version 1.0
 */
@ConfigurationProperties(prefix = "sun-rays.env")
@Data
public class EnvProperties {

    /**
     * .env文件的绝对路径
     */
    private String path;
}
4.EnvAutoConfiguration.java Env模块自动配置类
java 复制代码
package com.sunxiansheng.env.config;

import com.sunxiansheng.env.config.properties.EnvProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * Description: Env模块自动配置类
 *
 * @Author sun
 * @Create 2025/1/10 19:57
 * @Version 1.0
 */
@Configuration
@EnableConfigurationProperties({EnvProperties.class}) // 启用配置类
@Slf4j
public class EnvAutoConfiguration {

    /**
     * 自动配置成功日志
     */
    @PostConstruct
    public void logConfigSuccess() {
        log.info("EnvAutoConfiguration has been loaded successfully!");
    }
}
5.spring.factories 自动配置和注册EnvironmentPostProcessor
java 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunxiansheng.env.config.EnvAutoConfiguration
org.springframework.boot.env.EnvironmentPostProcessor=\
com.sunxiansheng.env.processor.DotenvEnvironmentPostProcessor
6.pom.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.sunxiansheng</groupId>
        <artifactId>sunrays-common</artifactId>
        <version>2.0.0</version>
    </parent>

    <artifactId>common-env-starter</artifactId>

    <dependencies>
        <!-- 可以使用.env文件提前加载配置,确保数据安全 -->
        <dependency>
            <groupId>io.github.cdimascio</groupId>
            <artifactId>java-dotenv</artifactId>
        </dependency>
    </dependencies>
</project>

2.common-env-starter-demo模块

1.目录结构
2.pom.xml
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.sunxiansheng</groupId>
        <artifactId>sunrays-common-demo</artifactId>
        <version>2.0.0</version>
    </parent>

    <artifactId>common-env-starter-demo</artifactId>

    <dependencies>
        <!-- common-env-starter -->
        <dependency>
            <groupId>com.sunxiansheng</groupId>
            <artifactId>common-env-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>
</project>
3.application.yml 配置测试的数据
yaml 复制代码
sun-rays:
  log4j2:
    home: /Users/sunxiansheng/IdeaProjects/sunrays-framework/sunrays-common-demo/common-env-starter-demo/logs # 日志根目录(默认./logs)
    module: sunrays-common-demo/common-env-starter-demo # 模块根目录从仓库根目录开始(默认defaultModule)
  env:
    path: /Users/sunxiansheng/IdeaProjects/sunrays-framework/sunrays-common-demo/common-env-starter-demo # .env文件的绝对路径
env:
  test: ${ENV_TEST}
4.EnvConfig.java
java 复制代码
package com.sunxiansheng.env.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * Description: Env配置类,测试读取数据
 *
 * @Author sun
 * @Create 2025/1/10 20:55
 * @Version 1.0
 */
@Configuration
@Slf4j
public class EnvConfig {

    @Value("${env.test}")
    private String test;

    @PostConstruct
    public void init() {
        // 测试读取
        log.info("test={}", test);
    }
}
5.EnvApplication.java 启动类
java 复制代码
package com.sunxiansheng.env;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Description: Env
 *
 * @Author sun
 * @Create 2025/1/10 20:53
 * @Version 1.0
 */
@SpringBootApplication
public class EnvApplication {

    public static void main(String[] args) {
        SpringApplication.run(EnvApplication.class, args);
    }
}
6.测试
相关推荐
我真的是大笨蛋3 小时前
K8S-Pod(下)
java·笔记·云原生·容器·kubernetes
碳水加碳水3 小时前
Java代码审计实战:XML外部实体注入(XXE)深度解析
java·安全·web安全·代码审计
努力也学不会java4 小时前
【设计模式】 原型模式
java·设计模式·原型模式
方渐鸿5 小时前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署
学亮编程手记5 小时前
K8S v1.33 版本主要新特性介绍
java·容器·kubernetes
Haven-6 小时前
Java-面试八股文-JVM篇
java·jvm·面试
我真的是大笨蛋6 小时前
JVM调优总结
java·jvm·数据库·redis·缓存·性能优化·系统架构
wjs0406 小时前
Git常用的命令
java·git·gitlab
superlls7 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
honder试试7 小时前
焊接自动化测试平台图像处理分析-模型训练推理
开发语言·python