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 3 + vue 3 + axios,做一个简单的代码演示,需要的朋友可以参考下2023-06-06
Mybatis中 mapper-locations和@MapperScan的作用
这篇文章主要介绍了Mybatis中 mapper-locations和@MapperScan的作用,mybatis.mapper-locations在SpringBoot配置文件中使用,作用是扫描Mapper接口对应的XML文件,需要的朋友可以参考下2023-05-05
jdk中keytool的使用以及如何提取jks文件中的公钥和私钥
JKS文件由公钥和密钥构成利用Java Keytool工具生成的文件,它是由公钥和密钥构成的,下面这篇文章主要给大家介绍了关于jdk中keytool的使用以及如何提取jks文件中公钥和私钥的相关资料,需要的朋友可以参考下2024-03-03
ConstraintValidator类如何实现自定义注解校验前端传参
这篇文章主要介绍了ConstraintValidator类实现自定义注解校验前端传参的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06


最新评论