SpringBoot全局域名替換的實(shí)現(xiàn)
寫一個(gè) Spring Boot 全局域名替換 Demo,可以直接跑起來驗(yàn)證。
?? 項(xiàng)目結(jié)構(gòu)
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);
}
}
?? 運(yùn)行結(jié)果
啟動應(yīng)用后訪問:
http://localhost:8081/test
返回結(jié)果:
User API: https://api.example.com/user | Order API: https://api.example.com/order
這樣你只需要在 application.yml 改一處:
app.base-domain=https://api.newdomain.com
所有地方就會自動替換。
那么問題來了?現(xiàn)在這樣使用的話,全局每個(gè)Controller類里都需要注入這個(gè)AppProperties,不優(yōu)雅。
如果每個(gè) Controller 都要用 AppProperties,那就意味著每個(gè)類都要注入一遍。這樣雖然符合 Spring 的依賴注入設(shè)計(jì),但確實(shí)會有點(diǎn)麻煩。
有幾種 只需要注入一次,全局就能用 的做法??:
? 方案一:靜態(tài)常量 + @PostConstruct
在 AppProperties 初始化時(shí),把值放到靜態(tài)變量里,所有類直接靜態(tài)調(diào)用。
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String baseDomain;
public String getBaseDomain() {
return baseDomain;
}
public void setBaseDomain(String baseDomain) {
this.baseDomain = baseDomain;
}
// 靜態(tài)變量,供全局調(diào)用
public static String BASE_DOMAIN;
@PostConstruct
public void init() {
BASE_DOMAIN = baseDomain;
}
}
使用:
String url = AppProperties.BASE_DOMAIN + "/user";
?? 好處:所有類都能直接訪問,不需要注入。
?? 缺點(diǎn):靜態(tài)變量屬于硬編碼,測試/Mock 不方便。
? 方案二:封裝成工具類(推薦一點(diǎn))
新建一個(gè)工具類,注入一次配置,然后全局靜態(tài)訪問。
@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 本身有個(gè) Environment,可以隨時(shí)取配置:
@Autowired
private Environment env;
public void test() {
String baseDomain = env.getProperty("app.base-domain");
System.out.println(baseDomain);
}
如果不想每個(gè)地方都注入,可以同樣封裝成靜態(tài)工具類:
@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";
? 總結(jié)
- 如果配置只在少量地方用:直接注入
AppProperties更優(yōu)雅。 - 如果幾乎所有 Controller 都要用:推薦 方案二(DomainHolder 工具類),寫法簡潔,還支持占位符。
- 如果想最大靈活:用
Environment封裝成工具類。
要不要我?guī)湍銓懸粋€(gè) 方案二的完整 Demo,這樣所有 Controller 里就不用再注入了?
到此這篇關(guān)于SpringBoot全局域名替換的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot全局域名替換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot項(xiàng)目同時(shí)傳遞參數(shù)和文件的多種方式代碼演示
這篇文章主要介紹了spring boot項(xiàng)目同時(shí)傳遞參數(shù)和文件的多種方式,在開發(fā)接口中,遇到了需要同時(shí)接收參數(shù)和文件的情況,可以有多種方式實(shí)現(xiàn)文件+參數(shù)的接收,這里基于spring boot 3 + vue 3 + axios,做一個(gè)簡單的代碼演示,需要的朋友可以參考下2023-06-06
Mybatis中 mapper-locations和@MapperScan的作用
這篇文章主要介紹了Mybatis中 mapper-locations和@MapperScan的作用,mybatis.mapper-locations在SpringBoot配置文件中使用,作用是掃描Mapper接口對應(yīng)的XML文件,需要的朋友可以參考下2023-05-05
jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰
JKS文件由公鑰和密鑰構(gòu)成利用Java?Keytool工具生成的文件,它是由公鑰和密鑰構(gòu)成的,下面這篇文章主要給大家介紹了關(guān)于jdk中keytool的使用以及如何提取jks文件中公鑰和私鑰的相關(guān)資料,需要的朋友可以參考下2024-03-03
java基于UDP實(shí)現(xiàn)圖片群發(fā)功能
這篇文章主要為大家詳細(xì)介紹了java基于UDP實(shí)現(xiàn)圖片群發(fā)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
ConstraintValidator類如何實(shí)現(xiàn)自定義注解校驗(yàn)前端傳參
這篇文章主要介紹了ConstraintValidator類實(shí)現(xiàn)自定義注解校驗(yàn)前端傳參的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java設(shè)計(jì)模式之命令模式CommandPattern詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式CommandPattern詳解,命令模式是把一個(gè)請求封裝為一個(gè)對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊(duì)或記錄請求日志,以及支持可撤銷的操作,需要的朋友可以參考下2023-10-10

