游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

一文带你了解Spring核心接口Ordered的实现及应用

  前言
  最近在看框架的时候,发现了这个接口,在此进行总结,希望能够给大家帮助,同时提升自己。order接口的大体介绍
  Spring框架中有这个一个接口,名字叫Ordered,联想我们在数据库中应用的Ordered,很容易想到它的含义就是用来排序。那么问题来了,Spring中为什么要定义这样一个排序接口呢。我们知道spring框架使用了大量的策略设计模式。策略设计模式意味着我们的同一个接口,会有大量的不同实现。那么这么多实现,先执行哪个,后执行哪个呢。这就产生了一个排序和优先级的问题,于是Ordered接口登场,用来解决这一问题。ordered接口的正式介绍
  首先我们通过spring的源码看一下Ordered接口,源码如下:publicinterfaceOrdered{intHIGHESTPRECEDENCE2147483648;intLOWESTPRECEDENCE2147483647;intgetOrder();}
  从上述代码中,我们可以看到ordered接口的实现是非常简单的。有一个最高的优先级和一个最低的优先级,还提供了一个获得当前实现类的order数值的方法。spring的order中。越小的值,优先级越高,越大的值优先级越低。ordered接口的应用
  介绍完ordered接口之后,我们来看一下实际的应用场景。有一个典型的场景,我们知道spring的事务管理是通过aop切面来实现的。当我们自己写aop实现的时候,与事务的切面同时切到了一段代码。那么spring应该先执行谁呢。举一个具体的例子,我们写了一个切换数据源的aspect切面。如果说事务的执行在数据源切换的前面,那么切换数据源就失败了。我们肯定希望先执行切换数据源,再执行事务。于是ordered的应用场景就来了。假设我们写一个下面的切面。ComponentAspectpublicclassChangeDataBaseimplementsOrdered{拦截所有的service操作Pointcut(execution(com。color。。service。。(。。)))publicvoidpoint(){}Before(point())publicvoidonlyReadPre(){DataSourceContextHolder。setDataSourceType(DataSourceType。MYSQL);System。out。println(数据库切换MYSQL);}After(point())publicvoidonlyReadPast(){DataSourceContextHolder。setDataSourceType(DataSourceType。ORACLE);System。out。println(数据库切换回ORACLE);}OverridepublicintgetOrder(){return1;}}
  在上述代码中,我们定义了一个切点,用于拦截所有的service的方法。然后再方法执行前,我们将数据库切换到mysql,方法执行之后,数据库切换成oracle。最后重写了ordered接口的getOrder方法。这里我们设置order的级别为1。这个时候,我们在配置事务切面的时候。在xml中配置order。tx:annotationdriventransactionmanagertransactionManagerorder2
  如果是使用注入bean的方式的话,直接实现接口和上方一样使用即可。这个时候,我们就会发现。切换数据源的方法会永远在事务之前执行,这就实现了我们的目的。order注解的使用
  读到现在的读者在想,还要实现接口感觉好麻烦啊,有没有什么更方便的方法呢。当然有,我们介绍一下Order注解。还是先看一下order注解的源码。Retention(RetentionPolicy。RUNTIME)Target({ElementType。TYPE,ElementType。METHOD,ElementType。FIELD})DocumentedpublicinterfaceOrder{intvalue()default2147483647;}
  默认的优先级是最小的。我们在使用的时候,只要在类上面打上order注解即可。我们模拟两个类,打上order注解,然后再spring容器启动的时候,对类进行空参构造函数加载,通过空参构造函数里面的打印情况,我们就可以看到类初始化和执行的顺序。建立我们的第一个order类。Component使用order属性,设置该类在spring容器中的加载顺序Order(1)publicclassOrder1{privatefinalintORDERED1;publicOrder1(){System。out。println(this);}OverridepublicStringtoString(){returnOrder1isloadedORDEREDORDERED〕;}}
  建立我们的第二个order类。Component使用order属性,设置该类在spring容器中的加载顺序Order(2)publicclassOrder2{privatefinalintORDERED2;publicOrder2(){System。out。println(this);}OverridepublicStringtoString(){returnOrder2isloadedORDEREDORDERED〕;}}
  启动spring容器之后,我们看到控制台执行如下结果。Order1isloadedORDERED1〕Order2isloadedORDERED2〕orderComparator的介绍
  那么我们假如想知道一个类的order的值,或者想比较两个类的order值谁大谁小,这个时候要如何操作呢,Spring贴心的给我们提供了一个类。OrderComparator,通过这个类,我们获得实例后,使用它所提供的getOrder或者compare方法即可实现上述的需求。我们照例还是先来看一下源码。publicclassOrderComparatorimplementsComparatorObject{publicstaticfinalOrderComparatorINSTANCEnewOrderComparator();publicOrderComparator(){}publicComparatorObjectwithSourceProvider(OrderComparator。OrderSourceProvidersourceProvider){return(o1,o2){returnthis。doCompare(o1,o2,sourceProvider);};}publicintcompare(NullableObjecto1,NullableObjecto2){returnthis。doCompare(o1,o2,(OrderComparator。OrderSourceProvider)null);}privateintdoCompare(NullableObjecto1,NullableObjecto2,NullableOrderComparator。OrderSourceProvidersourceProvider){booleanp1o1instanceofPriorityOrdered;booleanp2o2instanceofPriorityOrdered;if(p1!p2){return1;}elseif(p2!p1){return1;}else{inti1this。getOrder(o1,sourceProvider);inti2this。getOrder(o2,sourceProvider);returnInteger。compare(i1,i2);}}privateintgetOrder(NullableObjectobj,NullableOrderComparator。OrderSourceProvidersourceProvider){Integerordernull;if(obj!nullsourceProvider!null){ObjectorderSourcesourceProvider。getOrderSource(obj);if(orderSource!null){if(orderSource。getClass()。isArray()){Object〔〕sourcesObjectUtils。toObjectArray(orderSource);Object〔〕var6sources;intvar7sources。length;for(intvar80;var8var7;var8){Objectsourcevar6〔var8〕;orderthis。findOrder(source);if(order!null){break;}}}else{orderthis。findOrder(orderSource);}}}returnorder!null?order。intValue():this。getOrder(obj);}protectedintgetOrder(NullableObjectobj){if(obj!null){Integerorderthis。findOrder(obj);if(order!null){returnorder。intValue();}}return2147483647;}NullableprotectedIntegerfindOrder(Objectobj){returnobjinstanceofOrdered?((Ordered)obj)。getOrder():null;}NullablepublicIntegergetPriority(Objectobj){returnnull;}publicstaticvoidsort(Listlt;?list){if(list。size()1){list。sort(INSTANCE);}}publicstaticvoidsort(Object〔〕array){if(array。length1){Arrays。sort(array,INSTANCE);}}publicstaticvoidsortIfNecessary(Objectvalue){if(valueinstanceofObject〔〕){sort((Object〔〕)((Object〔〕)value));}elseif(valueinstanceofList){sort((List)value);}}FunctionalInterfacepublicinterfaceOrderSourceProvider{NullableObjectgetOrderSource(Objectvar1);}}
  我们先来重点看一下doCompare方法。判断逻辑如下:若对象o1是Ordered接口类型,o2是PriorityOrdered接口类型,那么o2的优先级高于o1若对象o1是PriorityOrdered接口类型,o2是Ordered接口类型,那么o1的优先级高于o2其他情况,若两者都是Ordered接口类型或两者都是PriorityOrdered接口类型,调用Ordered接口的getOrder方法得到order值,order值越大,优先级越小那么一句话来说就是这样的。OrderComparator比较器进行排序的时候,若2个对象中有一个对象实现了PriorityOrdered接口,那么这个对象的优先级更高。若2个对象都是PriorityOrdered或Ordered接口的实现类,那么比较Ordered接口的getOrder方法得到order值,值越低,优先级越高。
  再来看一下getOrder方法。传入一个对象后,通过provider取得原始对象。如果不为空,继续进行判断。如果是数组对象,对对象进行遍历,得到order后,跳出。如果不是数组则直接获得对象的order。最后如果order如果不是空,直接返回order的int值,为空的时候,通过findOrder查看,返回的是order的最大值,也就是最低优先级。protectedintgetOrder(NullableObjectobj){if(obj!null){Integerorderthis。findOrder(obj);if(order!null){returnorder。intValue();}}return2147483647;}总结
  至此ordered相关的东西就介绍到此为止,文中难免有不足,希望大家提出指正,感谢。

车模毛婷个人资料还能让人好好看车不模特这个行业似乎已经不再是大家理解的那么单纯了。特别是车模和平面模特。不要认为他们只是在车展或者是一些杂志的封面上出镜,实际上他们的工作范围可是很广的。甚至是已经远远超越了模特……为什么互联网平台推出的消费类著名品牌往往似流星大家可能有这么个感觉,在某个时间段耳熟能详的某个品牌,过段时间却很少听到或消声匿迹了,而这些品牌主要是在互联网平台推广为特征的。这和我们认知的著名品牌的持久性相差甚远,似流星般……如果你要买新手机,你会选择安卓手机还是苹果手机?2021年安卓手机的性能和功能,已经远远超过了当前的苹果手机,安卓手机流畅性现在也很好,但是为什么那么多人还是喜欢用苹果手机呢?因为现在安卓手机的价格已经和苹果手机差不多……三千块钱的手机拥有一个旗舰手机才有的配置,你选哪个?旗舰手机为什么被称为旗舰手机,就是因为它的配置足够豪华,不管你是用得上的还是用不上的都给你往上堆。但是我们用那么高的价格去换一些我们可能换手机都用不上的配置真的有用么?如果说三……乌兰图雅年龄多少岁,乌兰图雅个人资料介绍知名草原歌手乌兰图雅想必喜欢音乐的朋友们不会陌生吧,做为歌手的乌兰图雅自从出道以来,先后为我们带来了很多首传唱度极高的歌曲,其中套马杆、站在草原望北京、火辣辣的情歌等至今传唱度……热点追击售价3980元八重洲FT5D数字对讲机性价比几何?配备橡胶保护罩,1000mW大音量,八重洲电台正式发布兼容C4FM数字模式的144430MHz频段手持机FT5D,价格在人民币3980元,你觉得如何?2021年8月19日……华为nova9或将采用仅支持4G网络的5G芯片根据微博博主菊厂影业粉丝的最新报道,华为nova9系列将于9月某个时候正式发布,该报告进一步声称该设备将具有5G功能不支持5G不支持5G由于众所周知的原因,华为最近……妹妹背着洋娃娃歌词故事为什么会变得那么恐怖难过《妹妹背着洋娃娃》这首歌曲歌词相信很多人都听过,阴森的其实是让人很心疼其中的女孩,出生之后面临了自己妈妈被爸爸亲手杀死的情景,自己也是被如此残忍伤害,究竟是什么样的一个家庭,为……火影女角色大尺度图片实力有限这是在转移目标吗日本的漫画一直是行业中的佼佼者。给大家带来了很多经典的动漫作品。但是随着近些年动漫的发展。很多原本一些热播的动漫也开始走向了18禁的路线。出现了不少的同人漫画。火影忍者就是其中……纪晓波是怎么发家的他的传奇班车一列一列的纪晓波是女演员吴佩慈的丈夫,都说这位ceo如果没有自己老婆的话,根本不会像今天这样出名,想想也是,哪个企业家希望自己每天做什么事情都有一群的记者跟拍,这样既耽误自己的工作也很容……余思瞳会计门视频怎么回事这样打赏这货脑子进水了直播可谓是这两年来相当火爆的行业,行业的兴起让大家知道了很多知名的网红。同时也让大家见识到了土豪们是怎么给这些主播们刷礼物的,不过不要认为刷礼物的都一定是有钱的主儿,也说不定会……ip剧是什么意思为什么这两年热度这么高看电视剧已经成为了人们娱乐消磨时间最好的方式。如果出来一部口碑还不错的新剧。立马就会形成一波追剧热潮。对于不同的人他们喜欢的剧自然也不同。有人喜欢玄幻剧。有人喜欢悬疑剧,也有人……
阿根廷学生应用中望3D,技术重现达芬奇飞碟坦克原型阿根廷学生艾伦巴特(AlanBat)主修机械工程专业,最近他用中望3D将列奥纳多达芬奇(LeonardodaVinci)武装装甲车手稿灵感带进现实,技术重现最早的坦克原型。……299元,华为荣耀HonorxSport运动蓝牙耳机值不值如果在跑步的时候不听音乐,那跟咸鱼有什么区别。音乐可以让枯燥无味的跑步变得轻松惬意,分散跑者的注意力从而缓解疲劳。当然运动耳机很多,有线的听诊器效果太强果断放弃,无线的蓝牙运动……广东土豪横幅火了!土豪资助村民生育子女,每人可获9万元近日,湛江一村的硬核横幅火了,据了解,这条横幅挂在湛江廉江市营仔镇,包墩村黄竹根自然村的路口,被村民拍摄并发布上网后引发关注。东廉江营仔镇包墩行政村黄竹根自然村于9月1日……全热交换新风系统的工作原理是什么?优点有哪些?根据新风系统是否在运行过程中,将室内外空气的热量进行交换而分为全热交换新风系统和非全热交换新风系统。换言之,全热交换新风系统的侧重点在于将室内外的热气或冷气在送入或排出时,室内……你就这么快让自己掉进男人的陷阱里了?闺蜜儿子4岁,每次生病,他都积极主动吃药。我很好奇,就问闺蜜用了什么好方法。闺蜜:我儿子以前也不吃药。有次,我老公的宠物兔生病,我告诉儿子,谁不吃药,都会死的。几天了,兔子也没……金玉其外,金玉其中TFZNo。3入耳式HIFI监听耳返过去的我是随便拿起一副耳机听个响的人,只要能发出声音,别的对我来说区别都不大自从入手了我的第一条TFZ之后,逐渐感受到诸位大佬在耳机这条路上执着的原因。Balance1不……身份证银行卡放口袋不安全,今年流行这款卡包,安全防盗逼格还高对于手握信用卡的刷卡族来说,最冤枉的事莫过于卡在身边,信用卡却在外地or国外被莫名消费了。事后补救或许能挽回部分损失,但费时费力,还损耗精神,平白增加了无妄之灾。最……美方重压之下,TikTok何去何从第一观察讯(文博然)TikTok让世界进入了一个人人都有麦克风、谁都可以拥有话语权的时代。就是这么一款自由的APP,被号称自由过度的美国打压。现在的TikTok正处于一片……10。19万起售,捷途X90PLUS正式上市,两种动力,569月17日,2021款捷途X90PLUS正式上市,新车共推出5款车型,售价区间为10。1913。99万,每款车型均567座三种座椅布局,这也意味着消费者共有15种选择。外……有一种尊重叫守口如瓶,相敬如宾生活中,我们不仅要保存自己的秘密,也要尊重他人的秘密。有些人心性不稳定,受人盛情款待时,常会把心里话倾吐殆尽,特别是酒醉饭饱之后,最易吐真言:咱们朋友一场,以你我多年的交……味道够特别,解开日本最新静电容键盘开关的手感秘密这把LEOPOLD的FC660MPT键盘首次亮相于COMPUTEX2019,也是日本最新的静电容键盘技术的首度露面。因为键盘是工程样机,对于它的详细功能和做工情况暂时不便做深入……还得看它!比亚迪将唐和元带到哥伦比亚,获当地好评比亚迪几乎总是第一批将电动汽车带到南美国家的汽车制造商之一。哥伦比亚是最新一个从比亚迪清洁技术创新中获益的成功国家,在这个案例中,它得到了广受喜爱的唐电动车和元电动车。元电动汽……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网