Spring框架就像一个大工厂,里面有各种各样的零件(接口实现类)协同工作。有时,多个零件都想抢着先干活,这就需要有个规则来安排它们的出场顺序。Spring提供了一个Ordered
接口,专门用来解决这个问题,让零件们排排坐,按顺序来。
Ordered
接口初探
Ordered
接口就像工厂里的排号机,每个零件(实现类)都可以通过它领取一个号码,号码越小,优先级越高,越早被调用。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
public interface Ordered {
int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; // 最高优先级,号码最小
int LOWEST_PRECEDENCE = Integer.MAX_VALUE; // 最低优先级,号码最大
int getOrder(); // 获取零件的号码
}
getOrder()
方法就是零件去排号机领号码的地方,返回一个整数,代表它的优先级。HIGHEST_PRECEDENCE
和LOWEST_PRECEDENCE
分别代表最高和最低优先级,就像VIP通道和普通通道。
OrderComparator
:号码牌的裁判
光有排号机还不够,还需要一个裁判来根据号码牌安排零件的出场顺序。OrderComparator
就是这个裁判,它实现了Comparator
接口,可以比较两个零件的优先级。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
public class OrderComparator implements Comparator<Object> {
// ... (其他代码) ...
public int compare(Object o1, Object o2) {
// ... (比较逻辑) ...
}
}
compare
方法就像裁判的判决书,根据两个零件的号码牌(getOrder()
返回值)决定它们的先后顺序。
PriorityOrdered
:插队的小能手
有些零件比较特殊,就像有特权一样,可以插队。PriorityOrdered
接口就是为这些特殊零件准备的。实现了PriorityOrdered
接口的零件,优先级比只实现了Ordered
接口的零件更高,就像VIP会员可以插队一样。
Spring MVC中的Ordered
实战
在Spring MVC中,RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
都实现了Ordered
接口。<mvc:annotation-driven/>
会默认配置这两个类,如果我们自己也配置了这两个类,就会出现两个同类型的零件。这时,Ordered
接口就派上用场了,Spring会根据它们的order
值来决定哪个先用。
自定义Ordered
接口示例
假设我们有两个过滤器,LogFilter
和PowerLogFilter
,分别用于打印日志和权限控制。我们希望先打印日志,再进行权限控制,就可以使用Ordered
接口来实现。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
// Filter接口
public interface Filter extends Ordered {
void doFilter(Map<String, String> params);
}
// LogFilter
@Component
public class LogFilter implements Filter {
private int order = 1; // 设置优先级为1
// ... (其他代码) ...
}
// PowerLogFilter
@Component
public class PowerLogFilter implements Filter {
private int order = 2; // 设置优先级为2
// ... (其他代码) ...
}
// 测试代码
// ... (获取所有Filter,并使用OrderComparator排序) ...
通过设置order
值,我们就可以控制过滤器的执行顺序了。
温馨提示
order
值越小,优先级越高。如果没有设置 order
值,默认值是LOWEST_PRECEDENCE
,也就是最低优先级。PriorityOrdered
接口的优先级高于Ordered
接口。
总结
Ordered
接口就像Spring工厂里的排号机,可以控制零件的执行顺序。OrderComparator
是根据号码牌进行排序的裁判,PriorityOrdered
接口可以让零件插队。在Spring MVC等场景中,Ordered
接口可以有效解决多个同类型零件的优先级问题。