文档章节

SpringFramework之AnnotationAwareOrderComparator

克虏伯
 克虏伯
发布于 11/09 23:46
字数 427
阅读 9
收藏 1

    今天在看Springsecurity(4.3.x.RELEASE)的WebSecurityConfiguration时,看到AnnotationAwareOrderComparator,就写下自己的感受。

    List-1 

	private static class AnnotationAwareOrderComparator extends OrderComparator {
		private static final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator();

		@Override
		protected int getOrder(Object obj) {
			return lookupOrder(obj);
		}

		private static int lookupOrder(Object obj) {
			if (obj instanceof Ordered) {
				return ((Ordered) obj).getOrder();
			}
			if (obj != null) {
				Class<?> clazz = (obj instanceof Class ? (Class<?>) obj : obj.getClass());
				Order order = AnnotationUtils.findAnnotation(clazz, Order.class);
				if (order != null) {
					return order.value();
				}
			}
			return Ordered.LOWEST_PRECEDENCE;
		}
	}

    如List-1所示,AnnotationAwareOrderComparator继承了OrderComparator,并覆写了getOrder方法。来看lookupOrder方法:

  • 首先,判断Object类型的参数是否是Ordered.java,它是个接口,如下List-2所示。
  • 如果参数不是Ordered接口,那么判断参数是否是Class<?>,如果是Class<?>,那么取出它上面的注解Order.java;如果参数是对象,那么先获取参数的Class<?>,再判断是否有Order.java注解(如List-3所示),之后调用Order的value()。
  • 如果没有Order注解,那么返回一个默认值,这个默认值是。

    

    这个小小的类里面,考虑了很多中情况,代码的复用性很强,比如可以实现Ordered接口,又或者可以使用Order注解,传入的可以Class<?>,又可以是对象。

    List-2

public interface Ordered {

	/**
	 * Useful constant for the highest precedence value.
	 * @see java.lang.Integer#MIN_VALUE
	 */
	int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;

	/**
	 * Useful constant for the lowest precedence value.
	 * @see java.lang.Integer#MAX_VALUE
	 */
	int LOWEST_PRECEDENCE = Integer.MAX_VALUE;


	/**
	 * Get the order value of this object.
	 * <p>Higher values are interpreted as lower priority. As a consequence,
	 * the object with the lowest value has the highest priority (somewhat
	 * analogous to Servlet {@code load-on-startup} values).
	 * <p>Same order values will result in arbitrary sort positions for the
	 * affected objects.
	 * @return the order value
	 * @see #HIGHEST_PRECEDENCE
	 * @see #LOWEST_PRECEDENCE
	 */
	int getOrder();

}

    List-3

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {

	/**
	 * The order value.
	 * <p>Default is {@link Ordered#LOWEST_PRECEDENCE}.
	 * @see Ordered#getOrder()
	 */
	int value() default Ordered.LOWEST_PRECEDENCE;

}

 

© 著作权归作者所有

共有 人打赏支持
克虏伯

克虏伯

粉丝 15
博文 318
码字总数 106998
作品 0
渝北
程序员
私信 提问
第二章 一节spring-core之comparator深入解读

前言 本章节深入讲解spring的comparator,使用与细节,帮助大家在项目里面正确使用comparator。源码解读无法通过文字很详细的解释,诠释。需要读者多次阅读,深入理解,组织逻辑,大脑慢慢形成...

鸟菜啊
04/18
0
0
spring boot 启动过程-简述

spring boot 启动 spring boot 的启动代码很简单,最精简的代码如下。 注意:spring启动的main方法必须包含在包内 启动代码很简单,但在初始化过程中,spring做了很多工作,打开run方法,我们...

why_Dk37
2016/12/11
63
0
聊聊spring cloud gateway的RouteLocator

序 本文主要研究一下spring cloud gateway的RouteLocator RouteLocator spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/route/RouteLocator.java 其有......

go4it
06/06
0
0
Spring Boot 启动过程及回调接口汇总

原文出处:Daniel Qian 相关代码在: https://github.com/chanjarster/spring-boot-all-callbacks 注:本文基于spring-boot 1.4.1.RELEASE, spring 4.3.3.RELEASE撰写。 启动顺序 Spring boo......

Daniel Qian
2017/12/02
0
0
Error during artifact deployment.

07:55:45.125 ERROR org.springframework.web.context.ContextLoader [] (admin-listener(4)) [o.s.web.context.ContextLoader] -- Context initialization failed org.springframework.bean......

kwyxiaoli
2014/06/03
5.8K
2

没有更多内容

加载失败,请刷新页面

加载更多

爬虫教程」Python做一个简单爬虫,小白也能看懂的教程

俗话说“巧妇难为无米之炊”,除了传统的数据源,如历史年鉴,实验数据等,很难有更为简便快捷的方式获得数据,在目前互联网的飞速发展写,大量的数据可以通过网页直接采集,“网络爬虫”应运...

糖宝lsh
今天
1
0
KEIL MDK工程中的宏定义:字符,值,字符串

下图中定义了2个宏: 等效于文件中: #define MCU_FLASH_LESSTHAN_64K #define VERSION_INFO_hw 'a' // MDK :VERSION_INFO_hw="'a'" 即MDK中的VERSION_INFO_hw="'a'" 和 #define VERS......

SamXIAO
今天
0
0
集合的最优子集划分

问题描述:如何将一个个数为n的集合N划分为为若干个子集N1…Nk,其中1≤k≤n,计算出每个子集的最优结果R1…Rk,使得F(R1…Rk)为最优的结果。 这个问题可以分成3步解决: 求出集合所有子集 ...

laolin23
今天
0
0
JavaScript实现在线Markdown编辑器、转换HTML工具-toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
今天
3
0
Source Tree 在git 密码更新后,无法拉取代码的解决办法

背景: git 密码总是需要修改。在修改代码后,拉去代码, source tree 总提示access denied. 解决方法:重新修改git 仓库对应的密码。 for mac:应用程序 -》 钥匙串 -》 搜索 source tre...

Carlyle_Lee
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部