背景
今天要给kafka消费者 记录日志, 采用的是自定义注解 + Spring AOP ,由于要记录groupId,而groupId是从配置中心读取的,所以需要自定义注解支持$的占位符语法。
解决方案
在 切面类 Aspect 中注入全局的Environment 对象,Environment 可以拿到所有的配置,然后调用Environment 对象的resolvePlaceholders 方法即可。
示例代码
@Component
@Aspect
@Slf4j(topic = "ELK_KFK_LOG_MSG")
public class KafkaConsumerLogAspect {
private static final int SUCCESS_CODE = 0;
private static final int FAIL_CODE = 400000;
@Autowired
private Environment environment;
@Pointcut("@annotation(com.yumc.ycms.qy.consumer.annotation.ConsumerLog)")
public void consumerLog() {
}
/**
* 环绕通知
* @param pjp 节点
* @return
*/
@Around("@annotation(consumerLog)")
public Object operationLogRecord(ProceedingJoinPoint pjp,ConsumerLog consumerLog){
Object result = null;
//获取参数名称
Object[] args = pjp.getArgs();
//解析占位符
String groupId = environment.resolvePlaceholders(consumerLog.groupId());
...........
dosomething
........
}
}
其中consumerLog 是自定义注解,groupId是注解中的属性,使用的时候可以这样 @consumerLog(groupId="${groupId}"),至此完美解决。