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 占们符以#和$开头的不同:

$

1.用户获取外部文件中指定key的值
2.可以在xml中配置,也可以出现在@value注解中
3.一般用于获取数据库配置内容信息

#

1.spring中el表达式的格式
2.可以在xml中配置,也可以出现在@value注解中
3.可以任意表达式,支持运算符

posted @ 2020-02-11 10:35  王广帅  阅读(8817)  评论(0编辑  收藏  举报