SpringBoot注解內容的動態配置


大家都知道,注解只能配置常量,在一些構架的開發中,有時候我們需要給注解動態配置一些值,或者想從配置文件中讀取配置。直接在注解上配置是無法實現的,但是我們可以在拿到注解的值之后,再對這些值進行另外的操作。比如在注解上面配置占位符,在使用的時候,再對這些占位符進行替換。在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.可以任意表達式,支持運算符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM