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