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

【Java后端】Spring Boot 全局域名替换

写一个 Spring Boot 全局域名替换 Demo,可以直接跑起来验证。


📂 项目结构

springboot-global-domain-demo├── src/main/java/com/example/demo│    ├── DemoApplication.java│    ├── config/AppProperties.java│    └── controller/TestController.java└── src/main/resources└── application.yml

⚙️ 配置文件 application.yml

server:port: 8081app:base-domain: https://api.example.comservices:user: ${app.base-domain}/userorder: ${app.base-domain}/order

🛠️ 配置类 AppProperties.java

package com.example.demo.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.Map;@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String baseDomain;private Map<String, String> services;public String getBaseDomain() {return baseDomain;}public void setBaseDomain(String baseDomain) {this.baseDomain = baseDomain;}public Map<String, String> getServices() {return services;}public void setServices(Map<String, String> services) {this.services = services;}
}

🌐 控制器 TestController.java

package com.example.demo.controller;import com.example.demo.config.AppProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {private final AppProperties appProperties;public TestController(AppProperties appProperties) {this.appProperties = appProperties;}@GetMapping("/test")public String test() {String userUrl = appProperties.getServices().get("user");String orderUrl = appProperties.getServices().get("order");return "User API: " + userUrl + " | Order API: " + orderUrl;}
}

🚀 启动类 DemoApplication.java

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

🔍 运行结果

启动应用后访问:

http://localhost:8081/test

返回结果:

User API: https://api.example.com/user | Order API: https://api.example.com/order

这样你只需要在 application.yml 改一处:

app.base-domain=https://api.newdomain.com

所有地方就会自动替换。


那么问题来了?现在这样使用的话,全局每个Controller类里都需要注入这个AppProperties,不优雅。

如果每个 Controller 都要用 AppProperties,那就意味着每个类都要注入一遍。这样虽然符合 Spring 的依赖注入设计,但确实会有点麻烦。

有几种 只需要注入一次,全局就能用 的做法👇:


✅ 方案一:静态常量 + @PostConstruct

AppProperties 初始化时,把值放到静态变量里,所有类直接静态调用。

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String baseDomain;public String getBaseDomain() {return baseDomain;}public void setBaseDomain(String baseDomain) {this.baseDomain = baseDomain;}// 静态变量,供全局调用public static String BASE_DOMAIN;@PostConstructpublic void init() {BASE_DOMAIN = baseDomain;}
}

使用:

String url = AppProperties.BASE_DOMAIN + "/user";

👉 好处:所有类都能直接访问,不需要注入。
👉 缺点:静态变量属于硬编码,测试/Mock 不方便。


✅ 方案二:封装成工具类(推荐一点)

新建一个工具类,注入一次配置,然后全局静态访问。

@Component
public class DomainHolder {private static String baseDomain;@Value("${app.base-domain}")public void setBaseDomain(String baseDomain) {DomainHolder.baseDomain = baseDomain;}public static String getBaseDomain() {return baseDomain;}
}

使用:

String url = DomainHolder.getBaseDomain() + "/order";

✅ 方案三:利用 Spring 的 Environment

Spring Boot 本身有个 Environment,可以随时取配置:

@Autowired
private Environment env;public void test() {String baseDomain = env.getProperty("app.base-domain");System.out.println(baseDomain);
}

如果不想每个地方都注入,可以同样封装成静态工具类:

@Component
public class EnvUtils {private static Environment environment;@Autowiredpublic void setEnvironment(Environment env) {EnvUtils.environment = env;}public static String get(String key) {return environment.getProperty(key);}
}

使用:

String url = EnvUtils.get("app.base-domain") + "/user";

⚡ 总结

  • 如果配置只在少量地方用:直接注入 AppProperties 更优雅。
  • 如果几乎所有 Controller 都要用:推荐 方案二(DomainHolder 工具类),写法简洁,还支持占位符。
  • 如果想最大灵活:用 Environment 封装成工具类。

要不要我帮你写一个 方案二的完整 Demo,这样所有 Controller 里就不用再注入了?

http://www.dtcms.com/a/360837.html

相关文章:

  • Azure AI Search构建RAG的优化点
  • 接口自动化测试之设置断言思路
  • 大模型应用开发面试实录:LLM原理、RAG工程与多Agent场景化落地解析
  • mysql实例是什么?
  • 产品月报|睿本云8月产品功能迭代
  • Topaz Video AI:AI驱动的视频增强与修复工具
  • 嵌入式实时操作系统(二十五)-实时性
  • 从 “能用” 到 “好用”:生成式 AI 落地三大核心痛点与破局路径
  • nt5inf.hash排序后前后两个共五个和nti5nf.cat文件用asn.1editor打开后导出后部分内容的对比--重要
  • Unity中多线程与高并发下的单例模式
  • 结构体成员大小及内存对齐练习
  • Electron使用WebAssembly实现CRC-16 CCITT校验
  • 9.1C++——类中特殊的成员函数
  • 安卓悬浮球-3566-测试报告
  • vue社区网格化管理系统(代码+数据库+LW)
  • Adobe Acrobat打开pdf文件时闪退如何解决?
  • OpenCV-CUDA 图像处理
  • 论文阅读_TradingAgents多智能体金融交易框架
  • .net 微服务jeager链路跟踪
  • C++11 ——— lambda表达式
  • LeetCode 19: 删除链表的倒数第 N 个结点
  • GIT(了解)
  • 计算机网络---https(超文本传输安全协议)
  • Unity项目基本风格/规范
  • 三、SVN实践练习指南
  • 【项目思维】贪吃蛇(嵌入式进阶方向)
  • 函数、数组与 grep + 正则表达式的 Linux Shell 编程进阶指南
  • GPU 通用手册:裸机、Docker、K8s 环境实战宝典
  • 嵌入式碎片知识总结(二)
  • Shell编程(二):正则表达式