大家都知道,注解只能配置常量,在一些构架的开发中,有时候我们需要给注解动态配置一些值,或者想从配置文件中读取配置。直接在注解上配置是无法实现的,但是我们可以在拿到注解的值之后,再对这些值进行另外的操作。比如在注解上面配置占位符,在使用的时候,再对这些占位符进行替换。在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.可以任意表达式,支持运算符