添加注解属性处理器

This commit is contained in:
huangchengxing 2022-07-05 13:39:56 +08:00
parent 0659440cad
commit 32d0b65744
2 changed files with 73 additions and 0 deletions

View File

@ -0,0 +1,49 @@
package cn.hutool.core.annotation;
import cn.hutool.core.map.multi.RowKeyTable;
import cn.hutool.core.map.multi.Table;
import cn.hutool.core.util.ObjectUtil;
import java.util.Collection;
import java.util.Comparator;
/**
* 带缓存功能的{@link SynthesizedAnnotationAttributeProcessor}实现
* 构建时需要传入比较器获取属性值时将根据比较器对合成注解进行排序
* 然后选择具有所需属性的排序最靠前的注解用于获取属性值
*
* @param <A> 合成注解类型
* @author huangchengxing
*/
public class CacheableSynthesizedAnnotationAttributeProcessor<A extends SynthesizedAnnotation<?>> implements
SynthesizedAnnotationAttributeProcessor<A> {
private final Table<String, Class<?>, Object> valueCaches = new RowKeyTable<>();
private final Comparator<A> annotationComparator;
/**
* 创建一个带缓存的注解值选择器
*
* @param annotationComparator 注解比较器排序更靠前的注解将被优先用于获取值
*/
public CacheableSynthesizedAnnotationAttributeProcessor(Comparator<A> annotationComparator) {
this.annotationComparator = annotationComparator;
}
@SuppressWarnings("unchecked")
@Override
public <T> T getAttributeValue(String attributeName, Class<T> attributeType, Collection<A> synthesizedAnnotations) {
Object value = valueCaches.get(attributeName, attributeType);
// 此处理论上不可能出现缓存值为nul的情况
if (ObjectUtil.isNotNull(value)) {
return (T)value;
}
value = synthesizedAnnotations.stream()
.filter(ma -> ma.hasAttribute(attributeName, attributeType))
.min(annotationComparator)
.map(ma -> ma.getAttribute(attributeName))
.orElse(null);
valueCaches.put(attributeName, attributeType, value);
return (T)value;
}
}

View File

@ -0,0 +1,24 @@
package cn.hutool.core.annotation;
import java.util.Collection;
/**
* 合成注解属性选择器用于中合成注解中从指定类型的注解里获取到对应的属性值
*
* @author huangchengxing
*/
@FunctionalInterface
public interface SynthesizedAnnotationAttributeProcessor<A extends SynthesizedAnnotation<?>> {
/**
* 从一批被合成注解中获取指定名称与类型的属性值
*
* @param attributeName 属性名称
* @param attributeType 属性类型
* @param synthesizedAnnotations 被合成的注解
* @param <T> 属性类型
* @return 属性值
*/
<T> T getAttributeValue(String attributeName, Class<T> attributeType, Collection<A> synthesizedAnnotations);
}