大家都知道,注解只能配置常量,在一些構架的開發中,有時候我們需要給注解動態配置一些值,或者想從配置文件中讀取配置。直接在注解上配置是無法實現的,但是我們可以在拿到注解的值之后,再對這些值進行另外的操作。比如在注解上面配置占位符,在使用的時候,再對這些占位符進行替換。在RocketMQ的監聽配置中,就使用了這個技術,如下代碼所示:
@RocketMQMessageListener(topic = "${game.server.config.business-game-message-topic}", consumerGroup = "gateway-message-consumer-group")
public class GatewayMessageReceiveService implements RocketMQListener<MessageExt> {
@Override
public void onMessage(MessageExt message) {
}
}
這里面RocketMQMessageListener注解配置的Topic就是配置的占位符,它會讀取yml配置文件中的game.server.config.business-game-message-topic配置的值。那么它是怎么實現的呢?很簡單,spring boot已經替換我們實現了,只需要調一下方法就可以了,如下面代碼所示:
container.setTopic(environment.resolvePlaceholders(annotation.topic()));
比如,在服務器啟動的時候,想在日志上面打印一下注解中topic的真實值,如下所示:
@Autowired
private Environment environment;
@PostConstruct
public void init() {
RocketMQMessageListener messageListener = this.getClass().getAnnotation(RocketMQMessageListener.class);
String topic = environment.resolvePlaceholders(messageListener.topic());
logger.info("監聽網關消息,topic:{},group:{}",topic,messageListener.consumerGroup());
}
另外,簡單了解一下在Spring 占們符以#和$開頭的不同:
${key名稱}
1.用戶獲取外部文件中指定key的值
2.可以在xml中配置,也可以出現在@value注解中
3.一般用於獲取數據庫配置內容信息
#{表達式}
1.spring中el表達式的格式
2.可以在xml中配置,也可以出現在@value注解中
3.可以任意表達式,支持運算符