成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring核心接口之Ordered

cartoon / 864人閱讀

摘要:一接口介紹中提供了一個(gè)接口。從單詞意思就知道接口的作用就是用來排序的。類實(shí)現(xiàn)了接口的一個(gè)比較器。三中使用接口在的例子在配置文件中添加,那么默認(rèn)會(huì)注入和這兩個(gè)類。

一、Ordered接口介紹
Spring中提供了一個(gè)Ordered接口。從單詞意思就知道Ordered接口的作用就是用來排序的。
Spring框架是一個(gè)大量使用策略設(shè)計(jì)模式的框架,這意味著有很多相同接口的實(shí)現(xiàn)類,那么必定會(huì)有優(yōu)先級(jí)的問題。于是Spring就提供了Ordered這個(gè)接口,來處理相同接口實(shí)現(xiàn)類的優(yōu)先級(jí)問題。

二、Ordered接口分析
1、Ordered接口的定義:

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.
 * 

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). *

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();

}

該接口卡只有1個(gè)方法getOrder()及 2個(gè)變量HIGHEST_PRECEDENCE最高級(jí)(數(shù)值最小)和LOWEST_PRECEDENCE最低級(jí)(數(shù)值最大)。

2、OrderComparator類:實(shí)現(xiàn)了Comparator接口的一個(gè)比較器。

public class OrderComparator implements Comparator {
/**
 * Shared default instance of OrderComparator.
 */
public static final OrderComparator INSTANCE = new OrderComparator();

public int compare(Object o1, Object o2) {
    boolean p1 = (o1 instanceof PriorityOrdered);
    boolean p2 = (o2 instanceof PriorityOrdered);
    if (p1 && !p2) {
        return -1;
    }
    else if (p2 && !p1) {
        return 1;
    }

    // Direct evaluation instead of Integer.compareTo to avoid unnecessary object creation.
    int i1 = getOrder(o1);
    int i2 = getOrder(o2);
    return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0;
}

/**
 * Determine the order value for the given object.
 * 

The default implementation checks against the {@link Ordered} * interface. Can be overridden in subclasses. * @param obj the object to check * @return the order value, or {@code Ordered.LOWEST_PRECEDENCE} as fallback */ protected int getOrder(Object obj) { return (obj instanceof Ordered ? ((Ordered) obj).getOrder() : Ordered.LOWEST_PRECEDENCE); } /** * Sort the given List with a default OrderComparator. *

Optimized to skip sorting for lists with size 0 or 1, * in order to avoid unnecessary array extraction. * @param list the List to sort * @see java.util.Collections#sort(java.util.List, java.util.Comparator) */ public static void sort(List list) { if (list.size() > 1) { Collections.sort(list, INSTANCE); } } /** * Sort the given array with a default OrderComparator. *

Optimized to skip sorting for lists with size 0 or 1, * in order to avoid unnecessary array extraction. * @param array the array to sort * @see java.util.Arrays#sort(Object[], java.util.Comparator) */ public static void sort(Object[] array) { if (array.length > 1) { Arrays.sort(array, INSTANCE); } }

}

提供了2個(gè)靜態(tài)排序方法:sort(List list)用來排序list集合、sort(Object[] array)用來排序Object數(shù)組
可以下OrderComparator類的public int compare(Object o1, Object o2)方法,可以看到另外一個(gè)類PriorityOrdered,這個(gè)方法的邏輯解析如下:

1. 若對(duì)象o1是Ordered接口類型,o2是PriorityOrdered接口類型,那么o2的優(yōu)先級(jí)高于o1
2. 若對(duì)象o1是PriorityOrdered接口類型,o2是Ordered接口類型,那么o1的優(yōu)先級(jí)高于o2     3.其他情況,若兩者都是Ordered接口類型或兩者都是PriorityOrdered接口類型,調(diào)用Ordered接口的getOrder方法得到order值,order值越大,優(yōu)先級(jí)越小

簡(jiǎn)單來說就是:
OrderComparator比較器進(jìn)行排序的時(shí)候,若2個(gè)對(duì)象中有一個(gè)對(duì)象實(shí)現(xiàn)了PriorityOrdered接口,那么這個(gè)對(duì)象的優(yōu)先級(jí)更高。若2個(gè)對(duì)象都是PriorityOrdered或Ordered接口的實(shí)現(xiàn)類,那么比較Ordered接口的getOrder方法得到order值,值越低,優(yōu)先級(jí)越高。

三、Spring中使用Ordered接口在的例子
在spring配置文件中添加:,那么SpringMVC默認(rèn)會(huì)注入RequestMappingHandlerAdapter和RequestMappingHandlerMapping這兩個(gè)類。 既然SpringMVC已經(jīng)默認(rèn)為我們注入了RequestMappingHandlerAdapter和RequestMappingHandlerMapping這兩個(gè)類,如果再次配置這兩個(gè)類,將會(huì)出現(xiàn)什么效果呢?
當(dāng)我們配置了annotation-driven以及這兩個(gè)bean的時(shí)候。Spring容器就有了2個(gè)RequestMappingHandlerAdapter和2個(gè)RequestMappingHandlerMapping。
DispatcherServlet內(nèi)部有HandlerMapping(RequestMappingHandlerMapping是其實(shí)現(xiàn)類)集合和HandlerAdapter(RequestMappingHandlerAdapter是其實(shí)現(xiàn)類)集合。

    //RequestMappingHandlerMapping集合
    private List handlerMappings;
    //HandlerAdapter集合
    private List handlerAdapters;

在仔細(xì)看下DispatcherServlet類的private void initHandlerMappings(ApplicationContext context)方法可以看到如下代碼:

    //detectAllHandlerMappings默認(rèn)為true
    if (this.detectAllHandlerMappings) {
        // Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
        Map matchingBeans =
                BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
        if (!matchingBeans.isEmpty()) {
            this.handlerMappings = new ArrayList(matchingBeans.values());
            // We keep HandlerMappings in sorted order.
            //進(jìn)行排序
            AnnotationAwareOrderComparator.sort(this.handlerMappings);
        }
    }
AnnotationAwareOrderComparator繼承了OrderComparator類

再看下配置的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter()方法
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping()方法 分析代碼可以知道:RequestMappingHandlerMapping默認(rèn)會(huì)設(shè)置order屬性為0,RequestMappingHandlerAdapter沒有設(shè)置order屬性。

進(jìn)入RequestMappingHandlerMapping和RequestMappingHandlerAdapter代碼里面看看它們的order屬性是如何定義的。

RequestMappingHandlerMapping
// Ordered.LOWEST_PRECEDENCE只為Integer.MAX_VALUE
public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport
    implements HandlerMapping, Ordered {
    private int order = Integer.MAX_VALUE; 
    
AbstractHandlerMapping是RequestMappingHandlerMapping的父類。

RequestMappingHandlerAdapter
public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter, Ordered {
    // Ordered.LOWEST_PRECEDENCE只為Integer.MAX_VALUE
    private int order = Ordered.LOWEST_PRECEDENCE;

AbstractHandlerMethodAdapter是RequestMappingHandlerAdapter的父類。    可以看到RequestMappingHandlerMapping和RequestMappingHandlerAdapter沒有設(shè)置order屬性的時(shí)候,order屬性的默認(rèn)值都是Integer.MAX_VALUE,即優(yōu)先級(jí)最低。 
總結(jié):    如果配置了,又配置了自定義的RequestMappingHandlerAdapter,并且沒有設(shè)置RequestMappingHandlerAdapter的order值,那么這2個(gè)RequestMappingHandlerAdapter的order值都是Integer.MAX_VALUE。那么誰先定義的,誰優(yōu)先級(jí)高。 配置在自定義的RequestMappingHandlerAdapter配置之前,那么配置的RequestMappingHandlerAdapter優(yōu)先級(jí)高,反之自定義的RequestMappingHandlerAdapter優(yōu)先級(jí)高。

如果配置了,又配置了自定義的RequestMappingHandlerMapping,并且沒有設(shè)置RequestMappingHandlerMapping的order值。那么配置的RequestMappingHandlerMapping優(yōu)先級(jí)高,因?yàn)?mvc:annotation-driven />內(nèi)部會(huì)設(shè)置RequestMappingHandlerMapping的order為0。

四、應(yīng)用
1、定義接口

import java.util.Map;
import org.springframework.core.Ordered;

public interface Filter extends Ordered{
    public void doFiler(Map prams);

}

2、實(shí)現(xiàn)接口

import java.util.Map;
@Component
public class LogFilter implements Filter {
    private int order =1;
    public int getOrder() {
        return order;
    }
    public void setOrder(int order) {
        this.order = order;
    }
    public void doFiler(Map prams) {
        System.out.println("打印日志");
    }
}

import java.util.Map;
@Component
public class PowerLogFilter implements Filter {
    private int order =2;
    public int getOrder() {
        return order;
    }
    public void setOrder(int order) {
        this.order = order;
    }
    public void doFiler(Map prams) {
        System.out.println("權(quán)限控制");
    }
}

3、測(cè)試進(jìn)行排序

public static void main(String[] args) throws Exception {
String config = Test.class.getPackage().getName().replace(".", "/") + "/bean.xml";
   ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
   context.start();
   Map filters = context.getBeansOfType(Filter.class);
    System.out.println(filters.size());
   List f= new ArrayList(filters.values());
   OrderComparator.sort(f);
   for(int i=0; i params = new HashMap();
       f.get(i).doFiler(params);
   }
}

4、配置文件





喜歡就關(guān)注我

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70813.html

相關(guān)文章

  • SpringMVC源碼分析--ViewResolver(二)

    摘要:概述上篇學(xué)習(xí)了視圖解析器作用及處理流程,為我們提供了豐富的視圖解析器見下圖本系列文章是基于。該視圖解析器是根據(jù)處理器返回的邏輯視圖名稱,在應(yīng)用上下文中查找該名稱的視圖對(duì)象視圖對(duì)象就是的對(duì)象。 概述 上篇學(xué)習(xí)了Spring MVC ViewResolver視圖解析器作用及處理流程,Spring為我們提供了豐富的視圖解析器(見下圖):showImg(https://segmentfault...

    jas0n 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(三)

    摘要:概述本節(jié)學(xué)習(xí)下的功能,簡(jiǎn)單來說,該類的作用就是把多個(gè)視圖解析器進(jìn)行組裝,內(nèi)部使用存儲(chǔ)配置使用的視圖解析器。總結(jié)本章介紹了類,根據(jù)測(cè)試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節(jié)學(xué)習(xí)下ViewResolverComposite的功能,簡(jiǎn)單來說,該類的作用就是把多個(gè)ViewResolver視圖解析器進(jìn)行組裝,內(nèi)部使用list存儲(chǔ)配置使用的視圖解析器。 本系列文章是基于Spri...

    fox_soyoung 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(六)

    摘要:與一樣,該類繼承抽象類,并且通過外部的屬性文件定義邏輯視圖名稱與真正的視圖對(duì)象的關(guān)系,屬性文件默認(rèn)是下的,可以通過或?qū)傩詠碇付?,該屬性指的是文件的基名稱,也就是說以屬性值開頭的屬性文件。 概述 本章再學(xué)習(xí)另外兩個(gè)ViewResolver,分別是XmlViewResolver和ResourceBundleViewResolver,從功能上說,這兩個(gè)視圖解析器都是從外部資源文件中查找視圖V...

    alighters 評(píng)論0 收藏0
  • Spring Boot啟動(dòng)過程及回調(diào)接口匯總

    摘要:創(chuàng)建及準(zhǔn)備創(chuàng)建。目前已知關(guān)心這個(gè)事件的有要注意的是在這個(gè)階段,里只有,是的加載工作的起點(diǎn)。原因是注入這些回調(diào)接口本身沒有什么意義。在其構(gòu)造函數(shù)內(nèi)部間接的給注冊(cè)了幾個(gè)與相關(guān)注解的處理器。 相關(guān)代碼在: https://github.com/chanjarster/spring-boot-all-callbacks 注:本文基于spring-boot 1.4.1.RELEASE, spri...

    Taonce 評(píng)論0 收藏0
  • 3分鐘干貨對(duì)spring進(jìn)行定制化功能擴(kuò)展

    摘要:與的區(qū)別是處理的對(duì)象不同,是對(duì)進(jìn)行處理,是對(duì)進(jìn)行處理。可以在初始化完成,所有屬性設(shè)置完成后執(zhí)行特定邏輯,例如對(duì)自動(dòng)裝配對(duì)屬性進(jìn)行驗(yàn)證等等。用于在被銷毀前執(zhí)行特定的邏輯,例如做一些回收工作等。用來監(jiān)聽的標(biāo)準(zhǔn)應(yīng)用事件或者自定義事件。 可以選擇如下一些擴(kuò)展點(diǎn): ▌1.BeanFactoryPostProcessor是beanFactory后置處理器,支持在bean factory標(biāo)準(zhǔn)初始化完...

    changfeng1050 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<