当前位置: 首页 > news >正文

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

文章目录

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

1.common-env-starter模块

1.目录结构

CleanShot 2025-01-10 at 20.38.24@2x

2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行,提前读取配置
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{@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {// 从 Spring 的配置中获取 sun-rays.env.pathString 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只是为了代码提示
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模块自动配置类
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 {/*** 自动配置成功日志*/@PostConstructpublic void logConfigSuccess() {log.info("EnvAutoConfiguration has been loaded successfully!");}
}
5.spring.factories 自动配置和注册EnvironmentPostProcessor
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunxiansheng.env.config.EnvAutoConfiguration
org.springframework.boot.env.EnvironmentPostProcessor=\
com.sunxiansheng.env.processor.DotenvEnvironmentPostProcessor
6.pom.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.目录结构

CleanShot 2025-01-10 at 21.03.43@2x

2.pom.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 配置测试的数据
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
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;@PostConstructpublic void init() {// 测试读取log.info("test={}", test);}
}
5.EnvApplication.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.测试

CleanShot 2025-01-10 at 21.07.43@2x

CleanShot 2025-01-10 at 21.07.53@2x

相关文章:

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

文章目录 1.common-env-starter模块1.目录结构2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行&#xff0c;提前读取配置3.EnvProperties.java 这里的path只是为了代码提示4.EnvAutoConfiguration.java Env模块自动配置类5.spring.factories 自动配置和注册Enviro…...

Go反射指南

概念&#xff1a; 官方对此有个非常简明的介绍&#xff0c;两句话耐人寻味&#xff1a; 反射提供一种让程序检查自身结构的能力反射是困惑的源泉 第1条&#xff0c;再精确点的描述是“反射是一种检查interface变量的底层类型和值的机制”。 第2条&#xff0c;很有喜感的自嘲…...

Fullcalendar @fullcalendar/react 样式错乱丢失问题和导致页面卡顿崩溃问题

问题描述&#xff1a; 我使用 fullcalendar的react版本时&#xff0c;出现了一个诡异的问题&#xff0c;当我切换到 一个iframe页面时&#xff08;整个页面是一个iframe嵌入的&#xff09;&#xff0c;再切换回来日历的样式丢失了&#xff01;不仅丢失了样式还导致页面崩溃了&…...

【电工基础】4.低压电器元件,漏电保护器,熔断器,中间继电器

一。漏电保护器 1.使用区域 我们在家用总开关上使用空气开关&#xff08;断路器&#xff09;&#xff0c;其余的厨房卧室为漏电保护器。 2.漏电保护器的简介 1.漏电:就是流入的电流和流出的电流不等&#xff0c;意味着电路回路中还有其它分支&#xff0c;可能是电流通过人体进…...

有限元分析学习——Anasys Workbanch第一阶段笔记梳理

第一阶段笔记主要源自于哔哩哔哩《ANSYS-workbench 有限元分析应用基础教程》 张晔 主要内容导图&#xff1a; 笔记导航如下&#xff1a; Anasys Workbanch第一阶段笔记(1)基本信息与结果解读_有限元分析变形比例-CSDN博客 Anasys Workbanch第一阶段笔记(2)网格单元与应力奇…...

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…...

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事&#xff0c;于是研究起深度学习开发工具链的配置和安装&#xff0c;之前欲与天公试比高&#xff0c;尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境&#xff0c;最后惨败&#xff0c;沦为笑柄&#xff0c;痛定思痛&#xff0c;这次直接和…...

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…...

【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用

论文信息 标题: VOLO: Vision Outlooker for Visual Recognition作者: Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, Shuicheng Yan代码链接: https://github.com/sail-sg/volo论文链接: https://arxiv.org/pdf/2106.13112 创新点 前景注意力机制: VOLO引入了一种称为“…...

网络攻防实战指北专栏讲解大纲与网络安全法

专栏 本专栏为网络攻防实战指北&#xff0c;大纲如下所示 进度&#xff1a;目前已更完准备篇、HTML基础 计划&#xff1a;所谓基础不牢&#xff0c;地动山摇。所以下一步将持续更新基础篇内容 讲解信息安全时&#xff0c;结合《中华人民共和国网络安全法》&#xff08;以下简…...

【已解决】windows7虚拟机安装VMtools频繁报错

为了在虚拟机VMware中安装win7&#xff0c;题主先在网上下载了windows7 professional版本的镜像&#xff0c;在vmware中安装vmtools时报错&#xff0c;信息如下 &#xff08;安装程序无法继续&#xff0c;本程序需要您将此虚拟机上安装的操作系统更新到SP1&#xff09; 然后就…...

蓝桥杯模拟算法:多项式输出

P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题&#xff0c;我们需要分情况讨论&#xff0c;我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…...

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4&#xff1a;习题5&#xff1a; 知识点 C的STL提供已经封装好的容器vector&#xff0c;也可叫做可变长的数组&#xff0c;vector底层就是自动扩容的顺序表&#xff0c;其中的增删查改已经封装好 创建 const int N30; vecto…...

知识管理平台在数字经济时代推动企业智慧决策与知识赋能的路径分析

内容概要 在数字经济时代&#xff0c;知识管理平台被视为企业智慧决策与知识赋能的关键工具。其核心作用在于通过高效地整合、存储和分发企业内部的知识资源&#xff0c;促进信息的透明化与便捷化&#xff0c;使得决策者能够在瞬息万变的市场环境中迅速获取所需信息。这不仅提…...

IT服务管理平台(ITSM):构建高效运维体系的基石

IT服务管理平台(ITSM):构建高效运维体系的基石 在数字化转型浪潮的推动下,企业对IT服务的依赖日益加深,如何高效管理和优化IT服务成为企业面临的重要课题。IT服务管理平台(ITSM)应运而生,以其系统化的管理方法和工具,助力企业实现IT服务的规范化、高效化和智能化。本…...

[EAI-026] DeepSeek-VL2 技术报告解读

Paper Card 论文标题&#xff1a;DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding 论文作者&#xff1a;Zhiyu Wu, Xiaokang Chen, Zizheng Pan, Xingchao Liu, Wen Liu, Damai Dai, Huazuo Gao, Yiyang Ma, Chengyue Wu, Bin…...

深度学习:基于MindNLP的RAG应用开发

什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的技术&#xff0c;旨在提升大语言模型&#xff08;LLM&#xff09;生…...

【C语言】static关键字的三种用法

【C语言】static关键字的三种用法 C语言中的static关键字是一个存储类说明符&#xff0c;它可以用来修饰变量和函数。static关键字的主要作用是控制变量或函数的生命周期和可见性。以下是static关键字的一些主要用法和含义&#xff1a; 局部静态变量&#xff1a; 当static修饰…...

STM32 PWMI模式测频率占空比

接线图&#xff1a; PWMI基本结构 代码配置&#xff1a; 与上一章输入捕获代码一样&#xff0c;根据结构体&#xff0c;需要在输入捕获单元再配置一个通道。我们调用一个函数 这个函数可以给结构体赋值&#xff0c;当我们定义了一遍结构体参数&#xff0c;再调用这个函数&…...

神经网络|(四)概率论基础知识-古典概型

【1】引言 前序学习了线性回归的基础知识&#xff0c;了解到最小二乘法可以做线性回归分析&#xff0c;但为何最小二乘法如此准确&#xff0c;这需要从概率论的角度给出依据。 因此从本文起&#xff0c;需要花一段时间来回顾概率论的基础知识。 【2】古典概型 古典概型是我…...

深入浅出:用Grad-CAM解锁Swin Transformer的视觉注意力

1. 为什么需要理解Swin Transformer的视觉注意力&#xff1f; 当你第一次看到Swin Transformer在图像分类任务中表现出色时&#xff0c;可能会好奇它到底"看"到了图像的哪些部分。传统的卷积神经网络&#xff08;CNN&#xff09;通过局部感受野逐步提取特征&#xff…...

【RK3588开发】SPI回环

SPI回环 &#xff08;1&#xff09;内核SPI子系统使能 修改内核配置需要先加载默认配置&#xff0c;然后图形界面修改后需保存配置在以下目录下勾选图中的选项&#xff1a; **>**Device Drivers —> ​ ->[*] SPI support —>至少勾选以下选项&#xff1a; Rockchi…...

OctoSuite代码审查:深入理解GitHub数据模型设计的5个关键要点

OctoSuite代码审查&#xff1a;深入理解GitHub数据模型设计的5个关键要点 【免费下载链接】octosuite Terminal-based toolkit for GitHub data analysis. 项目地址: https://gitcode.com/gh_mirrors/oc/octosuite OctoSuite是一个强大的终端GitHub数据分析工具包&#…...

Next.js全栈开发模板:PostgreSQL+NextAuth+Tailwind一站式解决方案

1. 项目概述&#xff1a;一个现代化的全栈开发起点如果你最近在寻找一个能快速启动全栈Web应用开发的模板&#xff0c;那么由Vercel官方维护的这个“Next.js Postgres NextAuth Tailwind CSS”模板&#xff0c;很可能就是你一直在找的那个“瑞士军刀”。这不仅仅是一个简单的…...

抖音去水印免费版哪个好用?2026实测推荐与软件对比

抖音去水印免费版哪个好用&#xff1f;2026实测推荐与软件对比 刷到一条有意思的视频想保存下来发给朋友&#xff0c;下载后却发现左上角顶着一串"用户名"水印&#xff1b;好不容易找到一段适合做素材的内容&#xff0c;画面边缘那行字怎么裁都裁不干净。这几乎是每个…...

3分钟搞定:Axure RP中文语言包完整安装指南

3分钟搞定&#xff1a;Axure RP中文语言包完整安装指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面…...

Loop:三步快速配置,让你的Mac窗口管理效率提升300%

Loop&#xff1a;三步快速配置&#xff0c;让你的Mac窗口管理效率提升300% 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 你是否经常在多个应用窗口间来回切换&#xff0c;感觉自己像个杂技演员&#…...

WarcraftHelper技术解析:魔兽争霸3兼容性修复实践指南

WarcraftHelper技术解析&#xff1a;魔兽争霸3兼容性修复实践指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper作为一款面向魔兽争霸…...

OpenCode 对接实践:从独立进程到共享 Runtime 的架构演进

OpenCode 对接实践&#xff1a;从独立进程到共享 Runtime 的架构演进本文分享 HagiCode 集成 OpenCode AI 助手的完整实践&#xff0c;包括架构演进过程中的关键设计决策、遇到的坑以及最终解决方案。背景OpenCode 是一个开源的 AI 编码助手项目&#xff0c;托管在 GitHub 上。…...

Awesome-AITools:AI开发者必备的开源工具聚合地图

1. 项目概述&#xff1a;一份AI工具的“藏宝图”如果你是一名AI开发者、研究者&#xff0c;或者只是一个对AI工具充满好奇的探索者&#xff0c;那么你肯定经历过这样的时刻&#xff1a;面对网络上浩如烟海的AI工具&#xff0c;从聊天机器人、代码助手到图像生成、模型训练平台&…...