一般來說,注解只能配置常量,在一些構架的開發中,有時候我們需要給注解動態配置一些值,或者想從配置文件中讀取配置。直接在注解上配置是無法實現的,但是我們可以在拿到注解的值之后,再對這些值進行另外的操作。比如在注解上面配置占位符,在使用的時候,再對這些占位符進行替換。這一塊其實SpringBoot已經幫我們實現了,拿來即用就行。
實現方式:
一、動態設置類上的注解值
1.1 準備工作
本地服務端口:8081,工具:IDEA
在Application.properties中新增一條配置信息,如:
service.api.url=/xxService/api
1.2 代碼如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import JAVAx.annotation.PostConstruct;
/**
* @description:
* @author: xx
* @create: 2021-05-18 14:28:36
**/
@RestController
@RequestMapping(value = "${service.api.url}", name = "類上動態參數設置")
public class DemoController {
@Autowired
private Environment environment;
/**
* 動態設置類上的注解的參數值
* @throws NoSuchMethodException
*/
@PostConstruct
public void init() throws NoSuchMethodException {
RequestMapping mapping = this.getClass().getAnnotation(RequestMapping.class);
// 獲取參數值
String value = environment.resolvePlaceholders(mapping.value()[0]);
String name = environment.resolvePlaceholders(mapping.name());
// 輸出
System.out.println("value-------->" + value);
System.out.println("name-------->" + name);
}
/**
* 測試方法
*/
@PostMapping(value = "save")
public void save() {
System.out.println("我已經進入save()方法。。。。。。。。。。。");
}
}
啟動服務,可以看到控制臺輸出:
value-------->/xxService/api
name-------->類上動態參數設置
如圖:

控制臺輸出
說明已經獲取到配置文件的值,此時,我們通過訪問接口:
http://127.0.0.1:8081/xxService/api/save
看一下是否能訪問,目的是為了確認類上的注解是否動態設置值成功。

postman請求測試結果

控制臺打印
可以看到,確實請求成功了,說明類上的注解動態參數設置確實是成功了。
二、方法上的注解動態參數設置
2.1 準備工作
在application.properties中新增一條配置信息,如:
service.api.url.method=/save
2.2 代碼如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
/**
* @description:
* @author: xx
* @create: 2021-05-18 14:28:36
**/
@RestController
@RequestMapping(value = "/xxService/api")
public class DemoController {
@Autowired
private Environment environment;
/**
* 動態設置方法上的注解的參數值
* @throws NoSuchMethodException
*/
@PostConstruct
public void init() throws NoSuchMethodException {
RequestMapping mapping = this.getClass().getMethod("save").getAnnotation(RequestMapping.class);
// 獲取參數值
String value = environment.resolvePlaceholders(mapping.value()[0]);
String name = environment.resolvePlaceholders(mapping.name());
// 輸出
System.out.println("value-------->" + value);
System.out.println("name-------->" + name);
}
/**
* 測試方法
*/
@RequestMapping(value = "${service.api.url.method}", name = "方法上動態參數設置", method = RequestMethod.POST)
public String save() {
System.out.println("我已經進入save()方法。。。。。。。。。。。");
return "再次請求成功!";
}
}
啟動服務,可以看到控制臺輸出:
value-------->/save
name-------->方法上動態參數設置
如圖:

控制臺打印
說明已經獲取到配置文件的值,此時,我們通過訪問接口:
http://127.0.0.1:8081/xxService/api/save
看一下是否能訪問,目的是為了確認方法上的注解是否動態設置參數值成功。


postman請求測試
可以看到,確實請求成功了,說明類上的注解動態參數值設置確實是成功了。
三、特殊情況
如果遇到按照上面代碼,最后沒有效果的情況,可以加一行代碼:
// 新增一行代碼
mapping.consumes();
如圖:

新增一行代碼