SpringBoot全局域名替换的实现

2025-09-04 13:50

本文主要是介绍SpringBoot全局域名替换的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一...

写一个 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: 8081

app:
  base-domain: https://api.example.com
  services:
    user: ${app.base-domain}/user
    order: ${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 baChina编程seDomain;
    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 AppPropepythonrties 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;

    @PostConstruct
    public 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 = DomainHol编程der.getBaseDomain(www.chinasem.cn) + "/order";

✅ 方案三:利用 Spring 的 Environment

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

@Autowired
private Environment env;

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

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

@Component
public class EnvUtils {
    private static Environment environment;

    @Autowired
    public 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 里就不用再注入了?

到此这篇关于SpringBoot全局域名替换的实现的文章就介绍到这了,更多相关SpringBoot全局域名替换内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于SpringBoot全局域名替换的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155902

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo