一般來說,注解只能配置常量,在一些構(gòu)架的開發(fā)中,有時(shí)候我們需要給注解動(dòng)態(tài)配置一些值,或者想從配置文件中讀取配置。直接在注解上配置是無法實(shí)現(xiàn)的,但是我們可以在拿到注解的值之后,再對(duì)這些值進(jìn)行另外的操作。比如在注解上面配置占位符,在使用的時(shí)候,再對(duì)這些占位符進(jìn)行替換。這一塊其實(shí)SpringBoot已經(jīng)幫我們實(shí)現(xiàn)了,拿來即用就行。
實(shí)現(xiàn)方式:
一、動(dòng)態(tài)設(shè)置類上的注解值
1.1 準(zhǔn)備工作
本地服務(wù)端口: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 = "類上動(dòng)態(tài)參數(shù)設(shè)置")
public class DemoController {
@Autowired
private Environment environment;
/**
* 動(dòng)態(tài)設(shè)置類上的注解的參數(shù)值
* @throws NoSuchMethodException
*/
@PostConstruct
public void init() throws NoSuchMethodException {
RequestMapping mapping = this.getClass().getAnnotation(RequestMapping.class);
// 獲取參數(shù)值
String value = environment.resolvePlaceholders(mapping.value()[0]);
String name = environment.resolvePlaceholders(mapping.name());
// 輸出
System.out.println("value-------->" + value);
System.out.println("name-------->" + name);
}
/**
* 測(cè)試方法
*/
@PostMapping(value = "save")
public void save() {
System.out.println("我已經(jīng)進(jìn)入save()方法。。。。。。。。。。。");
}
}
啟動(dòng)服務(wù),可以看到控制臺(tái)輸出:
value-------->/xxService/api
name-------->類上動(dòng)態(tài)參數(shù)設(shè)置
如圖:
控制臺(tái)輸出
說明已經(jīng)獲取到配置文件的值,此時(shí),我們通過訪問接口:
http://127.0.0.1:8081/xxService/api/save
看一下是否能訪問,目的是為了確認(rèn)類上的注解是否動(dòng)態(tài)設(shè)置值成功。
postman請(qǐng)求測(cè)試結(jié)果
控制臺(tái)打印
可以看到,確實(shí)請(qǐng)求成功了,說明類上的注解動(dòng)態(tài)參數(shù)設(shè)置確實(shí)是成功了。
二、方法上的注解動(dòng)態(tài)參數(shù)設(shè)置
2.1 準(zhǔn)備工作
在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;
/**
* 動(dòng)態(tài)設(shè)置方法上的注解的參數(shù)值
* @throws NoSuchMethodException
*/
@PostConstruct
public void init() throws NoSuchMethodException {
RequestMapping mapping = this.getClass().getMethod("save").getAnnotation(RequestMapping.class);
// 獲取參數(shù)值
String value = environment.resolvePlaceholders(mapping.value()[0]);
String name = environment.resolvePlaceholders(mapping.name());
// 輸出
System.out.println("value-------->" + value);
System.out.println("name-------->" + name);
}
/**
* 測(cè)試方法
*/
@RequestMapping(value = "${service.api.url.method}", name = "方法上動(dòng)態(tài)參數(shù)設(shè)置", method = RequestMethod.POST)
public String save() {
System.out.println("我已經(jīng)進(jìn)入save()方法。。。。。。。。。。。");
return "再次請(qǐng)求成功!";
}
}
啟動(dòng)服務(wù),可以看到控制臺(tái)輸出:
value-------->/save
name-------->方法上動(dòng)態(tài)參數(shù)設(shè)置
如圖:
控制臺(tái)打印
說明已經(jīng)獲取到配置文件的值,此時(shí),我們通過訪問接口:
http://127.0.0.1:8081/xxService/api/save
看一下是否能訪問,目的是為了確認(rèn)方法上的注解是否動(dòng)態(tài)設(shè)置參數(shù)值成功。
postman請(qǐng)求測(cè)試
可以看到,確實(shí)請(qǐng)求成功了,說明類上的注解動(dòng)態(tài)參數(shù)值設(shè)置確實(shí)是成功了。
三、特殊情況
如果遇到按照上面代碼,最后沒有效果的情況,可以加一行代碼:
// 新增一行代碼
mapping.consumes();
如圖:
新增一行代碼