SpringBoot全局域名替换的实现

 更新时间:2025年09月02日 08:17:46   作者:柯南二号  
本文主要介绍了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 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;

    @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 = 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;

    @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全局域名替换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot项目同时传递参数和文件的多种方式代码演示

    spring boot项目同时传递参数和文件的多种方式代码演示

    这篇文章主要介绍了spring boot项目同时传递参数和文件的多种方式,在开发接口中,遇到了需要同时接收参数和文件的情况,可以有多种方式实现文件+参数的接收,这里基于spring boot 3 + vue 3 + axios,做一个简单的代码演示,需要的朋友可以参考下
    2023-06-06
  • Mybatis中 mapper-locations和@MapperScan的作用

    Mybatis中 mapper-locations和@MapperScan的作用

    这篇文章主要介绍了Mybatis中 mapper-locations和@MapperScan的作用,mybatis.mapper-locations在SpringBoot配置文件中使用,作用是扫描Mapper接口对应的XML文件,需要的朋友可以参考下
    2023-05-05
  • Java反射及性能详细

    Java反射及性能详细

    这篇文章主要介绍了Java反射及性能,现如今的java工程中,反射的使用无处无在。无论是设计模式中的代理模式,还是红透半边天的Spring框架中的IOC,AOP等等,都存在大量反射的影子。下面我们就对该话题进行详细介绍,感兴趣的小伙伴可以参考一下
    2021-10-10
  • jdk中keytool的使用以及如何提取jks文件中的公钥和私钥

    jdk中keytool的使用以及如何提取jks文件中的公钥和私钥

    JKS文件由公钥和密钥构成利用Java Keytool工具生成的文件,它是由公钥和密钥构成的,下面这篇文章主要给大家介绍了关于jdk中keytool的使用以及如何提取jks文件中公钥和私钥的相关资料,需要的朋友可以参考下
    2024-03-03
  • java基于UDP实现图片群发功能

    java基于UDP实现图片群发功能

    这篇文章主要为大家详细介绍了java基于UDP实现图片群发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • ConstraintValidator类如何实现自定义注解校验前端传参

    ConstraintValidator类如何实现自定义注解校验前端传参

    这篇文章主要介绍了ConstraintValidator类实现自定义注解校验前端传参的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java ResultSet案例讲解

    Java ResultSet案例讲解

    这篇文章主要介绍了Java ResultSet案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java设计模式之命令模式CommandPattern详解

    Java设计模式之命令模式CommandPattern详解

    这篇文章主要介绍了Java设计模式之命令模式CommandPattern详解,命令模式是把一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作,需要的朋友可以参考下
    2023-10-10
  • redis incr和incrBy的使用说明

    redis incr和incrBy的使用说明

    这篇文章主要介绍了redis incr和incrBy的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • java中的类URL与URLConnection使用介绍

    java中的类URL与URLConnection使用介绍

    这篇文章主要为大家介绍了java中的类URL与URLConnection使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论