下面列出了怎么用org.springframework.core.OrderComparator的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void testMultiplePerTargetAspectsWithOrderAnnotation() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean();
int realAge = 65;
target.setAge(realAge);
List<Advisor> advisors = new LinkedList<>();
PerTargetAspectWithOrderAnnotation10 aspect1 = new PerTargetAspectWithOrderAnnotation10();
aspect1.count = 100;
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspectWithOrderAnnotation5 aspect2 = new PerTargetAspectWithOrderAnnotation5();
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
Collections.sort(advisors, new OrderComparator());
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class);
assertEquals("Around advice must NOT apply", realAge, itb.getAge());
// Hit the method in the per clause to instantiate the aspect
itb.getSpouse();
assertEquals("Around advice must apply", 0, itb.getAge());
assertEquals("Around advice must apply", 1, itb.getAge());
}
@Test
public void testMultiplePerTargetAspectsWithOrderAnnotation() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean();
int realAge = 65;
target.setAge(realAge);
List<Advisor> advisors = new LinkedList<>();
PerTargetAspectWithOrderAnnotation10 aspect1 = new PerTargetAspectWithOrderAnnotation10();
aspect1.count = 100;
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspectWithOrderAnnotation5 aspect2 = new PerTargetAspectWithOrderAnnotation5();
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
Collections.sort(advisors, new OrderComparator());
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class);
assertEquals("Around advice must NOT apply", realAge, itb.getAge());
// Hit the method in the per clause to instantiate the aspect
itb.getSpouse();
assertEquals("Around advice must apply", 0, itb.getAge());
assertEquals("Around advice must apply", 1, itb.getAge());
}
@Test
public void testMultiplePerTargetAspectsWithOrderAnnotation() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean();
int realAge = 65;
target.setAge(realAge);
List<Advisor> advisors = new LinkedList<Advisor>();
PerTargetAspectWithOrderAnnotation10 aspect1 = new PerTargetAspectWithOrderAnnotation10();
aspect1.count = 100;
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspectWithOrderAnnotation5 aspect2 = new PerTargetAspectWithOrderAnnotation5();
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
Collections.sort(advisors, new OrderComparator());
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class);
assertEquals("Around advice must NOT apply", realAge, itb.getAge());
// Hit the method in the per clause to instantiate the aspect
itb.getSpouse();
assertEquals("Around advice must apply", 0, itb.getAge());
assertEquals("Around advice must apply", 1, itb.getAge());
}
@Override
public List<Node> getChildren()
{
if ( sortedChildren == null )
{
final int size = children == null ? 0 : children.size();
if ( size > 1 )
{
List<Node> clone = Lists.newArrayList( children );
Collections.sort( clone, OrderComparator.INSTANCE );
sortedChildren = ImmutableList.copyOf( clone );
}
else if ( size == 1 )
{
sortedChildren = ImmutableList.of( children.get( 0 ) );
}
else
{
sortedChildren = ImmutableList.of();
}
}
return sortedChildren;
}
@Test
public void testMultiplePerTargetAspects() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean();
int realAge = 65;
target.setAge(realAge);
List<Advisor> advisors = new LinkedList<>();
PerTargetAspect aspect1 = new PerTargetAspect();
aspect1.count = 100;
aspect1.setOrder(10);
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspect aspect2 = new PerTargetAspect();
aspect2.setOrder(5);
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
Collections.sort(advisors, new OrderComparator());
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class);
assertEquals("Around advice must NOT apply", realAge, itb.getAge());
// Hit the method in the per clause to instantiate the aspect
itb.getSpouse();
assertEquals("Around advice must apply", 0, itb.getAge());
assertEquals("Around advice must apply", 1, itb.getAge());
}
/**
* Register member (nested) classes that happen to be configuration classes themselves.
*/
private void processMemberClasses(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
Collection<SourceClass> memberClasses = sourceClass.getMemberClasses();
if (!memberClasses.isEmpty()) {
List<SourceClass> candidates = new ArrayList<>(memberClasses.size());
for (SourceClass memberClass : memberClasses) {
if (ConfigurationClassUtils.isConfigurationCandidate(memberClass.getMetadata()) &&
!memberClass.getMetadata().getClassName().equals(configClass.getMetadata().getClassName())) {
candidates.add(memberClass);
}
}
OrderComparator.sort(candidates);
for (SourceClass candidate : candidates) {
if (this.importStack.contains(configClass)) {
this.problemReporter.error(new CircularImportProblem(configClass, this.importStack));
}
else {
this.importStack.push(configClass);
try {
processConfigurationClass(candidate.asConfigClass(configClass));
}
finally {
this.importStack.pop();
}
}
}
}
}
private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {
Comparator<Object> comparatorToUse = null;
if (beanFactory instanceof DefaultListableBeanFactory) {
comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
}
if (comparatorToUse == null) {
comparatorToUse = OrderComparator.INSTANCE;
}
postProcessors.sort(comparatorToUse);
}
@Nullable
private Comparator<Object> adaptDependencyComparator(Map<String, ?> matchingBeans) {
Comparator<Object> comparator = getDependencyComparator();
if (comparator instanceof OrderComparator) {
return ((OrderComparator) comparator).withSourceProvider(
createFactoryAwareOrderSourceProvider(matchingBeans));
}
else {
return comparator;
}
}
/**
* 动态添加拦截器
* @param interceptor 拦截器
* @param order 排序
* @param includeURLs 需要拦截的URL
* @param excludeURLs 排除拦截的URL
* @param handlerMapping AbstractHandlerMapping实现类
*/
@SuppressWarnings("all")
public static void addDynamicInterceptor(HandlerInterceptor interceptor, int order, List<String> includeURLs, List<String> excludeURLs, AbstractHandlerMapping handlerMapping) {
String[] include = StringUtils.toStringArray(includeURLs);
String[] exclude = StringUtils.toStringArray(excludeURLs);
// HandlerInterceptor -> MappedInterceptor -> HydrogenMappedInterceptor
HydrogenMappedInterceptor hmi = new HydrogenMappedInterceptor(new MappedInterceptor(include, exclude, interceptor));
// 内部的处理流程会设置,然而不是最终采纳的拦截器列表
// handlerMapping.setInterceptors(mappedInterceptor);
hmi.setOrder(order);
try {
findAdaptedInterceptorsField(handlerMapping);
// 添加到可采纳的拦截器列表,让拦截器处理器Chain流程获取得到这个拦截器
List<HandlerInterceptor> handlerInterceptors = (List<HandlerInterceptor>) adaptedInterceptorsField.get(handlerMapping);
// 过滤添加过的拦截器
boolean mapped = handlerInterceptors.stream().anyMatch(itor -> {
// 只判断HydrogenMappedInterceptor拦截器类型
if (itor instanceof HydrogenMappedInterceptor) {
return itor.equals(hmi);
}
return false;
});
if (mapped) {
return;
}
handlerInterceptors.add(hmi);
// 仿Spring MVC源码对拦截器排序
handlerInterceptors = handlerInterceptors.stream()
.sorted(OrderComparator.INSTANCE.withSourceProvider(itor -> {
if (itor instanceof HydrogenMappedInterceptor) {
return (Ordered) ((HydrogenMappedInterceptor) itor)::getOrder;
}
return null;
})).collect(Collectors.toList());
adaptedInterceptorsField.set(handlerMapping, handlerInterceptors);
} catch (Exception e) {
log.error("SpringMvcPolyfill invoke AbstractHandlerMapping.adaptedInterceptors error with msg: {}", e.getMessage(), e);
}
}
@Test
public void testMultiplePerTargetAspects() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean();
int realAge = 65;
target.setAge(realAge);
List<Advisor> advisors = new LinkedList<>();
PerTargetAspect aspect1 = new PerTargetAspect();
aspect1.count = 100;
aspect1.setOrder(10);
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspect aspect2 = new PerTargetAspect();
aspect2.setOrder(5);
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
Collections.sort(advisors, new OrderComparator());
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class);
assertEquals("Around advice must NOT apply", realAge, itb.getAge());
// Hit the method in the per clause to instantiate the aspect
itb.getSpouse();
assertEquals("Around advice must apply", 0, itb.getAge());
assertEquals("Around advice must apply", 1, itb.getAge());
}
/**
* Register member (nested) classes that happen to be configuration classes themselves.
*/
private void processMemberClasses(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
Collection<SourceClass> memberClasses = sourceClass.getMemberClasses();
if (!memberClasses.isEmpty()) {
List<SourceClass> candidates = new ArrayList<>(memberClasses.size());
for (SourceClass memberClass : memberClasses) {
if (ConfigurationClassUtils.isConfigurationCandidate(memberClass.getMetadata()) &&
!memberClass.getMetadata().getClassName().equals(configClass.getMetadata().getClassName())) {
candidates.add(memberClass);
}
}
OrderComparator.sort(candidates);
for (SourceClass candidate : candidates) {
if (this.importStack.contains(configClass)) {
this.problemReporter.error(new CircularImportProblem(configClass, this.importStack));
}
else {
this.importStack.push(configClass);
try {
processConfigurationClass(candidate.asConfigClass(configClass));
}
finally {
this.importStack.pop();
}
}
}
}
}
private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {
Comparator<Object> comparatorToUse = null;
if (beanFactory instanceof DefaultListableBeanFactory) {
comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
}
if (comparatorToUse == null) {
comparatorToUse = OrderComparator.INSTANCE;
}
postProcessors.sort(comparatorToUse);
}
@Nullable
private Comparator<Object> adaptDependencyComparator(Map<String, ?> matchingBeans) {
Comparator<Object> comparator = getDependencyComparator();
if (comparator instanceof OrderComparator) {
return ((OrderComparator) comparator).withSourceProvider(
createFactoryAwareOrderSourceProvider(matchingBeans));
}
else {
return comparator;
}
}
@Test
public void predicateFilterAfterRegistryFilter() {
SocketAcceptorFilter predicateFilter = new SocketAcceptorPredicateFilter(
Collections.emptyList());
SocketAcceptorFilter registryFilter = new RoutingTableSocketAcceptorFilter(
mock(RoutingTable.class));
List<SocketAcceptorFilter> filters = Arrays.asList(predicateFilter,
registryFilter);
OrderComparator.sort(filters);
assertThat(filters).containsExactly(registryFilter, predicateFilter);
}
private void initGrayInfoTrackers(List<GrayInfoTracker<? extends GrayTrackInfo, ?>> trackers) {
if (trackers == null) {
return;
}
OrderComparator.sort(trackers);
this.trackers = trackers;
}
private void putTypeAllTo(Map<String, List<RequestInterceptor>> requestInterceptorMap, List<RequestInterceptor> all) {
if (all.isEmpty()) {
return;
}
requestInterceptorMap.values().forEach(list -> {
list.addAll(all);
OrderComparator.sort(list);
});
}
private void apply(GenericApplicationContext context) {
List<ApplicationContextInitializer<GenericApplicationContext>> initializers = new ArrayList<>();
for (ApplicationContextInitializer<GenericApplicationContext> result : this.initializers) {
initializers.add(result);
}
OrderComparator.sort(initializers);
if (logger.isDebugEnabled()) {
logger.debug("Applying initializers: " + initializers);
}
for (ApplicationContextInitializer<GenericApplicationContext> initializer : initializers) {
initializer.initialize(context);
}
}
/**
* Creates an {@link ApiFileNameChecker} instance based on the provided configuredApiFilename argument.
* @param configuredApiFilename the filename that is used to construct a proper instance f {@link ApiFileNameChecker}
* @return the {@link ApiFileNameChecker}
*/
public ApiFileNameChecker create(String configuredApiFilename) {
Collection<ApiFileNameChecker> checkers = new TreeSet<>(OrderComparator.INSTANCE);
checkers.add(new SwaggerApiFileNameChecker());
if (StringUtils.isNotBlank(configuredApiFilename)) {
checkers.add(new ConfigurableApiFileNameChecker(configuredApiFilename));
}
return new ApiFileNameCheckerChain(checkers);
}
private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {
Comparator<Object> comparatorToUse = null;
if (beanFactory instanceof DefaultListableBeanFactory) {
comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
}
if (comparatorToUse == null) {
comparatorToUse = OrderComparator.INSTANCE;
}
Collections.sort(postProcessors, comparatorToUse);
}
private Comparator<Object> adaptDependencyComparator(Map<String, Object> matchingBeans) {
Comparator<Object> comparator = getDependencyComparator();
if (comparator instanceof OrderComparator) {
return ((OrderComparator) comparator).withSourceProvider(
createFactoryAwareOrderSourceProvider(matchingBeans));
}
else {
return comparator;
}
}
@Test
public void testMultiplePerTargetAspects() throws SecurityException, NoSuchMethodException {
TestBean target = new TestBean();
int realAge = 65;
target.setAge(realAge);
List<Advisor> advisors = new LinkedList<Advisor>();
PerTargetAspect aspect1 = new PerTargetAspect();
aspect1.count = 100;
aspect1.setOrder(10);
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1")));
PerTargetAspect aspect2 = new PerTargetAspect();
aspect2.setOrder(5);
advisors.addAll(
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2")));
Collections.sort(advisors, new OrderComparator());
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class);
assertEquals("Around advice must NOT apply", realAge, itb.getAge());
// Hit the method in the per clause to instantiate the aspect
itb.getSpouse();
assertEquals("Around advice must apply", 0, itb.getAge());
assertEquals("Around advice must apply", 1, itb.getAge());
}
private static void sortPostProcessors(ConfigurableListableBeanFactory beanFactory, List<?> postProcessors) {
Comparator<Object> comparatorToUse = null;
if (beanFactory instanceof DefaultListableBeanFactory) {
comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
}
if (comparatorToUse == null) {
comparatorToUse = OrderComparator.INSTANCE;
}
Collections.sort(postProcessors, comparatorToUse);
}
private Comparator<Object> adaptDependencyComparator(Map<String, Object> matchingBeans) {
Comparator<Object> comparator = getDependencyComparator();
if (comparator instanceof OrderComparator) {
return ((OrderComparator) comparator).withSourceProvider(
createFactoryAwareOrderSourceProvider(matchingBeans));
}
else {
return comparator;
}
}
/**
* This method retrieves the currently configured {@link IProcessor} instances
* from our superclass, and returns them in a sorted order.
*/
@Override
protected List<IProcessor> getProcessors() {
List<IProcessor> result = new ArrayList<IProcessor>(super.getProcessors());
result.sort(new OrderComparator());
return result;
}
static void startContext() {
if (started)
return;
started = true;
listeners.sort(new OrderComparator());
for (Listener listener : listeners) {
listener.applicationStarted();
}
Events events = (Events) getApplicationContext().getBean(Events.NAME);
events.publish(new AppContextStartedEvent(context));
listenersNotified = true;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, BeforeCommitTransactionListener> beforeCommitMap = applicationContext.getBeansOfType(BeforeCommitTransactionListener.class);
beforeCommitTxListeners = new ArrayList<>(beforeCommitMap.values());
beforeCommitTxListeners.sort(new OrderComparator());
Map<String, AfterCompleteTransactionListener> afterCompleteMap = applicationContext.getBeansOfType(AfterCompleteTransactionListener.class);
afterCompleteTxListeners = new ArrayList<>(afterCompleteMap.values());
afterCompleteTxListeners.sort(new OrderComparator());
}
@Override
public List<Schema> getSortedSchemas()
{
List<Schema> schemas = Lists.newArrayList( classSchemaMap.values() );
schemas.sort( OrderComparator.INSTANCE );
return schemas;
}
@Override
public List<Schema> getMetadataSchemas()
{
List<Schema> schemas = getSchemas();
schemas.removeIf( schema -> !schema.isMetadata() );
schemas.sort( OrderComparator.INSTANCE );
return schemas;
}
@Override
protected void detectMappedInterceptors(List<HandlerInterceptor> mappedInterceptors) {
super.detectMappedInterceptors(mappedInterceptors);
CUtils.stripNull(mappedInterceptors);
Collections.sort(mappedInterceptors, new Comparator<HandlerInterceptor>() {
@Override
public int compare(HandlerInterceptor o1, HandlerInterceptor o2) {
return OrderComparator.INSTANCE.compare(o1, o2);
}
});
}
public void register(ScoringAgent agent, boolean isDefault) {
if (agent == null) {
throw new RuntimeException("can't register a null agent");
}
if (agent.getAgentId() == null) {
throw new RuntimeException("the scoring agentId is null");
}
scoringAgentMap.put(agent.getAgentId(), agent);
sortedScoringAgents = new ArrayList<ScoringAgent>(scoringAgentMap.values());
Collections.sort(sortedScoringAgents, new OrderComparator());
if (isDefault) {
defaultScoringAgent = agent;
}
}