Spring源码:AnnotationAwareOrderComparator

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuqiuhui/article/details/82974026

AnnotationAwareOrderComparator简介:

AnnotationAwareOrderComparator是OrderComparator的子类,用来支持Spring的Ordered类、@Order注解和@Priority注解。

源码解析

public class AnnotationAwareOrderComparator extends OrderComparator {
    // 对外提供的共享实例
	public static final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator();

	/**
	 * 用来检查实现Ordered接口、@Order和@Priority注解
	 */
    protected Integer findOrder(Object obj) {
		// 检查常规的Ordered接口,通过子类重写的getOrder方法返回顺序值
        Integer order = super.findOrder(obj);
		if (order != null) {
			return order;
		}

		// 检查实现@Order和@Priority注解
		if (obj instanceof Class) {
            // 在类上检查@Order和@Priority注解,并找出顺序值
			return OrderUtils.getOrder((Class<?>) obj);
		} else if (obj instanceof Method) {
            // 在方法上检查@Order注解,并找出顺序值
			Order ann = AnnotationUtils.findAnnotation((Method) obj, Order.class);
			if (ann != null) {
				return ann.value();
			}
		} else if (obj instanceof AnnotatedElement) {
            // 在注解中找@Order注解,并找出顺序值
			Order ann = AnnotationUtils.getAnnotation((AnnotatedElement) obj, Order.class);
			if (ann != null) {
				return ann.value();
			}
		} else if (obj != null) {
			order = OrderUtils.getOrder(obj.getClass());
			if (order == null && obj instanceof DecoratingProxy) {
				order = OrderUtils.getOrder(((DecoratingProxy) obj).getDecoratedClass());
			}
		}

		return order;
	}

	/**
	 * 找Priority值
	 */
	public Integer getPriority(Object obj) {
		Integer priority = null;
		if (obj instanceof Class) {
			priority = OrderUtils.getPriority((Class<?>) obj);
		}
		else if (obj != null) {
			priority = OrderUtils.getPriority(obj.getClass());
			if (priority == null && obj instanceof DecoratingProxy) {
				priority = OrderUtils.getOrder(((DecoratingProxy) obj).getDecoratedClass());
			}
		}
		return priority;
	}

	public static void sort(List<?> list) {
		if (list.size() > 1) {
			Collections.sort(list, INSTANCE);
		}
	}

	public static void sort(Object[] array) {
		if (array.length > 1) {
			Arrays.sort(array, INSTANCE);
		}
	}

	public static void sortIfNecessary(Object value) {
		if (value instanceof Object[]) {
			sort((Object[]) value);
		}
		else if (value instanceof List) {
			sort((List<?>) value);
		}
	}

}

猜你喜欢

转载自blog.csdn.net/zhuqiuhui/article/details/82974026