今天在看Springsecurity(4.3.x.RELEASE)的WebSecurityConfiguration时,看到AnnotationAwareOrderComparator,就写下自己的感受...List-1 private static class AnnotationAwareOrderComparator extends OrderComparator { private static...final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator(); @Override...) { return order.value(); } } return Ordered.LOWEST_PRECEDENCE; } } 如List-1所示,AnnotationAwareOrderComparator
>) value); } } } AnnotationAwareOrderComparator AnnotationAwareOrderComparator继承自OrderComparator...@Order注解@since 2.0,AnnotationAwareOrderComparator它@since 2.0.1,几乎同时出现的 它提供了两个静态方法,使用非常广泛,方便我们对数组、即可记性排序...: public class AnnotationAwareOrderComparator extends OrderComparator { /** * 用来检查实现Ordered接口、@Order
AutowiredWebSecurityConfigurersIgnoreParents( beanFactory).getWebSecurityConfigurers(); webSecurityConfigurers.sort(AnnotationAwareOrderComparator.INSTANCE...for (SecurityConfigurer config : webSecurityConfigurers) { Integer order = AnnotationAwareOrderComparator.lookupOrder...classLoader) { this.beanClassLoader = classLoader; } /** * A custom version of the Spring provided AnnotationAwareOrderComparator...* * @author Rob Winch * @since 3.2 */ private static class AnnotationAwareOrderComparator extends...OrderComparator { private static final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator
现在通过注解驱动的排序策略,配合AnnotationAwareOrderComparator比较器,实现了声明式顺序控制。...@Order的解析由AnnotationAwareOrderComparator完成,这个比较器会在Bean初始化阶段介入,通过反射获取Bean定义或实例上的@Order注解值进行排序。...Spring Boot内部使用AnnotationAwareOrderComparator进行排序时,会先处理显式依赖关系,再考虑order数值。...源码解析:AnnotationAwareOrderComparator 在Spring框架的核心机制中,Bean加载顺序的控制是一个精妙而复杂的过程,而AnnotationAwareOrderComparator...核心类继承关系 AnnotationAwareOrderComparator继承自OrderComparator,而OrderComparator又实现了Comparator接口。
org.springframework.cloud.gateway.route.Route; import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAwareOrderComparator...AnnotationAwareOrderComparator.sort(combined); if (logger.isDebugEnabled()) { logger.debug("Sorted
(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {...beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE); }
AnnotationAwareOrderComparator.sort(combined); logger.debug("Sorted gatewayFilterFactories:...false); ArrayList mappings = new ArrayList(mappingBeans.values()); AnnotationAwareOrderComparator.sort...HandlerAdapter.class, true, false); this.handlerAdapters = new ArrayList(adapterBeans.values()); AnnotationAwareOrderComparator.sort...HandlerResultHandler.class, true, false); this.resultHandlers = new ArrayList(beans.values()); AnnotationAwareOrderComparator.sort
webSecurity.debug(debugEnabled); } Collections.sort(webSecurityConfigurers, AnnotationAwareOrderComparator.INSTANCE...SecurityConfigurer config : webSecurityConfigurers) { Integer order = AnnotationAwareOrderComparator.lookupOrder...* * @author Rob Winch * @since 3.2 */ private static class AnnotationAwareOrderComparator...extends OrderComparator { private static final AnnotationAwareOrderComparator INSTANCE = new...AnnotationAwareOrderComparator(); @Override protected int getOrder(Object obj)
CompositePropertySource( BOOTSTRAP_PROPERTY_SOURCE_NAME); //对propertySourceLocators数组进行排序,根据默认的AnnotationAwareOrderComparator...AnnotationAwareOrderComparator.sort(this.propertySourceLocators); boolean empty = true...根据默认的 AnnotationAwareOrderComparator 排序规则对propertySourceLocators数组进行排序 获取运行的环境上下文ConfigurableEnvironment
> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); AnnotationAwareOrderComparator.sort...instantiate " + type + " : " + name, ex); } } return instances; } 实例化的过程如果,没有什么特别需要讲解的; 上面有个方法AnnotationAwareOrderComparator.sort
> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); AnnotationAwareOrderComparator.sort...ApplicationRunner.class).values()); runners.addAll(context.getBeansOfType(CommandLineRunner.class).values()); AnnotationAwareOrderComparator.sort
filters.addAll(loadGatewayFilters(routeDefinition.getId(), routeDefinition.getFilters())); } AnnotationAwareOrderComparator.sort...} } return ordered; } getFilters主要是利用loadGatewayFilters获取filter,返回使用AnnotationAwareOrderComparator
= null) { // AnnotationAwareOrderComparator:这是一个带有注解感知的比较器,用来排序Bean的依赖 // 它比标准的比较器多了对...(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) { beanFactory.setDependencyComparator...(AnnotationAwareOrderComparator.INSTANCE); } // ContextAnnotationAutowireCandidateResolver:...volatile List beanDefinitionNames = new ArrayList(256); ... } 获取到默认Bean工厂以后,设置了两个重要属性 AnnotationAwareOrderComparator
最后调用AnnotationAwareOrderComparator进行排序。 List-3 private Collection<ApplicationListener<?...} } catch (NoSuchBeanDefinitionException var13) { } } } AnnotationAwareOrderComparator.sort
asUnmodifiableOrderedSet(Collection elements) { List list = new ArrayList(elements); list.sort(AnnotationAwareOrderComparator.INSTANCE...); return new LinkedHashSet(list);}注意看 asUnmodifiableOrderedSet 方法中的 AnnotationAwareOrderComparator
(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) { beanFactory.setDependencyComparator...(AnnotationAwareOrderComparator.INSTANCE); } if (!
(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) { //注册了实现Order...接口的排序器 beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE); } //设置
, false); ArrayList mappings = new ArrayList(mappingBeans.values()); AnnotationAwareOrderComparator.sort...HandlerAdapter.class, true, false); this.handlerAdapters = new ArrayList(adapterBeans.values()); AnnotationAwareOrderComparator.sort...HandlerResultHandler.class, true, false); this.resultHandlers = new ArrayList(beans.values()); AnnotationAwareOrderComparator.sort
(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) { beanFactory.setDependencyComparator...(AnnotationAwareOrderComparator.INSTANCE); } // 2.指定容器使用的AutowireCandidateResolver...return beanDefs; } 上面这段代码,主要做了8件事,接下来我们就详细看看 指定容器使用的比较器,通过这个比较器能够解析@Order注解以及Ordered接口 指定容器中使用的比较器为AnnotationAwareOrderComparator...OrderComparator自身提供了对Ordered接口的处理功能,而AnnotationAwareOrderComparator进一步做了扩展,除了会处理Ordered接口外还会处理@Order注解
instances = this.createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); AnnotationAwareOrderComparator.sort